spring——依赖注入原理及注入方式

依赖注入是一种设计模式,旨在解耦组件间的依赖关系,提高代码的灵活性、可维护性和可测试性。主要方法包括构造函数注入、Setter方法注入和接口注入。通过外部容器管理对象的依赖,使代码更清晰、易于测试和扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

📲一、依赖注入的原理是什么,为什么要用依赖注入?

🟣1.依赖注入(Dependency Injection,DI)
是一种设计模式和编程技术,其原理是将对象的依赖关系由外部容器来管理和注入。它的目的是解耦组件之间的依赖关系,提高代码的灵活性、可维护性和可测试性。
🟣2.依赖注入的原理

是通过在对象的构造函数、属性或方法中注入所依赖的对象,而不是在对象内部创建或获取依赖对象。这样,对象的依赖关系由外部容器来管理,对象只需要关注自身的核心功能,而不需要关心如何获取依赖对象。

🟣3.依赖注入的主要目的

是实现控制反转(Inversion of Control,IoC),即将对象的创建、组装和依赖关系的管理交给外部容器来负责。通过使用依赖注入,可以实现以下好处:

(1)解耦对象之间的依赖关系:对象不再负责创建或获取依赖对象,而是通过注入的方式来获取所需的依赖对象,从而降低了对象之间的耦合性。
(2)提高代码的可测试性:依赖注入使得在测试过程中可以轻松替换依赖对象,从而实现针对单个组件的独立测试,减少了对外部资源的依赖,使得测试更加简单和可靠。
(3)提高代码的灵活性和可维护性:通过外部容器来管理依赖关系,可以更灵活地配置和组装对象,便于修改、扩展和维护代码。

总结来说,依赖注入的原理是通过将对象的依赖关系由外部容器来管理和注入,从而解耦组件之间的依赖关系,提高代码的灵活性、可维护性和可测试性。使用依赖注入可以使代码更清晰、可读性更高,并且更易于单元测试和扩展。

📲二、依赖注入有哪几种方法?

🟣1、构造函数注入(Constructor Injection):

通过在对象的构造函数中接收所需的依赖对象来进行注入。在创建对象时,将依赖对象作为参数传递给构造函数,对象在创建完成后就具备了所需的依赖对象。这种方式可以保证对象的依赖在创建时就被满足,并且使得对象的依赖关系清晰明确。

(1)首先,创造一个类,配置bean.xml文件
   <bean id="bookCon" class="com.itguigu.spring6.iocxml.di.Book">
        <constructor-arg name="name" value="后端"></constructor-arg>
    </bean>
(2)在bean标签内部使用 constructor-arg标签

🟠type属性:使用类型指定构造方法中参数的类型

🟠index属性:使用构造方法中参数索引值来 进行注入

🟠 name属性 :使用构造方法中参数名称 来注入 ( 常用!)

🟠value属性:要注入的值(基本数据类型和String类型)

🟠ref属性:要注入的值(引用在IOC容器中其他的bean对象)

🟣2、Setter方法注入(Setter Injection):
必须要有一个无参的构造方法,否则只能用构造方法构造

通过提供一组Setter方法,将依赖对象通过Setter方法进行注入。在对象创建完成后,通过调用相应的Setter方法来设置依赖对象。这种方式使得对象的依赖可以在创建后的任意时刻进行注入,具有更大的灵活性。

Setter方法注入的原理步骤如下:

🟠(1)定义对象的依赖属性:在目标对象中定义一个或多个私有属性,用于存储依赖对象的引用。

🟠(2)提供Setter方法:为每个依赖属性提供对应的公共Setter方法,用于接收依赖对象的实例。

🟠(3)创建目标对象实例:通过实例化目标对象的类,创建目标对象的实例。

🟠(4)获取依赖对象:从外部获取依赖对象的实例,可以是通过容器或其他方式。

🟠(5)调用Setter方法:将依赖对象的实例作为参数,调用目标对象的Setter方法进行注入。在调用Setter方法时,目标对象会将依赖对象的引用存储到对应的依赖属性中。

(6)使用目标对象:完成依赖注入后,可以通过目标对象的其他方法或属性来使用注入的依赖对象。

创造一个类,配置bean.xml文件
   public Book(){
        System.out.println("无参数构造执行.......");

    }
    public Book(String name, String author) {
        System.out.println("有参数构造执行.......");
        this.name = name;
        this.author = author;
    }
    <bean id="book" class="com.itguigu.spring6.iocxml.di.Book">
        
        <property name="name" value="前端"></property>
        <property name="author" value="嘎嘎"></property>
        <property name="others" value="&lt;&lt;"></property>
    </bean>
🟣3、接口注入(Interface Injection):

在对象的接口中定义一个用于接收依赖对象的方法,并由外部容器来调用该方法进行注入。接口注入需要对象实现一个特定的接口,外部容器通过该接口的方法来注入依赖对象。这种方式较少使用,因为需要对象实现额外的接口。

### Spring IOC 依赖注入的工作原理 Spring IOC(Inversion of Control,控制反转)中的依赖注入(Dependency Injection, DI),是指通过外部配置的方式将对象间的依赖关系交给容器管理,从而减少代码耦合度并提高灵活性。以下是关于 Spring IOC 依赖注入工作原理的具体解释: #### 容器初始化阶段 当 Spring 应用启动时,`ApplicationContext` 或 `BeanFactory` 负责加载配置文件或注解定义的 Bean,并将其注册到内部的数据结构中。这一过程主要包括以下步骤: - **扫描组件**:如果使用基于 XML 配置,则直接解析 `<bean>` 标签;如果是基于 Java 注解,则通过类路径扫描发现带有特定注解(如 `@Component`, `@Service`, `@Repository` 等)的类[^1]。 - **实例化 Bean**:对于每一个被识别出来的 Bean 类型,框架会为其创建实际的对象实例[^2]。 #### 属性填充与依赖解决 一旦所有的 Bean 实例都被成功构建出来之后,下一步就是设置这些 Beans 的属性值以及满足它们之间可能存在的相互引用需求——即执行所谓的“依赖注入”。具体来说: - 当某个 Bean A 需要另一个 Bean B 作为其成员变量时,在默认情况下,Spring 将自动寻找符合条件的候选者并将之赋给前者对应的字段位置上完成装配操作[^3]; - 如果存在多个匹配项或者没有任何合适的选择,则抛出异常提示开发者修正错误配置情况下的行为模式设定问题[^5]。 #### 自动装配策略 为了更精确地指定如何找到目标 bean 来进行注入,Spring 提供了几种不同的 Autowire 模式可供选择: - byName: 根据参数名称去查找对应名字的服务端口; - constructor: 只允许单参构造函数参与反射调用流程. 另外还有一种特别重要的概念叫做原型作用域(Prototype Scope),它意味着每次请求都会得到一个新的实体副本而非共享同一个全局唯一版本. ```java @Service public class MyService { @Autowired private AnotherService anotherService; // 使用@Autowired标注实现DI public void doSomething(){ System.out.println(anotherService); } } ``` 上述例子展示了最基础形式下利用注解驱动的方式来达成自动化程度较高的程序开发体验效果的同时也体现了IOC/DI设计理念所带来的诸多好处比如增强模块独立性降低修改成本等等优点[^4]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值