@Autowired注解详解

@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,就要考虑变量名了!!
  • 我打个比方,刚拿完快递来灵感了 哈哈哈
我去送快递,上面写着33单元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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值