spring自动装配
###(waht)定义:
Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系。因此,如果可能的话,可以自动让Spring通过检查
beanFactory中的内容,来替我们指定bean的协作者(其他被依赖的bean)。
Spring的IOC容器通过Java反射机制了解了容器中所存在Bean的配置信息,这包括构造函数方法的结构,属性的信息,而正是由于这个原因,Spring容器才能够通过某种规则来对Bean进行自动装配,而无须通过显式的方法来进行配制。
###why(使用自动装配):
方便之处在减少或者消除属性或构造器参数的设置,这样可以给我们的配置文件减减肥。
其实,自动装配就是让我们少些几个
1 | <ref ="..."/>; |
###how(设置方式)
我们假设有4个bean.分别是bean2,bean3,bean4,bean5。其中,bean2里面有后面几个bean的引用。我只放出来bean2.java。
1 | public class Bean2 { |
不用自动装配的写法如下:
1 | <bean id="bean2" class="com.test.model.Bean2"> |
我们假设使用自动装配.我们只需要这样
1 | <bean id="bean2" class="com.test.model.Bean2" /> |
###注意:
bean2.java里面的属性名字必须和applicationContext.xml里面对应的bean id的名字相同。默认使用的是byName方法。
声明装配方式的配置如下:
1 | <?xml version="1.0" encoding="UTF-8"?> |
###自动装配有4种方式
default-autwire=’x’
- byName
IoC容器会根据set方法中对应的property名字找到对应的javabean(id要和property名字一致),并且创建其实例后调用set方法注入进配置属性autowire的Bean实例中.
name是set方法的name,setxxx
//Service.java1
2
3
4
5
6
7
8
9
public class Service
{
Source source;
public void setSource(Source source)
{
this.source = source;
}
}
applicationContext.xml
1 | <beans |
- byType
IoC容器会根据set方法中参数的类型找到对应的javabean,并且创建其实例后调用set方法注入进配置属性autowire的Bean实例中。
Service.java
同上
applicationContext.xml
1 | <beans |
配置文件会找实现了Source接口的bean,这里DBCPSource类实现类Source借口,所以自动装配,如果没找到则不装配。如果同个配置文件中两个bean实现了Source借口,则报错。这里的Type指的是setSource(Source source)中参数的类型。
- constructor
IoC容器会根据有参构造器中参数类型找到对应的javabean,并且创建其实例后调用有参构造器注入进配置属性autowire的Bean实例中。但是对非javabean类型的参数必须配置
试图在容器中寻找与需要自动装配的bean的构造函数参数一致的一个或多个bean,如果没找到则抛出异常。
- autodetect
首先尝试使用constructor来自动装配,然后再使用byType方式。
参考: