接上篇文章(上)spring 的依赖注入,您了解多少?,继续聊下依赖注入的类型:构造器注入、setter注入、字段注入、方法注入和接口注入,我们逐一介绍各种注入类型。
构造器注入
构造器注入方式也有自动注入和手动注入两种方式,先看下xml的手动注入方式,还是用(上)spring 的依赖注入,您了解多少?文章中的User和UserHodler类代码,在UsserHodler方法中声明了两个构造方法:一个默认无参和一个有参。OK,说再多也没有上代码直接。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="*.User">
<property name="id" value="1"/>
<property name="name" value="李三"/>
</bean>
<bean class="*.UserHolder">
<constructor-arg name="user" ref="user" />
</bean>
</beans>
是不是很简单,构造函数注入是不是很简单。其实还有另外实现方式,例如通过java注解元信息方式,还是直接上代码。
public class ConstructorDIDemo {
public static void main(String[] args) {
// 创建 BeanFactory 容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
// 注册 Configuration Class(配置类)
applicationContext.register(ConstructorDIDemo .class);
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(applicationContext);
String xmlResourcePath = "classpath:/META-INF/constructor-context.xml";
// 加载 XML 资源,解析并且生成 BeanDefinition
beanDefinitionReader.loadBeanDefinitions(xmlResourcePath);
// 启动 Spring 应用上下文
applicationContext.refresh();
// 依赖查找并且创建 Bean
UserHolder userHolder = applicationContext.getBean(UserHolder.class);
System.out.println(userHolder);
// 显示地关闭 Spring 应用上下文
applicationContext.close();
}
@Bean
public UserHolder userHolder(User user) {
return new UserHolder(user);
}
}
java注解注入比xml的注入稍微复杂,创建beanFactory容器==》注册配置类==》加载xml资源,解析并且生成BeanDefinition ==》启动spring应用上下文==》依赖查找并创建Bean==>最后关闭spring应用上下文。
上面介绍了两种手动构造器注入的方式,下面我看一种自动注入的方式,还是直接上代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="*.User">
<property name="id" value="1"/>
<property name="name" value="李三"/>
</bean>
<bean class="*.UserHolder" autowire="constructor">
</bean>
</beans>
OK,这样就写完了。跟上篇文章一样,建议根据实际情况选择注入方式。
构造器注入使用场景:因为构造函数的参数不易过多,并且参数都是必须的,系统启动后,生成的对象是固定的。因此构造器注入一般使用在少依赖和强制依赖的场景。
这个问题还可以反过来思考,如果一个构造方法的参数比较多,每次使用的时候都传入很多参数,也许有一些参数没有必要,这样就适得其反了。