@Autowired注解详解
先给我总结的结论
@Autowired
private UserDao userDao;
1.如果容器中匹配UserDao类型的,只有单个bean,那么直接就会为该userDao变量赋值(注:不管变量名叫什么)
2.如果容器中匹配UserDao类型的,有多个bean,那么首先看多个bean的id名,有没有叫userDao的,如果没有则会报错,如果有则使用有的那个赋值给userDao变量
3.如果容器中匹配UserDao类型的,有多个bean,但没一个id名叫userDao的,那么可以使用@Qualifier("xxx") 指定一个id为xxx的UserDao的类型给userDao变量赋值!
4.如果容器中匹配UserDao类型的,有多个bean,有一个id名叫userDao的,但是@Qualifier("userDao2"),此时
会将名为userDao2的bean赋值给userDao变量, @Qualifier指定的优先
注:单个bean不需要考虑变量名,但是多个bean,就要考虑变量名了!!
- 我打个比方,刚拿完快递来灵感了 哈哈哈
我去送快递,上面写着3栋3单元302的大帅逼收,此时如果我开门看见一个人,我会毫不犹豫的给他①,如果此时开门看到两个人,我肯定会看一下单子问谁是大帅逼,如果有人是我就给他就行②,如果没有人是,那我就原地爆炸③,如果等了一会还是没人要, 我就指定两个人的其中一个,就给他了④!!
- 解释
①处:表示只有单个bean,那么直接就会为该userDao变量赋值(注:不管变量名叫什么)
②处:有多个bean,那么首先看多个bean的id名,如果有则使用有的那个赋值给userDao变量
③处:有多个bean,那么首先看多个bean的id名,如果没有则会报错
④处:有多个bean,但没一个id名叫userDao的,那么可以使用@Qualifier(“xxx”)指定
- 准备工作
1、一个接口,两个实现类
public interface UserDao {
void save();
}
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("UserDaoImpl save()...");
}
}
public class UserDaoImpl2 implements UserDao {
@Override
public void save() {
System.out.println("UserDaoImpl2 save()...");
}
}
- 测试第一点:只有单个bean
1、spring中的配置
<bean id="userDao" class="com.wzj.dao.impl.UserDaoImpl"> </bean>
2、测试
@RunWith(SpringJUnit4ClassRunner.class) //SpringJUnit4ClassRunner在spring-test包中
@ContextConfiguration("classpath:applicationContext.xml")
public class UserDaoTest {
//类型注入
@Autowired
private UserDao ud;
@Test
public void test1(){
ud.save();
}
}
结果:UserDaoImpl save()…
- 测试第二点:有多个bean,但是id没有叫userDao的!!
1、spring中的配置
<bean id="userDaoImpl" class="com.wzj.dao.impl.UserDaoImpl"> </bean>
<bean id="userDaoImpl2" class="com.wzj.dao.impl.UserDaoImpl2"></bean>
2、测试
@RunWith(SpringJUnit4ClassRunner.class) //SpringJUnit4ClassRunner在spring-test包中
@ContextConfiguration("classpath:applicationContext.xml")
public class UserDaoTest {
//类型注入
@Autowired
private UserDao userDao;
@Test
public void test1(){
userDao.save();
}
}
3、控制台
nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.wzj.dao.UserDao' available: expected single matching bean but found 2: userDaoImpl,userDaoImpl2
意思:就是有多个,不能确定使用哪一个,可以使用 @Qualifier("userDaoImpl")指定一个,这样就不会报错了!
- 测试第二点:有多个bean,但是id有叫userDao的!!
1、spring的配置文件
<bean id="userDao" class="com.wzj.dao.impl.UserDaoImpl"> </bean>
<bean id="userDao2" class="com.wzj.dao.impl.UserDaoImpl2"></bean>
2、测试
@RunWith(SpringJUnit4ClassRunner.class) //SpringJUnit4ClassRunner在spring-test包中
@ContextConfiguration("classpath:applicationContext.xml")
public class UserDaoTest {
@Autowired
private UserDao userDao;
@Test
public void test1(){
userDao.save();
}
}
3、控制台
此时虽然有多个bean匹配,但是不会报错
控制台输出:UserDaoImpl save()...
- 测试第三点:有多个bean,id没有叫userDao的,但是可以使用@Qualifier解决
1、spring的配置文件
<bean id="userDaoImpl" class="com.wzj.dao.impl.UserDaoImpl"> </bean>
<bean id="userDaoImpl2" class="com.wzj.dao.impl.UserDaoImpl2"></bean>
2、测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class UserDaoTest {
@Qualifier("userDaoImpl")
@Autowired
private UserDao userDao;
@Test
public void test1(){
userDao.save();
}
}
3、控制台
UserDaoImpl save()...
- 测试第四点:变量名和@Qualifier,结果@Qualifier优先
1、spring的配置文件
<bean id="userDao" class="com.wzj.dao.impl.UserDaoImpl"></bean>
<bean id="userDao2" class="com.wzj.dao.impl.UserDaoImpl2"></bean>
2、测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class UserDaoTest {
@Qualifier("userDao2")
@Autowired
private UserDao userDao;
@Test
public void test1(){
System.out.println(userDao);
}
}
3、控制台
com.wzj.dao.impl.UserDaoImpl2@6a01e23
来自:虽然帅,但是菜的cxy