Spring依赖注入

介绍:

在设计良好的Java应用程序中,这些类应尽可能独立。 这样的设计提高了组件的可重用性。 它还使对各个组件进行单元测试变得更加容易。

依赖注入的概念促进了Java对象之间的松散耦合。

在本教程中,我们将讨论Spring框架中的依赖项注入。

控制反转(IoC):

控制反转是一种软件工程原理,将控制应用程序流的责任委托给框架。 为了使其成为可能, 框架使用抽象并依赖于运行时生成的对象图。

使用IoC原理有几个优点:

  • 使任务实现与执行分离
  • 模块是可插拔的,并且可以轻松替换为同等模块
  • 简化了模块化测试

我们可以使用策略设计模式,服务定位器模式或依赖注入来实现控制反转

依赖注入:

依赖注入是允许我们实现控制反转的设计模式之一

在传统的编程风格中,我们将类编写为:

public class Person {
 
    private Address address;
 
    public Person() {
        this.address = new Address();
    }
 
    ...
}

使用依赖注入时,我们不会自己创建对象而是注入它们。 然后,我们的Person类将类似于:

public class Person {
 
    private Address address;
 
    public Person(Address address) {
        this.address = address;
    }
 
    ...
}

Spring的依赖注入:

Spring提供了一个IoC容器,该容器负责实例化,配置和管理Spring bean的生命周期。 在Spring中,任何POJO都称为Spring bean。

Spring ApplicationContext接口代表其IoC容器,我们有几个可用的实现类。 其中一些包括ClassPathXmlApplicationContextFileSystemXmlApplicationContextWebApplicationContext

让我们使用ClassPathXmlApplicationContext实例化Spring容器:

ApplicationContext appContext
  = new ClassPathXmlApplicationContext("applicationContext.xml");

在这里, applicationContext.xml是保存运行时组装bean所需的元数据的文件。

Spring支持三种类型的依赖项注入:

1.基于构造函数的注入:

在基于构造函数的注入中,Spring将使用匹配的构造函数来解析和注入依赖性。

我们可以在applicationContext.xml中配置bean

<bean id="address" class="com.programmergirl.domain.Address"/>
 
<bean id="person" class="com.programmergirl.domain.Person">
    <constructor-arg ref="address"/>
</bean>

或者,我们可以在applicationContext.xml中启用<component-scan />

<context:component-scan base-package="com.programmergirl.domain" />

启用组件扫描后,我们可以使用注释进行Spring配置。 我们的课程如下:

package com.programmergirl.domain;
@Component
public class Person {
 
    private Address address;
 
    @Autowired
    public Person(Address address) {
        this.address = address;
    }
}
 
package com.programmergirl.domain;
@Component
public class Address {
   ...
}

默认情况下,Spring按其类型对bean进行接线。 如果有多个相同类型的bean,我们可以使用@Qualifier批注通过其名称引用bean:

@Component
public class Person {
 
    private Address address;
 
    @Autowired
    @Qualifier("address1")
    public void setAddress(Address address) {
        this.address = address;
    }
}

假设我们有两个Address Bean – address1address2 ,我们的address1 Bean将在依赖关系解析时注入Person类中。

2.二传手注射:

基于setter的依赖项注入是通过使用no-arg构造函数或no-argument静态工厂实例化bean之后,通过在bean上使用setter方法实现的。

我们可以使用XML将其配置为:

<bean id="address" class="com.programmergirl.domain.Address"/>
 
<bean id="person" class="com.programmergirl.domain.Person">
    <property name="address" ref="address"/>
</bean>

另一方面,使用注释时,我们将具有:

@Component
public class Person {
    
    private Address address;
    ...
    @Autowired
    public void setAddress(Address address) {
        this.address = address;
    }
    
}

3.基于属性的注入:

我们还可以使用类的字段或属性注入依赖项。 为此,我们只需在字段上使用@Autowired批注:

@Component
public class Person {
 
    @Autowired
    private Address address;
    ...
}

考虑到我们正在使用基于注释的配置。

值得注意的要点:

根据Spring文档:

  • 我们应该使用构造函数注入来强制依赖
  • 基于Setter的注入应该用于本质上是可选的依赖项
  • Spring使用反射来注入字段注入的依赖项。 因此,基于现场的注入是一种成本更高的方法,我们应该避免使用它

结论:

在这篇快速文章中,我们讨论了什么是依赖注入。 我们还讨论了Spring框架中依赖项注入的类型。

翻译自: https://www.javacodegeeks.com/2019/05/spring-dependency-injection.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值