1依赖注入方式
1.构造参数注入
将一个bean创建过程中构造方法需要的参数,通过Spring DI的方式,自动注入到构造方法中。
2.Setter注入
先通过一个无参的构造方法创建对象,然后通过属性的setter方法,将属性值注入到对象上。
普通类型
String
Integer(int)
Long(long)
Byte(byte)
...
集合类型
List
Map
Set
java.util.Properties
自动装配(自动注入)
主要针对引用类型(自定义类)
自动装配(自动注入)支持的策略
byType (类型)
按照类型去IOC容器中找需要的bean,如果找到一个,则自动装配;如果没找到,不注入此属性; 如果找到了多个匹配类型的bean,就会报错。
byName(名称)
按照名称去IOC容器中找需要的bean,如果找到就自动注入;如果没找到,不注入此属性。
constructor(构造器)
工作原理和byType类似,也是按照类型去IOC容器中找对应的bean。不同的是注入的地方不是 setter,而是构造方法的参数。
no (默认值)
如果没有打开自动注入,默认Spring不会自动装配需要的属性,需要通过和标签的ref属性来定义。
2.XML方式的依赖注入
构造参数注入
常规写法
<bean id="xx" class="" />
<!-- 相当于调用了有参构造方法创建对象: XXX xxx = new XXX(45, xx, ...); -->
<bean class="com.test.XXX">
<constructor-arg name="age" value="45" />
<constructor-arg name="x" ref="xx" /> <!-- 注入引用的bean -->
<constructor-arg name=""> <!-- 注入内部bean -->
<bean></bean>
</constructor-arg>
<constructor-arg name=""> <!-- 注入list类型构造参数 -->
<list>
</list>
</constructor-arg>
....
</bean>
setter方式注入
setter注入能够注入的类型以及写法基本和构造参数注入时的写法一致,只不过将 标 签换成了
常规用法
<bean id="xx" class="" />
<!-- 相当于调用了无参构造方法创建对象,然后调用set方法设置属性值:
XXX xxx = new XXX();
xxx.setAge(45);
xxx.setX(xx);
....
-->
<bean class="com.test.XXX">
<property name="age" value="45" />
<property name="x" ref="xx" /> <!-- 注入引用的bean -->
<property name=""> <!-- 注入内部bean -->
<bean></bean>
</property>
<property name=""> <!-- 注入list类型构造参数 -->
<list>
</list>
</property>
....
</bean>
开启自动装配
<!--
通过给当前的bean添加autowire属性开启自动注入
可选的值:参见上面自动注入
-->
<bean id="xx" class="" autowire="" />
全局自动装配
在配置文件的beans中配置,进行全局自动装配
default-autowire="byType"
3.注解方式的依赖注入
构造参数注入
在构造方法上添加 @Autowired 注解,构造方法的参数就会自动注入进来
示例:
applicationContext.xml配置文件开启注解支持
<!-- 开启spring注解 -->
<context:component-scan base-package="com.spring.springdi"></context:component-scan>
创建bean类
@Component
public class Pepole {
private Gril gril;
@Autowired //在构造函数上时,根据参数的类型到spring容器中寻找对应的对象,进行注入
public Pepole(Gril gril) {
this.gril = gril;
}
@Override
public String toString() {
return "Pepole{" +
"gril=" + gril +
'}';
}
}
@Component
public class Gril {
}
public class ApplicationConstructor {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new
ClassPathXmlApplicationContext("applicationContext.xml");
Pepole pepole = context.getBean("pepole", Pepole.class);
System.out.println(pepole);
}
}
setter方法注入
方法有两种:
1. 在属性的setter方法上添加 @Autowired 注解
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Autowired
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}
2. 在属性上添加 @Autowired 注解
public class MovieRecommender {
@Autowired
private MovieCatalog movieCatalog;
// setter and getter...
}