首页 > 其他分享 >Spring 依赖注入详解:创建 Bean 和注入依赖是一回事吗?

Spring 依赖注入详解:创建 Bean 和注入依赖是一回事吗?

时间:2025-01-22 21:30:40浏览次数:3  
标签:容器 依赖 Spring Bean userService 注入

1. 什么是依赖注入(Dependency Injection,DI)?

依赖注入 是 Spring IoC(控制反转)容器的核心功能。它的目标是将对象的依赖(如其他对象或配置)从对象本身中剥离,由容器负责注入这些依赖。

关键概念:
  • 依赖: 一个对象需要的其他对象或资源。例如,UserController 需要 UserService
  • 注入: Spring 容器在创建对象时,将依赖对象传递给它,而不是对象自己去创建。

2. Bean 创建与依赖注入的关系

Bean 创建:

  • Spring 容器根据定义(如 XML 配置、注解或 Java 配置)实例化一个类,生成一个对象。

依赖注入:

  • 创建 Bean 之后,Spring 容器会检查这个对象是否有依赖项,并将所需的依赖注入进去。
两者的区别:
  • Bean 创建: 生成一个对象的实例。
  • 依赖注入: 为创建的对象注入其所需的依赖。
联系:
  • 依赖注入是 Bean 创建过程中的一部分,必须先创建 Bean 才能注入依赖。

3. 依赖注入的三种方式

Spring 提供了三种主要的依赖注入方式:构造器注入Setter 注入字段注入


(1) 构造器注入

通过类的构造器将依赖传递给对象。

优点:

  • 保证依赖在对象创建时就被注入,避免空指针异常。
  • 强制依赖项必须提供,增强对象的不可变性。

示例代码:

@Component
public class UserController {
    private final UserService userService;

    // 使用构造器注入
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
}

XML 配置方式:

<bean id="userController" class="com.example.UserController">
    <constructor-arg ref="userService"/>
</bean>

(2) Setter 注入

通过 Setter 方法注入依赖。

优点:

  • 更灵活,可以在对象创建后设置或修改依赖。
  • 适合可选依赖的场景。

示例代码:

@Component
public class UserController {
    private UserService userService;

    // 使用 Setter 注入
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
}

XML 配置方式:

<bean id="userController" class="com.example.UserController">
    <property name="userService" ref="userService"/>
</bean>

(3) 字段注入

直接将依赖注入到类的字段上。

优点:

  • 简洁,代码更少。
  • 不需要显式构造器或 Setter 方法。

缺点:

  • 难以单元测试,因为字段是私有的,不能通过构造器或方法替换依赖。
  • 不符合 SOLID 原则中的单一责任原则。

示例代码:

@Component
public class UserController {
    @Autowired
    private UserService userService; // 字段注入
}

推荐使用: 构造器注入 > Setter 注入 > 字段注入(特殊情况可用)。


4. Spring 容器如何管理 Bean 的生命周期

Spring 容器通过以下几个阶段管理 Bean 的生命周期:

(1) Bean 的定义和加载
  • 通过配置文件(XML、Java 配置、注解)加载 Bean 定义。
  • 容器解析 Bean 的依赖关系。
(2) Bean 的实例化
  • 容器根据定义,通过构造器或工厂方法实例化 Bean。
(3) 依赖注入
  • 容器将所需的依赖对象注入到 Bean 中。
(4) 初始化
  • 容器调用初始化方法(如 @PostConstructinit-method)进行初始化逻辑。
(5) Bean 的使用
  • Bean 准备就绪后,由应用程序调用。
(6) 销毁
  • 容器关闭时,调用销毁方法(如 @PreDestroydestroy-method)。

5. 示例场景和常见问题
示例场景:用户登录
@Component
public class UserController {
    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    public User login(String username, String password) {
        return userService.authenticate(username, password);
    }
}

依赖注入过程:

  1. Spring 容器加载 UserControllerUserService 的定义。
  2. 容器创建 UserService 的实例。
  3. 容器创建 UserController 的实例,并将 UserService 注入到它的构造器中。
常见问题:
  1. 循环依赖问题:A 依赖 B,而 B 也依赖 A,会导致 Bean 无法创建。
    • 解决方案: 将其中一个依赖改为 Setter 注入或使用 @Lazy
  2. 依赖注入失败: 如果 Spring 容器中没有找到需要注入的 Bean,会抛出异常。
    • 解决方案: 确保所有需要的 Bean 都被正确注册。

