【Spring】认识 IoC 容器和 Servlet 容器

认识 IoC 容器和 Servlet 容器

  • 1.认识容器
    • 1.1 IoC 容器
    • 1.2 loC 的实现方法
      • 1.2.1 依赖注入
      • 1.2.2 依赖查找
    • 1.3 认识 Servlet 容器
  • 2.用 IoC 管理 Bean
    • 2.1 创建一个 Bean
    • 2.2 编写 User 的配置类
    • 2.3 编写测试类
  • 3.用 Servlet 处理请求
    • 3.1 注册 Servlet 类
    • 3.2 开启 Servlet 支持

1.认识容器

1.1 IoC 容器

loC(Inversion of Control)容器,是面向对象编程中的一种设计原则,意为 控制反转(也被称为 控制反向控制倒置)。它将程序中创建对象的控制权交给 Spring 框架来管理,以便降低计算机代码之间的耦合度。

控制反转的实质是 获得依赖对象的过程 被反转了。这个过程由自身管理变为由 loC 容器主动注入。这正是 loC 实现的方式之一:依赖注入dependency injectionDI),由 loC 容器在运行期间动态地将某种依赖关系注入对象之中。

在传统编程方式中,要实现某种功能一般都需要几个对象相互作用。在主对象中要保存其他类型对象的引用,以便在主对象中实例化对象,然后通过调用这些引用的方法来完成任务,其运行方式如下图所示。
在这里插入图片描述
而 IoC 容器是在主对象中设置 Setter 方法,通过调用 Setter 方法或构造方法传入所需引用(即依赖注入),如下图所示。
在这里插入图片描述
要使用某个对象,只需要从 IoC 容器中获取需要使用的对象,不需要关心对象的创建过程,即把创建对象的控制权反转给了 Spring 框架。

1.2 loC 的实现方法

loC 的实现方法主要有两种:依赖注入依赖查找

1.2.1 依赖注入

在软件设计中,依赖 指的是一个类需要调用的其他类或者服务,而 注入 则是指将这些所需的类或服务传递给需要它们的类的过程。使用 依赖注入 技术,我们可以在运行时将依赖关系传递给对象,而不是让对象自己去创建或查找它们需要的依赖。

如此,则软件中的组件可以在不同环境下重复使用,就像家里的电器可以随意在不同的插座上使用一样,不用担心它们的电源问题。依赖注入 让我们的代码更加灵活,更容易维护和扩展。

在这里插入图片描述

loC 容器通过类型或名称等信息将不同对象注入不同属性中。组件不做定位查询,只提供普通的 Java 方法让容器去决定依赖关系。这是最流行的 loC 方法。依赖注入主要有以下几种方式。

  • 设值注入setter injection):让 loC 容器调用注入所依赖类型的对象。
  • 接口注入interface injection):实现特定接口,以供 loC 容器注入所依赖类型的对象。
  • 构造注入constructor injection):实现特定参数的构造函数,在创建对象时让 loC 容器注入所依赖类型的对象。
  • 基于注解:通过 Java 的注解机制让 loC 容器注入所依赖类型的对象,例如,使用 @Autowired。

loC 是通过第三方容器来管理并维护这些被依赖对象的,应用程序只需要接收并使用 IoC 容器注入的对象。

1.2.2 依赖查找

在传统实现中,需要用户使用 API 来管理依赖的创建、查找资源和组装对象。这会对程序有侵入性。

依赖查找 则通过调用容器提供的 回调接口上下文环境 来获取对象,在获取时需要提供相关的配置文件路径、key 等信息来确定获取对象的状态。依赖查找通常有两个方法:依赖拖拽DP)和 上下文依赖查找CDL)。

1.3 认识 Servlet 容器

Servlet 是在 javax.servlet 包中定义的一个接口。在开发 Spring Boot 应用程序时,使用 Controller 基本能解决大部分的功能需求。但有时也需要使用 Servlet,比如实现 拦截监听 功能。Spring Boot 的核心控制器 DispatcherServlet 会处理所有的请求。如果自定义 Servlet,则需要进行注册,以便 DispatcherServlet 核心控制器知道它的作用,以及处理请求 url-pattern

2.用 IoC 管理 Bean

2.1 创建一个 Bean

创建一个名为 User 的 Bean。

@Data
public class User implements Serializable {private int id;private String name;}

2.2 编写 User 的配置类

编写配置类,并实例化一个对象。

@Configuration
public class UserConfig {//将此返回的值生成一个bean@Bean("user1")public User user() {User user = new User();user.setId(1);user.setName("pipi");return user;}
}
  • @Confguration:用于标注配置类,让 Spring 来加载该类配置作为 Bean 的载体。在运行时,将为这些 Bean 生成 BeanDefinition 和服务请求。
  • @Bean:产生一个 Bean,并交给 Spring 管理。目的是封装用户、数据库中的数据,一般有 Setter、Getter 方法。

2.3 编写测试类

下面实例化一个 User 对象,然后通过上下文获取 Bean 对象 user1

