@Autowired和@Resource的区别。网上大部分人都是一个抄一个,感觉很多人都说的不完全对(可能我也是)。

网上很多人都是一个抄一个,我经过验证发现@Autowired并不是简单地只按照类型注入,如果有多个类型还会进一步以变量名为name来判断一下。
如果需要使用@Autowired并指定变量名,可以搭配@Qualifier
**@Autowired:**自动按照类型注入。只要容器中有唯一的一个bean的类型和要注入的变量类型匹配,就可以注入成功。

​ 如果IOC容器中没有任何bean的类型和要注入的类型匹配,就要报错。

​ 如果IOC容器中有多个类型匹配时,首先按照类型圈定出来可匹配的对象,然后使用变量名称(或者形参名称)作为bean的name,在圈定出的几个对象中来查找,如果有name一样的,就注入,没有就出错。
这里有个隐藏的小知识点,一个可以有多个name ,每个有一个默认的name和id同名

**@Resource**直接按照bean的Name注入,**如果没有指定name,就把id当作name(因为默认的name和id相同),**它可以独立使用,如果能找到对应name就直接注入,如果找不到就回退回按照类型注入,如果只找到一个同类型的,就注入,如果有多个,报错.

空说无凭,来点代码测试一下。

public interface IAccountDao {
    void saveAccount();
}
public class AccountDaoImpl1 implements IAccountDao {

    public AccountDaoImpl1() {}

    @Override
    public void saveAccount() {
        System.out.println("111保存成功!");
    }
}
public class AccountDaoImpl2 implements IAccountDao {
    @Override
    public void saveAccount() {
        System.out.println("222保存成功!");
    }
}
public interface IAccountService {
    void saveAccount();
}
@Component
public class AccountServiceImpl implements IAccountService {
    @Autowired
    private IAccountDao accountDao1;
    public void saveAccount() {
        System.out.println(accountDao1.getClass().getName());
        accountDao1.saveAccount();
    }
}
public class client {
    public static void main(String []args){
        ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
        AccountServiceImpl as= (AccountServiceImpl) ac.getBean("accountServiceImpl");
        as.saveAccount();
        ((ClassPathXmlApplicationContext) ac).close();
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
              http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
        ">
    <context:component-scan  base-package="com.itheima"/>
    <bean id="accountDao1"  class="com.itheima.dao.impl.AccountDaoImpl1"/>
    <bean id="accountDao2"  class="com.itheima.dao.impl.AccountDaoImpl2"/>
</beans>

先测@Autowired碰见多个多同类型时以变量名来找的。
直接用上面代码,是可以得到值的
在这里插入图片描述
如果把上面AccountServiceImpl的accountDao1改成ad,就会报错在这里插入图片描述如果再再xml中的某个name上加上一个ad,这里我在accountDao2中加,如下

又能取到值了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值