一、根据名称自动装配属性(工程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可以随便起名或者忽略。我们推荐使用这种方式进行配置。