【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 {
    @Bean
    public UserService userService() {
        // 这里可以对 UserService 
        // 进行配置后
        // 再返回配置好的 UserService 对象
        return new UserService();
    }
}

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

<context:component-scan
    base-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 {
    @Autowired
    private UserService userService;
}
Setter 注入
public class UserController {

    private UserService userService;

    @Autowired
    public 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;

    @Autowired
    public 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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch之Ingest Pipeline和Painless Script

写在前面 如果是我们需要在写入文档或者是返回文档时&#xff0c;进行修改字段值&#xff0c;或者增加字段等操作时&#xff0c;就可以考虑使用ingest pipeline和painless script。如下的需求&#xff1a; 1:ingest pipeline 在es 5中引入了一种新的节点类型ingest node&am…

安科瑞智能断路器产品介绍【可监可控 远程操控 短路保护】

开发背景 过去几年智慧用电的产品应用中&#xff0c;大多数只安装于进线测。主要存在以下几个问题&#xff1a;难定位&#xff0c;不知道具体哪个回路出线问题&#xff0c;排查困难&#xff1b;出线过载或线缆温度过高无法知晓&#xff1b;即使是出线回路安装了的场景&#xf…

个人开发App成功上架手机应用市场的关键步骤

目录 1. 苹果审核和APP备案 2. APP上架操作步骤 3. 审核和发布 4. 上线工作 总结 参考资料 在当前移动应用市场竞争激烈的背景下&#xff0c;个人开发App如何成功上架成为开发者们必须面对的重要任务。本文将重点介绍自建App上架至手机应用市场的流程&#xff0c;包括苹果…

2024你必须知道的外贸形势!

2024年外贸形势下的新机会在哪里&#xff1f;今天Erica给大家总结了几个主要市场的形式。 喜欢的话点点关注吧~ 欧美市场2024年应谨慎开发 海关总署11月7日发布的数据显示&#xff0c;前10个月&#xff0c;今年中国对欧洲出口呈下降趋势&#xff0c;中国与欧盟贸易总值为4.5…

前端项目,个人笔记(六)【无限滚动 + 拦截器】

目录 1、无限滚动 2、使用pinia进行用户数据持久化 3、完善个人笔记三中的拦截器 请求拦截器&#xff1a; 响应拦截器&#xff1a; 1、无限滚动 使用elementplus中提供的&#xff1a; 代码&#xff1a; <div class"body" v-infinite-scroll"load"…

【复现】某指挥调度管理平台 SQL注入漏洞_66

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 该平台提供强大的指挥调度功能&#xff0c;可以实时监控和管理通信网络设备、维护人员和工作任务等。用户可以通过该平台发送指令…

积鼎CFD发动机燃烧仿真,实现航空航天发动机内部燃烧过程的流体仿真

航空航天发动机中的燃烧现象是一种复杂的物理化学过程&#xff0c;包括流动、雾化、相变、传热传质、点火熄火、化学反应、污染物排放、热声振荡和冷却等多个过程&#xff0c;加上燃烧的非定常性和高湍流度&#xff0c;使得准确模拟燃烧过程变得异常困难。在传统CFD模拟需要考虑…

Docker在Mac上轻松部署RabbitMQ:从拉取镜像到创建运行带管理界面的容器全攻略

1、去官网下载docker 安装&#xff1a;把图标拉到应用程序即可 https://docs.docker.com/desktop/install/mac-install/ 2、拉取rabbitmq镜像 docker pull rabbitmq:3.8-management 3、创建并启动容器&#xff0c;同时设置环境变量以创建用户和密码 docker run -d --name m…

python中医学习服务管理系统flask-django-php-nodejs

随着世界经济信息化、全球化的到来和互联网的飞速发展&#xff0c;推动了各行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、动态的、交互友好的、高效的中医学习服务管理系统。当前的信息管理存在工作…

YOLOV5 部署:cuda和cuDNN安装

1、前言 TensorRT 的安装需要配合cuda的使用,所以这里需要安装cuda和cudnn用于加速推理 TensorRT 就是神经网络专门用来加速的框架 之前训练yolov5项目的时候,我们只是配置了torch的GPU环境,没有专门安装cuda和cudnn,因为简单的训练、推理没必要cuda加速。 torch的GPU配置…

MINT: Detecting Fraudulent Behaviors from Time-series Relational Data论文阅读笔记

2. 问题定义 时间序列关系数据&#xff08;Time Series Relation Data&#xff09; 这个数据是存放在关系型数据库中&#xff0c;每一条记录都是泰永时间搓的行为。 更具体地&#xff0c;每条记录表示为 x ( v , t , x 1 , x 2 , … , x m − 2 ) x (v,t,x_1,x_2,\dots,x…

【JS】浅谈Promise

Promise 前言一、Promise是什么&#xff1f;二、为什么用Promise&#xff1f;2.1解决回调地狱2.2 集中错误处理2.3代码解耦和复用 三、做什么&#xff1f;四、原型方法和实例方法&#xff1f;五、应用场景&#xff1f; 前言 promise是es6的新规范&#xff0c;它是一种异步解决…

粗糙度对应表,觉得挺实用

粗糙度新老标准经常会遇到&#xff0c;分享给大家

大数据分析师特训营介绍

大数据分析师是做什么的&#xff1f; 数据分析师是在不同行业中&#xff0c;专门从事行业数据搜集、整理、分析&#xff0c;并依据数据做出行业研究、评估和预测等工作的。与传统的数据分析师相比&#xff0c;大数据分析师要学会打破信息孤岛利用各种数据源&#xff0c;在海量…

ByteTrack多目标跟踪——YOLOX详解

文章目录 1 before train1.1 dataset1.2 model 2 train2.1 Backbone2.2 PAFPN2.3 Head2.3.1 Decoupled Head2.3.2 anchor-free2.3.3 标签分配① 初步筛选② simOTA 2.3.4 Loss计算 项目地址&#xff1a; ByteTrack ByteTrack使用的检测器是YOLOX&#xff0c;是一个目前非常流行…

Ceres求解非线性优化问题步骤与示例

【版权声明】 本文为博主原创文章&#xff0c;未经博主允许严禁转载&#xff0c;我们会定期进行侵权检索。 在计算机视觉和机器人领域&#xff0c;经常需要解决非线性优化问题来估计相机姿态或运动模型。Ceres Solver是一个开源的C库&#xff0c;专门用于解决最小二乘问题&am…

Linux系统如何使用tcpdump实时监控网络速度:方法与技巧解析

在网络管理和故障排查中&#xff0c;了解网络速度是一个重要的环节。而tcpdump&#xff0c;作为一个强大的网络数据包分析工具&#xff0c;不仅可以用于分析数据包的内容&#xff0c;还能用于实时监控网络速度。本文将介绍Linux系统如何使用tcpdump来实时监控网络速度。 首先&…

智能型程控直流电子负载特点和特性

智能型程控直流电子负载是高精度、高稳定性的电源测试设备&#xff0c;主要用于对电源、电池、充电器等直流电源设备的输出性能进行测试。它具有以下特点和特性&#xff1a; 智能型程控直流电子负载采用先进的控制算法和高精度的ADC&#xff0c;能够实现对电流、电压、功率等参…

【EOJ】2985.圆和正方形

单点时限: 2.0 sec 内存限制: 256 MB 小王首先在平面上画一个边长为 K 的正方形 S1&#xff0c;然后又画一个 S1 的内切圆 C1&#xff0c;这算做一次操作。然后接着画 C1 的一个内切正方形 S2&#xff0c;和 S2 的一个内切圆 C2&#xff0c;这算第二次操作。他一直进行了 K 次…

前端学习笔记 | JS进阶

一、作用域 1、局部作用域 &#xff08;1&#xff09;函数作用域 &#xff08;2&#xff09;块作用域 let和const会产生块作用域 &#xff0c;而var不会产生块作用域 2、全局作用域 script标签和js文件的【最外层】变量 3、作用域链 本质&#xff1a;底层的变量查找机制 4、JS…