zoukankan      html  css  js  c++  java
  • @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

      

  • 相关阅读:
    vs2015帮助文档
    算法之冒泡排序
    c++ 离散数学 群的相关判断及求解
    Entity Framwork(EF) 7——在现在数据库的甚而上开发MVC 新项目
    ASP.NET MVC 5 一 入门
    c# winform TreeView NODE(节点) 重命名或获取节点修改后的值
    xml 中转意字符&/使用方法
    entityframework 入门-来自微软
    c# 利用 两个TREEVIEW控件完成TEENODE的鼠标拖动操作
    Winform开发框架中实现多种数据库类型切换以及分拆数据库的支持
  • 原文地址:https://www.cnblogs.com/xuwenjin/p/8877081.html
Copyright © 2011-2022 走看看