一、根據名稱自動裝配屬性(工程spring_autowire_byName
)
這種方式一般用在開發階段,用于提供我們的開發效率。我們通過一個示例進行說明。
相關實體:
Bean2.java
private Bean3 bean3;
private Bean4 bean4;
private Bean5 bean5;
Bean3.java
private int id;
private String name;
private String password;
Bean4.java
private int id;
private String name;
Bean5.java
private int age;
配置:applicationContext-beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
default-autowire="buName">
<!-- <bean id="bean2" class="com.bjsxt.spring.Bean2">
<property name="bean3" ref="bean3" />
<property name="bean4">
<ref bean="bean4" />
</property>
<property name="bean5" ref="bean5" />
</bean> -->
<bean id="bean2" class="com.bjsxt.spring.Bean2" />
<bean id="bean5" class="com.bjsxt.spring.Bean5">
<property name="age" value="20" />
</bean>
</beans>
applicationContext-other.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean id="beanAbstract" abstract="true">
<property name="id" value="1000"/>
<property name="name" value="Jack"/>
</bean>
<bean id="bean3" class="com.bjsxt.spring.Bean3" parent="beanAbstract">
<property name="name" value="Tom"/>
<property name="password" value="123"/>
</bean>
<bean id="bean4" class="com.bjsxt.spring.Bean4" parent="beanAbstract"/>
</beans>
說明:這里我們之所以可以這樣簡單的配置Bean2類,是因為我們在Bean2類中的屬性名字和Bean3、Bean4、Bean5這些類中配置的id號是名字是一樣的,同時提供了getter和setter方法,這樣spring就會根據這個名字去找相應的類,然后實例化之后注入進來,當然這樣配置之后是不會生效的,我們需要在<beans>
標簽中配置default-autowire="byName"
。這種方式一般用在開發階段,在項目發布時不推薦這樣做,因為在配置文件中看不到一個bean的屬性,不利于維護,一般在開發完之后再改成一般方式。
測試:AutowireTest.java
package com.bjsxt.spring;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import junit.framework.TestCase;
public class AutowireTest extends TestCase {
private BeanFactory factory;
@Override
protected void setUp() throws Exception {
factory = new ClassPathXmlApplicationContext("applicationContext-*.xml");
}
public void testAutowire() {
Bean2 bean2 = (Bean2)factory.getBean("bean2");
System.out.println("bean2.bean3.id=" + bean2.getBean3().getId());
System.out.println("bean2.bean3.name=" + bean2.getBean3().getName());
System.out.println("bean2.bean3.password=" + bean2.getBean3().getPassword());
System.out.println("bean2.bean4.id=" + bean2.getBean4().getId());
System.out.println("bean2.bean4.name=" + bean2.getBean4().getName());
System.out.println("bean2.bean5.age=" + bean2.getBean5().getAge());
}
}
二、根據類型自動裝配(工程spring_autowrire_byType
)
這里所有的類和配置都和上面一樣,但是在<beans>
標簽中配置default-autowire="byType"
,此時spring會根據各個類的實際類型去找相關的實體類,id可以隨便起名或者忽略。我們推薦使用這種方式進行配置。