• @Resource和@Autowired区别


    @Resource和@Autowired都是做bean的注入时使用

    历史:  @Autowired     属于Spring的注解                org.springframework.beans.factory.annotation.Autowired

         @Resource     不属于Spring的注解,JDK1.6支持的注解   javax.annotation.Resource

    共同点:装配bean. 写在字段上,或写在setter方法

    不同点:@Autowired  默认按类型装配   

              依赖对象必须存在,如果要允许null值,可以设置它的required属性为false   @Autowired(required=false)

              也可以使用名称装配,配合@Qualifier注解

        @Resource  默认按名称进行装配,通过name属性进行指定

    看个例子:

      新建一个接口BaseService,两个实现类AServiceImpl、BServiceImpl

    public interface BaseService {
        
        void print();
    
    }
    @Service
    public class AServiceImpl implements BaseService {
    
        @Override
        public void print() {
            System.out.println("aaa");
        }
    
    }
    @Service
    public class BServiceImpl implements BaseService {
    
        @Override
        public void print() {
            System.out.println("bbb");
        }
    
    }

    再建一个测试类:

    /**
     * 测试@Resource与@Autowired注入的区别
     * 
     * @author xuwenjin
     */
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = App.class)
    public class TestSet {
        
        @Autowired
        private BaseService service;
        
        @Test
        public void test(){
            String className = service.getClass().getName();
            System.out.println(className);
            service.print();
        }
    
    }

    执行test方法,报错,结果如下:

    Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.xwj.service.BaseService' available: expected single matching bean but found 2: AServiceImpl,BServiceImpl

    在@Autowired下增加@Qualifier注解

        @Autowired
        @Qualifier("AServiceImpl")
        private BaseService service;

    再执行test方法,成功,结果如下:

    com.xwj.service.AServiceImpl
    aaa

    我们再来试试@Resource注解

      @Resource
        private BaseService service;

    执行test方法,报错异常跟只用@Autowired情况一样。再加上name属性:

        @Resource(name = "AServiceImpl")
        private BaseService service;

    再执行test方法,成功

    总结:

      一个接口,多个实现类,Autowired就不知道注入哪一个实现类,而Resource有name属性,可以区分。

      参考资料:https://www.zhihu.com/question/39356740

      

  • 相关阅读:
    实验一 开发环境的熟悉(小组)
    第六章家庭作业
    Linux常用命令-1
    Linux简介
    Python for写死循环?
    python将某个列表按元素值分成多个子列表
    xshell 5连接NAT模式的虚拟机
    python中remove的一些坑
    Sender IP字段为"0.0.0.0"的ARP请求报文
    免费ARP
  • 原文地址:https://www.cnblogs.com/xuwenjin/p/8877081.html
Copyright © 2020-2023  润新知