@Autowired:自动装配,不用在bean里写<property>属性来指定所依赖的属性
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 > |
这里我们需要写一个<property name="userDao" ref="userDaoImpl"></property>来给bean注入属性。使用了annotation之后呢,就可以不用这样写
了。直接去掉<property>属性
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 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来进行注入