• @Autowired注解与@Resource注解的区别


    一、注解的出处

    @Autowired是Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired

    @Resource是由J2EE提供的注解,需要导入包javax.annotation.Resource

    也就是说@Autowired是外部包导入的,而@Resource是J2EE自己的

    二、自动注入规则

    @Autowired默认按照byType自动注入

    @Autowired采取的是按照类型进行自动注入的,Autowired源码中只有一个属性required(稍后介绍)。

    说明@Autowired无法人为去干预注入规则的,然后当容器中同一类型的bean存在多个的话,

    @Autowired该如何去选择呢,这时就需要@Qualifier注解来帮忙了。

    @Qualifier跟@Autowired来自同一包下,存在一个属性value,我们可以通过value属性来确定

    @Autowired具体注入的是哪一个bean。

    如果匹配不到对象时,将会抛出异常BeanCreationException。

    如果匹配到多个对象时,也会抛出异常。

    public class UserService {
        @Autowired
        @Qualifier(value="userDao1")
        private UserDao userDao;
        private ManDao manDao; 
     
        @Autowired
        public void setManDao(@Qualifier("manDao") ManDao manDao) {
          this.manDao = manDao;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    @Resource默认按照byName自动注入

    @Resource注解在注入规则上存在两个属性:name、type

    1、若没有使用属性,则通过反射机制,默认按照byName方式进行装配,如果没有匹配,则再类型进行装配;

    2、若只使用了name属性,则使用byName的自动注入策略,从上下文中查找名称id,如果匹配不到则抛出异常;

    3、若只使用了type属性,则使用byType自动注入策略,从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个都会抛出异常;

    4、若两个属性都使用了,则需要找到唯一匹配的bean进行装配,找不到则抛出异常。

    public class UserService {
        @Resource
        private UserDao userDao;
        @Resource(name="studentDao")
        private StudentDao studentDao;
        @Resource(type="TeacherDao.class")
        private TeacherDao teacherDao;
        @Resource(name="manDao",type="ManDao.class")
        private ManDao manDao;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    三、注入时对象是否存在

    @Autowired:默认按照类型进行装配,默认情况下要求依赖的对象必须存在,如果需要允许null值,则需要设置required属性为false,@Autowired(required=false)。

    @Resource:默认按照名称进行装配,允许为null。

    四、使用位置

    两者都可以写在字段和setter方法上,如果写在字段上,那么就不需要在写setter方法。

    推荐使用@Resource注解在字段上,这样不仅不需要写setter方法了,而且由于@Resource属于J2EE,降低与spring的耦合。

  • 相关阅读:
    说说 JSON 格式的弊端与解决方法
    什么是物联网
    一线大厂必问微服务系列——SpringCloudAlibaba整合Sleuth
    MongoDB——centOS7环境Mongodb权限管理(图解版)
    MVC模式
    wifi的 2.4G 和5G
    谈笑风声的秘密
    “蔚来杯“2022牛客暑期多校训练营10
    JavaScript 在 Promise.then 方法里返回新的 Promise
    解决Git报错:fatal: detected dubious ownership in repository at
  • 原文地址:https://blog.csdn.net/m0_67266585/article/details/126012105