@Autowired:自动装配,不用在bean里写
1
2
3
4
@Autowired
public void setUserDao(UserDao userDao) {
this .userDao = userDao;
}
Autowired:表示spring会在容器里找跟setUserDao(UserDao userDao)这里面的参数相同类型的bean,然后给注入进来。
例如:原来用XML方式的写法
1
2
3
4
5
< bean id = "userDaoImpl" class = "com.fz.annotation.dao.impl.UserDaoImpl" >
</ bean >
< bean id = "userService" class = "com.fz.xml.service.UserService" >
< property name = "userDao" ref = "userDaoImpl" ></ property >
</ bean >
这里我们需要写一个
了。直接去掉
1
2
3
4
< bean id = "userDaoImpl" class = "com.fz.annotation.dao.impl.UserDaoImpl" >
</ bean >
< bean id = "userService" class = "com.fz.xml.service.UserService" >
</ bean >
然后在userService里的userDao的set方法上加入@Autowired即可
现在测试:控制台打印出userDaoImpl里的User add.....信息,表示userDao已经获取到
1
2
3
4
5
6
[@Test](https://my.oschina.net/azibug)
public void getProperties(){
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext( "applicationContext_annotation.xml" );
UserService userService = (UserService) ctx.getBean( "userService" );
userService.userAdd();
}
通过测试,可以看出。@Autowired是根据set方法里的bean的类型来去容器里找相应类型的bean,也就是使用了byType
假如现在我们配置两个相同类型的userDaoImpl
1
2
3
4
5
6
<bean id= "userDaoImpl" class = "com.fz.annotation.dao.impl.UserDaoImpl" >
</bean>
<bean id= "userDaoImpl1" class = "com.fz.annotation.dao.impl.UserDaoImpl" >
</bean>
<bean id= "userService" class = "com.fz.annotation.service.UserService" >
</bean>
此时测试的时候将会报错:expected single matching bean but found 2。
但是,假如实际开发中我们就需要两个类型相同的bean呢?可以加上@Qualifier("userDaoImpl")
1
2
3
4
@Autowired
public void setUserDao( @Qualifier ( "userDaoImpl" )UserDao userDao) {
this .userDao = userDao;
}
@Qualifier``(``"userDaoImpl"``):表示使用名字为userDaoImpl的bean来进行注入,现在测试的话同样没问题。
也可以写在Autowired之后
@Autowired
@Qualifier("userDaoImpl")
public void setUserDao(UserDao userDao)
总结:
1、@Autowired可以放在属性上,任意方法上,建议放在属性的set方法上。
2、@Autowired默认是按byType来查找bean的,如果找到多个同一类型的bean,则会报错
3、如果想按byName来查找bean,那就@Autowired和@Qualifier结合使用:`@Qualifier``(``"userDaoImpl"``):表示使用名字为userDaoImpl的bean来进行注入`

