• @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实例


  • 相关阅读:
    软考架构师考试内容
    强化您的应用安全,从app加固开始
    Netty学习笔记之Java I/O
    ThreadLocal 源码分析
    EDAS 流量入口网关最佳实践
    【无标题】CTreeCtrl更改-/+展开按钮颜色
    交换机与路由器技术-07-静态路由配置
    CogView中的Self Attention
    android开发中常用的Eclipse快捷键详细整理
    快速实现抖音上下滑动,你不知道的ViewPager2用法,信息量巨大,建议收藏点赞。老tier~
  • 原文地址:https://blog.csdn.net/zl18603543572/article/details/127111634