• Spring @Autowired和@Resource


    @Autowired和@Resource

    共同点:都是装配bean的注解

    不同点:

    @Autowired

    提供者:@Autowired是Spring提供的注解

    装配方式:ByType(通过类的类型)装配

    第一种注入方式

    1 // 用于字段上
    2 @Autowired
    3 private TestDao testDao;

    第二种注入方式

    1 //同时setter方法注入 
    2 //spring boot推荐使用 setter注入
    3     @Autowired
    4     public void setTestDao (TestDao testDao) {
    5        this.trayDao = trayDao;
    6     }

    个人理解:因为spring是通过注入接口找到实现该接口的类,再为这个实现类创建一个对象,最后注入对象的。

    所以意味着当一个接口有多个实现类时,想要通过type的来注入的话,Spring就会发现有两个实现类而报错。

    怎么解决一个接口多个实现类的情况。可以通过ByName来注入。

    通过为多个实现类取名字,最后指定名字来注入对象。

    当不能通过ByType注入的时候,就通过@Qualifier注解ByName注入

    1 @Autowired  @Qualifier("myTestDao")
    2 private TestDao testDao;

    @Resource

    首先@Resource是J2EE提供的注解

    @Resource一开始就完成@Autowired+ @Qualifier的功能

    @Resource既可以ByType也可以ByName来注入。

    用法

    1.同时指定name和type时,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常

    1 @Resource(type = AndroidService.class,name = "aaa")
    2 private AndroidService androidService;

     2.指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常

    1 @Resource(name = "aaa")
    2 private AndroidService androidService;

    3.如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常。

    1 @Resource(type = AndroidService.class)
    2 private AndroidService androidService;

    4.如果既没有指定name,也没有指定type;则自动按byName方式进行查找(name是实现类的对象名)。

    如果没有找到符合的bean,则回退为一个原始类型进行查找,如果找到就注入。

    证明:现在不在实现类指定名字,则默认实现类对象名

    @Resource(name = "androidServiceImpl")
    private AndroidService androidService;

    注入成功

    @Resource
    private AndroidService androidServiceImpl;

    同样注入成功。

    总结

    @Autowired:bytype只适合一对一实现接口的时候

    @Resource:byName适合一对多和一对一实现接口的时候

    所以确定接口只会被单一实现的时候,使用@Autowired

    其余情况使用 @Resource

  • 相关阅读:
    搜索------深度优先DFS-----模板2:例1 例2 例3 例4
    memset
    if(!a)
    bailian 2698
    皇后问题
    搜索------深度优先DFS-----模板1:例1 例2 例3 例4
    bailian 2754八皇后
    ByteCache
    Java-IntegerCache
    JVM运行时数据区
  • 原文地址:https://www.cnblogs.com/Gang-Bryant/p/10887042.html
Copyright © 2020-2023  润新知