@RunWith(SpringRunner.class)
@SpringBootTest
public class IocTest {@Autowiredprivate ApplicationContext applicationContext;@Testpublic void testIoc() {User user = (User) applicationContext.getBean("user1");System.out.println(user);}
}
  • @RunWith(SpringRunner.class):让测试运行于 Spring 测试环境。
  • @SpringBootTest:Spring Boot 用于测试的注解,可指定入口类或测试环境等。
  • @Test:一个测试方法。
  • ApplicationContext:获取 Spring 容器中已初始化的 Bean,这里是 user1

运行 testIoC 方法,在控制台输出以下结果:

在这里插入图片描述

3.用 Servlet 处理请求

使用 Servlet 处理请求,可以直接通过注解 @WebServlet(urlPattern,descript) 注册 Servlet,然后在入口类中添加注解@ServletComponentScan,以扫描该注解指定包下的所有 Servlet。

3.1 注册 Servlet 类

package com.example.demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** Description: 添加注解进行修饰*/
@WebServlet(urlPatterns = "/ServletDemo02/*")
public class ServletDemo02 extends HttpServlet{/*** Description:* 重写doGet方法,父类的HttpServlet的doGet方法是空的,没有实现任何代码,子类需要重写此方法。*客户使用GET方式请求Servlet时,Web容器调用doGet方法处理请求。*/@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doGet");resp.getWriter().print("Servlet ServletDemo02");}
}
  • @WebServlet(urlPatterns = “/ServletDemo02/*”):属性 urlPatterns 指定 WebServlet 的作用范围,这里代表 ServletDemo02 下的所有子路径。
  • doGet:父类 HttpServlet 的 doGet 方法是空的,没有实现任何代码,子类需要重写此方法。

3.2 开启 Servlet 支持

在入口类上添加注解 @ServletComponentScan,以使 Servlet 生效。

package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;@ServletComponentScan
@SpringBootApplication
public class ServletDemoApplication {public static void main(String[] args) {SpringApplication.run(ServletDemoApplication.class, args);}
}
  • @ServletComponentScan:组件扫描,可自动发现和装配一些 Bean,并根据定义的扫描路径构符合扫描规则的类装配到 Spring 容器中。
  • @SpringBootApplication:入口类 Application 的启动注解。

在运行程序后,使用 GET 方法访问 http://localhost:8080/ServletDemo02/*,会返回重写 doGET 方法的值:

在这里插入图片描述
同时,控制台会输出 doGet 里定义的值:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/841531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣:1738. 找出第 K 大的异或坐标值

1738. 找出第 K 大的异或坐标值 给你一个二维矩阵 matrix 和一个整数 k &#xff0c;矩阵大小为 m x n 由非负整数组成。 矩阵中坐标 (a, b) 的 值 可由对所有满足 0 < i < a < m 且 0 < j < b < n 的元素 matrix[i][j]&#xff08;下标从 0 开始计数&…

线程间通信和进程间通信

线程间通信 #include <iostream> #include <thread> #include <queue> #include <mutex> #include <condition_variable> #include <chrono>// 全局变量 std::queue<int> data_queue; std::mutex mtx; std::condition_variable cv_…

启动小程序F12窗口管理器

如何使用小程序F12任务窗口管理器教学流程 一、引言 小程序的开发者们&#xff0c;是否希望有一款工具能帮助你们更好地管理任务窗口&#xff1f; 二、前置准备 观看视频教程 访问B站视频链接&#xff1a;https://www.bilibili.com/video/BV1aa4y197UU/?spm_id_from333.9…

晶圆厂的PE转客户工程师前景怎么样?

知识星球&#xff08;星球名&#xff1a; 芯片制造与封测技术社区&#xff0c;星球号&#xff1a; 63559049&#xff09;里的学员问&#xff1a; 目前在晶圆厂做PE&#xff0c;倒班oncall压力太大把身体搞坏了&#xff0c;现在有一个design house的CE客户工程师的offer&…

java网络:过滤器修改请求头

目录 一、gateway的全局过滤器 二、web的OncePerRequestFilter以及常见过滤器Filter 三、过滤器排序 一、gateway的全局过滤器 Component Slf4j public class GatewayAuthFilter implements GlobalFilter, Ordered {Overridepublic Mono<Void> filter(ServerWebExchan…

跨境选品师不是神话:普通人也能轻松掌握,开启全球贸易新篇章!

随着互联网技术的飞速发展&#xff0c;跨境电商行业已成为全球经济的新增长点。在这个背景下&#xff0c;一个新兴的职业——跨境选品师&#xff0c;逐渐走进了人们的视野。那么&#xff0c;跨境选品师究竟是做什么的?普通人又该如何成为优秀的跨境选品师呢? 一、跨境选品师的…

ABAQUS应用07-实现拉伸和压缩刚度不同的弹簧建模

文章目录 0、背景描述1、步骤 0、背景描述 到目前为止&#xff0c;本文的内容我还没有具体实践过&#xff0c;但是个人认为后期是会用到的。比如说&#xff0c;对于风电机组地基转动刚度的设置&#xff0c;土体就是一种拉压刚度并不相同的材料。所以现在先记录下来&#xff0c…

Python——字典删除键值的方法

del dict[key] # 删除dict字典里的键值

如何用Java实现SpringCloud Alibaba Sentinel的熔断功能?

在Java中使用Spring Cloud Alibaba Sentinel实现熔断功能的步骤如下&#xff1a; 添加依赖 在项目的pom.xml文件中添加Spring Cloud Alibaba Sentinel的依赖&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud…

Java进阶学习笔记24——Object类

Object类: Object类是Java中所有类的祖宗类&#xff0c;因此&#xff0c;Java中所有类的对象都可以直接使用Object类中提供的一些方法。 所有类都是Object类的子孙类。 API文档&#xff1a; Object类的成员方法&#xff1a; Object类的常见方法&#xff1a; Student类&…

Arthas反编译与重新加载class

一、背景 因为其他研发部门同事给的产品jar包存在一个问题&#xff0c;就是http底层的超时时间默认为60s&#xff0c;但是最近调用外部接口同步数据&#xff0c;这个数据量太大导致超时超过60s&#xff0c;每次同步都不成功。但是客户目前对此情况特别不满意&#xff0c;需要紧…

【路径规划】基于飞蛾搜索算法实现复杂城市地形下无人机避障三维航迹规划

研究背景 复杂城市地形下无人机避障三维航迹规划是无人机技术领域的一个重要研究方向。无人机在城市环境中的广泛应用,如快递配送、城市监测和搜救等任务,对其航迹规划和避障能力提出了挑战。 研究背景包括以下方面: 无人机的快速发展:无人机技术在近年来得到了迅猛发展…

勒索病毒的策略与建议

随着网络技术的快速发展&#xff0c;勒索病毒攻击成为全球范围内日益严重的网络安全威胁。勒索病毒通过加密用户文件或锁定系统来勒索赎金&#xff0c;给个人和企业带来了巨大的损失。因此&#xff0c;了解如何应对勒索病毒攻击至关重要。本文将概述一些有效的防范措施和应对策…

2024电工杯数学建模B题完整论文讲解(含每一问python代码+数据)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2024电工杯数学建模B题大学生平衡膳食食谱的优化设计及评价完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 …

Linux网络编程:HTTPS协议

目录 1.预备知识 1.1.加密和解密 1.2.常见加密方式 1.2.1.对称加密 1.2.2.非对称加密 ​编辑 1.3.数据摘要&#xff08;数据指纹&#xff09;和数据签名 1.4.证书 1.4.1.CA认证 1.4.2.证书和数字签名 2.HTTPS协议 2.1.自行设计HTTPS加密方案 2.1.1.只使用对称加密 …

uniapp使用uni.chooseImage选择图片后对其是否符合所需的图片大小和类型进行校验

uni.chooseImage的返回值在H5平台和其他平台的返回值有所差异&#xff0c;具体差异看下图 根据图片可以看出要想判断上传的文件类型是不能直接使用type进行判断的&#xff0c;所以我使用截取字符串的形式来判断&#xff0c;当前上传图片的后缀名是否符合所需要求。 要求&#…

驱动与系统学习网址

DRM&#xff08;Direct Rendering Manager&#xff09;学习简介-CSDN博客 Android Qcom Display学习(零)-CSDN博客 https://blog.csdn.net/hexiaolong2009/category_9705063.htmlhttps://blog.csdn.net/hexiaolong2009/category_9705063.htmlRender Hell —— 史上最通俗易懂…

区间合并-leetcode合并石头的最低成本-XMUOJ元素共鸣:深层次的唤醒

题目 思路 话不多说&#xff0c;直接上代码 附上INT_MAX和INT_MIN 【C】详解 INT_MAX 和 INT_MIN&#xff08;INT_MAX 和 INT_MIN是什么&#xff1f;它们的用途是什么&#xff1f;如何防止溢出&#xff1f;&#xff09;_c int max-CSDN博客 代码 /* leetcode合并石头的最低…

clone方法总结Java

Java中Object类当中有许多方法&#xff0c;如图所示&#xff1a; clone方法就是其中一种&#xff0c;分为浅拷贝&#xff0c;深拷贝举一个例子&#xff1a; 浅拷贝&#xff1a; 在Person类当中右键鼠标然后&#xff0c;选中Generate&#xff1a; 然后重写clone方法 protecte…

电赛之路:历年试题剖析、实战经验分享与代码资源宝典

电赛之路&#xff1a;历年试题剖析、实战经验分享与代码资源宝典 一、电赛历年试题剖析2018年试题回顾&#xff1a;智能小车2019年试题精选&#xff1a;智能家居系统 二、实战经验分享1. 团队协作的艺术2. 时间管理与迭代开发3. 代码与文档规范 三、代码程序资源推荐1. GitHub电…