• @Autowired与@Resource区别


    1 基本说明
    1.1 相同点

    @Resource和@Autowired都可以作为注入属性的修饰,在接口仅有单一实现类时,两个注解的修饰效果相同,可以互相替换,不影响使用。

    1.2 不同点

    @Autowird 属于spring框架,默认使用类型(byType)进行注入,默认情况下必须要求依赖对象必须存在(不存在会报错),可以通过required=false属性设置非必须 ,也可以结合@Qualifier注解指定名称进行使用。


    @Resource是JavaEE自带的注解,默认按照名称进行装配,可以通过name属性指定名称,如果没有指定name属性,当注解写在字段上时,默认取字段名进行查找注入,如果写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时再按照类型(byType)进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

    2 @Autowird
    2.1 只有一个实现类时

    @Autowird 属于spring框架,默认使用类型(byType)进行注入,例如下面代码:

    public interface TestService {
        void test();
    }
    
    import org.springframework.stereotype.Service;
    
    @Service
    public class TestServiceImpl1 implements TestService{
        @Override
        public void test() {
            System.out.println("TestServiceImpl1 test 方法 ");
        }
    }
    
    

    然后在使用时注入

      @Autowired
      private  TestService testService;
    

    系统会根据接口进行注入,如果这个接口只有一个实现类,那么会正常注入,如果没有实现类,它就会报错,可以进行如下处理

      @Autowired(required = false) 
      private  TestService testService;
    
    2.2 有多个实现类时

    在这里插入图片描述

    public interface TestService {
        void test();
    }
    

    然后定义两个实现类

    import org.springframework.stereotype.Service;
    
    @Service
    public class TestServiceImpl1 implements TestService{
        @Override
        public void test() {
            System.out.println("TestServiceImpl1 test 方法 ");
        }
    }
    
    

    TestServiceImpl2

    import org.springframework.stereotype.Service;
    
    @Service
    public class TestServiceImpl2 implements TestService{
        @Override
        public void test() {
            System.out.println("TestServiceImpl2 test 方法 ");
        }
    }
    
    

    然后在测试使用注入时,必然会报错,因为@Autowired先按照byType匹配,匹配到了“testServiceImpl1”和“testServicempl2”,结果不唯一

      @Autowired
      private  TestService testService;
    

    可以结合@Qualifier

      @Autowired
      @Qualifier("testServiceImpl1")
      private  TestService testService;
    
    3 @Resource
        @Resource
        private  TestService testService;
    

    有多个实现类时,@Resource先按照byName匹配,此时的name是“testService”,没有匹配结果,只能按照byType进行配置,此时又匹配到了“testServiceImpl1”和“testServiceImpl2”,结果不唯一,只能抛出异常.

    3.1 testServiceImpl1
    @Resource
    private TestService testServiceImpl1;
    

    这次就能正确执行,并且输出结果为“userServiceImpl1”,@Resource通过byName匹配到了唯一的bean实例


  • 相关阅读:
    JDK17新特性
    kubernetes API Server 看这篇试试
    第五章:指令集
    QTableView获取可见的行数
    c++拷贝构造【显式调用】和运算符=重载构造【隐式调用】解析
    经典文献阅读之--Online Map Vectorization for Autonomous Driving:(基于栅格化的在线地图矢量化)
    毕业设计案例:Python实现疫苗接种数据库管理系统
    WebDAV之葫芦儿·派盘+PassStore
    图像绘制-线段、矩形、圆形、椭圆等
    systemverilog学习 ---- 进程
  • 原文地址:https://blog.csdn.net/zl18603543572/article/details/127111634