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容器,我们有几个可用的实现类。 其中一些包括ClassPathXmlApplicationContext , FileSystemXmlApplicationContext和WebApplicationContext 。
让我们使用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;@Autowiredpublic 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 – address1和address2 ,我们的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;...@Autowiredpublic void setAddress(Address address) {this.address = address;}}
3.基于属性的注入:
我们还可以使用类的字段或属性注入依赖项。 为此,我们可以简单地在字段上使用@Autowired批注:
@Component
public class Person {@Autowiredprivate Address address;...
}
考虑到我们正在使用基于注释的配置。
值得注意的要点:
根据Spring文档:
- 我们应该使用构造函数注入来强制依赖
- 基于Setter的注入应该用于本质上是可选的依赖项
- Spring使用反射来注入字段注入的依赖项。 因此,基于现场的注入是一种成本更高的方法,我们应该避免使用它
结论:
在这篇快速文章中,我们讨论了什么是依赖注入。 我们还讨论了Spring框架中依赖项注入的类型。
翻译自: https://www.javacodegeeks.com/2019/05/spring-dependency-injection.html
spring依赖注入