6. 总结
  • 依赖注入的本质: 容器负责将对象需要的依赖注入进来,解除了对象之间的紧耦合。
  • Bean 创建与依赖注入: Bean 创建是依赖注入的前提,依赖注入是 Bean 生命周期中的一个步骤。
  • 三种注入方式: 构造器注入优先,其次是 Setter 注入,字段注入仅适用于特定场景。
  • Spring 容器的管理: 通过完整的生命周期管理,Spring 容器让开发者专注于业务逻辑。

标签:容器,依赖,Spring,Bean,userService,注入
From: https://blog.csdn.net/ray_paul1/article/details/145305726

相关文章

  • 十大漏洞-sql注入漏洞介绍
    前言在网络安全的复杂体系中,SQL注入漏洞是最为常见且危害巨大的漏洞之一。它犹如隐藏在暗处的窃贼,悄无声息地窃取、篡改甚至破坏数据库中的关键信息,对个人、企业乃至整个网络生态都可能造成严重影响。本文将深入探讨SQL注入漏洞定义SQL注入漏洞是攻击者通过在目标应用程......
  • 揭秘Spring框架的核心:怎么理解Spring Bean
    SpringBean就像是一家餐厅里的菜品,每道菜品都有其独特的属性和功能,而Spring框架则像是这家餐厅的厨房,负责创建、管理和协调这些菜品。1.菜品定义(Bean定义):•在Spring框架中,Bean是由Spring容器创建和管理的对象。每个Bean都有一个或多个属性,这些属性描述了Bean的状态和行为......
  • bean的生命周期
    bean的生命周期bean的生命周期指的就是bean从创建到销毁的过程初始化容器创建对象(内存分配)执行构造方法执行属性注入(set操作)执行bean初始化方法使用bean执行业务操作关闭/销毁容器执行bean的销毁方法管理bean的生命周期有两种方式,一种通过xml配置,一种通过......
  • XML外部实体注入--XML基础
    一.XML基础1.XML基础概念定义:XML即可扩展标记语言(ExtensibleMarkupLanguage),用于标记电子文件,使其具有结构性。它是一种允许用户对自己的标记语言进行定义的源语言,可用来标记数据、定义数据类型。设计宗旨与应用:XML的设计宗旨是传输数据,而非显示数据。在web中应......
  • 2025.1.20——一、[RCTF2015]EasySQL1 二次注入|报错注入|代码审计
    题目来源:buuctf [RCTF2015]EasySQL1目录一、打开靶机,整理信息二、解题思路step1:初步思路为二次注入,在页面进行操作step2:尝试二次注入step3:已知双引号类型的字符型注入,构造payloadstep4:报错注入step5:三爆方法①extractvalue()函数方法②updatexml()函数三、小......
  • 函数篡改注入
    一、介绍利用函数篡改注入可以避免使用 VirtualAlloc/Ex WinAPI调用,使用新代码替换原始函数的字节,导致函数被替换或不再按预期工作。相反,函数将执行不同的逻辑。要实现这一点,需要一个被践踏的牺牲函数地址(1)选择目标函数本地获取函数地址很简单,但用这种技术获得的主要关注点......
  • 映射注入
    一、前言在所有先前的实现中,私有内存类型都用于在执行期间存储有效负载。私有内存是使用 VirtualAlloc 或 VirtualAllocEx 分配的,如下图所示可以看到内存类型属于Private二、映射内存注入分配私有内存的过程因被恶意软件广泛使用而受到安全解决方案的高度监控。为了避免使......
  • 运维系列&安卓系列【仅供参考】:fastutil-7.2.0.jar下载依赖包超时问题,Android
    fastutil-7.2.0.jar下载依赖包超时问题,Androidfastutil-7.2.0.jar下载依赖包超时问题,Android摘要正文fastutil-7.2.0.jar下载依赖包超时问题,Android摘要文章介绍了在下载FastUtil-7.2.0.jar时遇到的网络问题,提出解决方案是使用阿里云的国内镜像,并给出了G......
  • Spring,Spring Ioc,Bean详解
    Spring框架Spring框架是Java应用最广的框架,其的成功来自于理念,并非是技术,其中几个理念非常重要,例如IoC(控制反转),AOP(面向切面编程)Spring的优势低耦合/低侵入(解耦)Spring通过IoC(控制反转)和DI(依赖注入)来实现低耦合高内聚声明式事务管理Spring基于AOP的方......
  • Spring中Bean的作用域解析及使用场景
    目录一、Singleton(单例模式)二、Prototype(原型模式)三、Request(请求作用域)四、Session(会话作用域)五、GlobalSession(全局会话作用域)六、Application(应用作用域)七、WebSocket(WebSocket作用域)在Spring框架中,Bean的作用域决定了Bean的生命周期和可见范围。合理选择Bean的作......