###(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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Bean2 {

private Bean3 bean3;

private Bean4 bean4;

private Bean5 bean5;

public Bean3 getBean3() {
return bean3;
}

public void setBean3(Bean3 bean3) {
this.bean3 = bean3;
}

public Bean4 getBean4() {
return bean4;
}

public void setBean4(Bean4 bean4) {
this.bean4 = bean4;
}

public Bean5 getBean5() {
return bean5;
}

public void setBean5(Bean5 bean5) {
this.bean5 = bean5;
}
}

不用自动装配的写法如下:

1
2
3
4
5
<bean id="bean2" class="com.test.model.Bean2">
<property name="bean3" ref="bean3"/>
<property name="bean4" ref="bean4"/>
<property name="bean5" ref="bean5"/>
</bean>

我们假设使用自动装配.我们只需要这样

1
<bean id="bean2" class="com.test.model.Bean2" />

###注意:

  1. bean2.java里面的属性名字必须和applicationContext.xml里面对应的bean id的名字相同。默认使用的是byName方法。

  2. 声明装配方式的配置如下:

1
2
3
4
5
6
7
<?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

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
default-autowire="byName">

###自动装配有4种方式

default-autwire=’x’

  • byName
    IoC容器会根据set方法中对应的property名字找到对应的javabean(id要和property名字一致),并且创建其实例后调用set方法注入进配置属性autowire的Bean实例中.
    name是set方法的name,setxxx

//Service.java

1
2
3
4
5
6
7
8
9

public class Service
{
Source source;
public void setSource(Source source)
{
this.source = source;
}
}

applicationContext.xml

1
2
3
4
5
6
7
<beans
...
default-autowire="byName">
<bean id="source" class="cn.hh.spring.DBCPSource" scope="prototype"/>
<bean id="service" class="cn.hh.spring.Service" scope="prototype">
</bean>
</beans>
  • byType

IoC容器会根据set方法中参数的类型找到对应的javabean,并且创建其实例后调用set方法注入进配置属性autowire的Bean实例中。

Service.java
同上

applicationContext.xml

1
2
3
4
5
6
7
<beans
...
default-autowire="byType">
<bean id="source" class="cn.hh.spring.DBCPSource" scope="prototype"/>
<bean id="service" class="cn.hh.spring.Service" scope="prototype">
</bean>
</beans>

配置文件会找实现了Source接口的bean,这里DBCPSource类实现类Source借口,所以自动装配,如果没找到则不装配。如果同个配置文件中两个bean实现了Source借口,则报错。这里的Type指的是setSource(Source source)中参数的类型。

  • constructor

IoC容器会根据有参构造器中参数类型找到对应的javabean,并且创建其实例后调用有参构造器注入进配置属性autowire的Bean实例中。但是对非javabean类型的参数必须配置后进行注入。
试图在容器中寻找与需要自动装配的bean的构造函数参数一致的一个或多个bean,如果没找到则抛出异常。

  • autodetect

首先尝试使用constructor来自动装配,然后再使用byType方式。

参考: