【Spring IOC/DI】bean 的 5 种注册 与 5 种注入

什么是 bean

一个 bean 就是一个实例化对象

User user = new User()

上面这行代码中的 user, 就是 User 类的实例化对象,即一个 bean(User Bean)

什么是 IOC

Inversion of Control 控制反转(反转对 bean 的控制)

 spring ioc 是一个 bean 容器,我们可以将需要的 bean 放入其中

我创建我使用 变为 她创建我使用

使用 UserController 调用 UserService

我在 UserController 中 new UserService() ,我调用 userService 中的方法

她为我提供一个 new 好的 UserService 对象,我调用 userService 中的方法

我无需在意何时创建对象,何时使用对象,何时销毁对象(她来管理对象的生命周期)

我无需使用构造器 new 对象,不用关注构造器需要的参数(当构造器参数变化时,我也无需知道,我只是调用已经创建好的对象中的方法而已) 

5 种将 bean 注册进 SpringIOC 容器的方式

注册 bean 的方式分为 2 大类 5 小类

大类小类介绍

XML

注册

<bean id

        class

/>

直接类名注册

<bean id

        class

        fatory-method

/>

静态方法注册

<bean id

        factory-bean

        fatory-method

/>

实例方法注册

@

注册

@Configuration @Bean

Java-Based 注册

允许以编程方式配置 bean

@Component

@Controller

@Service @Repository

Annotation-Based 注册

将使用这类注解的类

对应的实例化对象

注册进 IOC 容器

XML注册

直接类名注册

<!--  直接注册 bean  -->
<bean id="userService" class="com.syt.UserService"
/>

静态工厂方法注册

<!--  静态工厂注册 bean  -->
<bean id="staticUserService" class="com.syt.UserServiceStaticFactory" factory-method="staticUserService"
/>
public class UserStaticFactory {public static UserService staticUserService() {return new UserService();}
}

实例工厂方法注册

<!--  实例工厂注册 bean  -->
<bean id="userServiceIntanceFactory" class="com.syt.UserServiceIntanceFactory"
/><bean id="instanceUserService" factory-bean="userServiceIntanceFactory" factory-method="instanceUserService"
/>
public class UserServiceIntanceFactory {public User intanceUserService() {return new UserService();}
}

属性初始值设置

<bean><property name value/>
</bean>
@ 注册

Annotation-Based

@Component
public class UserService {}

Java-Based

@Configuration
public class UserServiceConfiguration {@Beanpublic UserService userService() {// 这里可以对 UserService // 进行配置后// 再返回配置好的 UserService 对象return new UserService();}
}

 使用 spring 进行 @ 注册 需要在 beans 配置中配置自动包扫描路径

<context:component-scanbase-pakage
/>

 什么是 DI

Dependency Injection 依赖注入(将 bean 注入进依赖 bean 使用 bean 的类) 

获取 IOC 容器中的 bean 的方式

5 种将 bean 注入进我们自己的代码中的方式

注入 bean 的方式分为 3 大类 5 小类

大类小类介绍
属性注入@Autowired / @Resouce

在代码中添加对应 bean 属性

在 bean 属性上添加这类注解

Setter 注入@Autowired / @Resouce

在代码中添加对应 bean 属性

并且实现对应 setter 方法

在 setter 方法上添加这类注解

<bean id

        class

>

        <property

                name

                ref

        />

</bean>

使用 XML 在注册的同时注入

,也需要注册类中有

bean 属性 与 对应 setter 方法

构造方法注入@Autowired / @Resouce

在代码中添加对应 bean 属性

并且实现对应构造方法

在构造方法上添加这类注解

<bean id

        class

>

        <constructor-arg

                name

                ref

        />

</bean>

使用 XML 在注册的同时注入

,也需要注册类中有

bean 属性 与 对应 构造方法

属性注入
public class UserController {@Autowiredprivate UserService userService;
}
Setter 注入
public class UserController {private UserService userService;@Autowiredpublic void SetUserService(UserService userService) {this.userService = userService;}
}
<!--  Setter 注入  -->
<bean id="propertyUserService" class="com.syt.service.UserService"
><property name="userDao" ref="userDao"/>
</bean>
构造方法注入
public class UserController {private UserService userService;@Autowiredpublic UserController (UserService userService) {this.userService = userService;}
}
<!--构造器注入-->
<bean id="constructorUserService" class="com.syt.service.UserService"><constructor-arg name="userDao" ref="userDao" />
</bean>

补充

beans xml 配置

位置:

一般位于 resources 下,命名为 spring-config.xml 或 applicationContext.xml

基本内容

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:content="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"></beans>
spring-context 依赖

我用的 JDK 为 1.8

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.30</version>
</dependency>

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

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

相关文章

虚拟机开机字体变大,进入系统后字体模糊

问题 虚拟机开机字体变大&#xff0c;进入系统后字体模糊。 原因 虚拟机配置问题。 解决办法 修改配置为如下:

【剪枝实战】使用VGGNet训练、稀疏训练、剪枝、微调等,剪枝出只有3M的模型

摘要 本次剪枝实战是基于下面这篇论文去复现的&#xff0c;主要是实现对BN层的γ/gamma进行剪枝操作&#xff0c;本文用到的代码和数据集都可以在我的资源中免费下载到。 相关论文&#xff1a;Learning Efficient Convolutional Networks through Network Slimming (ICCV 2017…

matplotlib如何设置中文为宋体,英文为新罗马Times New Roman

问题描述 论文附图通常需要将中文设置为宋体&#xff0c;英文设置为新罗马字体&#xff08;Times New Roman&#xff09;。matplotlib中可以这样设置字体&#xff1a; plt.rcParams[font.sans-serif] [SimSun] plt.rcParams[font.sans-serif] [Times New Roman]但是这样设置…

YOLOv8_pose-Openvino和ONNXRuntime推理【CPU】

纯检测系列&#xff1a; YOLOv5-Openvino和ONNXRuntime推理【CPU】 YOLOv6-Openvino和ONNXRuntime推理【CPU】 YOLOv8-Openvino和ONNXRuntime推理【CPU】 YOLOv7-Openvino和ONNXRuntime推理【CPU】 YOLOv9-Openvino和ONNXRuntime推理【CPU】 跟踪系列&#xff1a; YOLOv5/6/7-O…

Java项目:52 springboot基于SpringBoot的旅游网站的设计与实现013

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 旅游网站主要功能如下&#xff1a; 1.用户管理&#xff1a;注册、登录、退出、修改密码&#xff1b; 2.分类显示&#xff1a;显示旅游路线的分类&am…

openstack(T)启动实例状态为错误,如何解决

---基本服务得是正常的 ---1.在web界面看是什么错误 点击你的实例名称&#xff0c;在概况里面去查看 当时我的error &#xff1a;编码500 消息 No valid host was found. 错误原因 1&#xff1a;资源不足 2&#xff1a;未开启虚拟机cpu虚拟化 解决&#xff1a; 1.资源不…

百度飞桨大模型训练营:人工智能与大语言模型

文章目录 生成式AI、提示词工程和零代码应用开发人工智能概念机器学习深度学习 大语言模型大语言模型为什么大大语言模型为什么通用大语言模型的灵魂Transformer之前Transformer的优势 Transformer内部原理第一步——数据预处理第二步——编码器第三步——解码器第四步——Line…

人工智能技术应用笔记(七):速度快一倍!低显卡用户福音来了——可本地部署的轻量级SD(Stable Diffusion Forge)

本篇为《人工智能技术应用》专栏的第七篇。希望以学习笔记的形式和大家一起了解和探索人工智能技术的实际应用。 《本地部署轻量级SD实操》 今天介绍一款在原stable diffusion webui基础上经过代码优化&#xff0c;结构重组之后的轻量级产品————Stable Diffusion WebUI For…

java-ssm-jsp基于java的校园疫情管理系统

java-ssm-jsp基于java的校园疫情管理系统 获取源码——》公主号&#xff1a;计算机专业毕设大全

前端文件流、切片下载和上传

前端文件流、切片下载和上传技术在提升文件传输效率和优化用户体验方面发挥着关键作用。这些技术不仅可以帮助解决大文件传输过程中可能遇到的问题&#xff0c;如网络超时、内存溢出等&#xff0c;还能通过并行传输和断点续传等功能&#xff0c;提高传输速度和稳定性。 一、前端…

java算法第23天 | ● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 思路&#xff1a; 这道题和删除节点异曲同工。不过要注意避坑&#xff1a;当遍历到不在范围内的节点时&#xff0c;不要直接返回null或直接返回其左或右孩子&#xff0c;而是继续对其左或右孩子做递归。 /*** Definition for a binary tree node.* public…

显示蛋白质的疏水贴片/疏水口袋(hydrophobic patch)

首先以一篇文章为例:Langmuir 2022, 38, 6191−6200 其中有图: 其中黄色部分为输水口袋。 用到的软件为:SWISS 首先打开软件 1.file-open pdb-file 2.可以通过控制面板选择要忽视的残基(点击残基,红色即为选中) 点击这里: 选中“ignore selected residues”。 3. …