您的位置:首页 > 其它

自动装配Bean

2016-12-20 17:19 459 查看
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:

(1)Car.java


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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: