@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来进行注入`