Spring提供了几种技巧,可以减少XML的配置数量:
- 自动装配(autowiring):可以减少
<property>(setter注入)
和<constructor-arg>(构造器注入)
元素,让Spring自动识别如何装配Bean的依赖关系; - 自动检测(autodiscovery):Spring能够自动识别哪些类需要被装配成Spring Bean,从而减少对
<bean>
的使用
4种自动装配
- byName:——根据Property的Name自动装配,如果一个bean的name,和另一个bean中的Property的name相同,则自动装配这个bean到Property中。
- byType:——根据Property的数据类型(Type)自动装配,如果一个bean的数据类型,兼容另一个bean中Property的数据类型,则自动装配。
- constructor:——根据构造函数参数的数据类型,进行byType模式的自动装配。
- autodetect: ——先尝试使用constructor,失败后再使用byType。
1.1、byName:
public class Car { public void start(){ System.out.println("starting car..."); } }
(2)User.java——此处是setter注入
public class User { private Car car; public void setCar(Car car) { this.car = car; } public void startCar(){ car.start(); } }
(3)xml配置文件:
原来是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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="car" class="com.zzj.bean.Car"></bean> <bean id="user" class="com.zzj.bean.User" > <property name="car" ref="car" /> </bean> </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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="car" class="com.zzj.bean.Car"></bean> <bean id="user" class="com.zzj.bean.User" autowire="byName"></bean> </beans>
(4)测试
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); User user = (User) context.getBean("user"); user.startCar(); }
1.2、@Autowired注解实现自动装配(byType)
修改User.java文件和XML配置文件就行了。
(1)User.java
import org.springframework.beans.factory.annotation.Autowired; public class User { @Autowired private Car car; public void startCar(){ car.start(); } }
注:此时setter方法可以省掉
(2)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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="car" class="com.zzj.bean.Car"></bean> <bean id="user" class="com.zzj.bean.User"></bean> <context:annotation-config/> //开启自动注解 </beans>
注:@Autowired(byType)是spring自带的注解,也可以使用Java原生的注解:@Resource(byName)。推荐使用@Resource,更具移植性
由于@Autowired是byType类型,可能会匹配多个Bean,那么哪个才是需要的呢
这时配合限定器@Qualifier("具体Bean的名字")就可以指定匹配的Bean了
@Autowired和@Resource区别:
http://bbs.csdn.net/topics/390175654