Spring 知识 -- 注解 -- @Resource 和 @Autowired

本文最后更新于:4 个月前

  • 相同点:

    1. 都是bean注入时使用

    2. 二者都可以写在字段上用来消除Setter和Getter方法

    3. 也可以写在Setter方法上

  • 不同点:

    1. @Resource 是属于Java EE的,在Javax包下

      @Autowired 是属于Spring boot的

    2. 自动装配的类型-@Resource

      @Resource 默认按照byName注入,但也可以用byType注入

      spring将其注解的name属性解析为bean的名字,而type属性解析为bean的类型。

      1. 若同时指定了name和type属性,则从spring上下文中找到唯一的匹配的bean进行装配,找不到则抛出异常。

      2. 如果指定了name,则从上下文中查找名称(id)匹配的bean,找不到同上。

      3. 如果指定了type,则从上下文中查找类似匹配的bean,找不到或者找到多个都会抛出异常。

      4. 如果既不指定name,也不指定type,这时将通过反射机制使用默认的byName,没有匹配则退为一个原始类型进行匹配。

    3. 自动装配的类型-@Autowired

      默认通过byType自动注入,如果 byType 找不到或者找到了多个,则通过属性的 byName 注入,如果 byName 也找不到,则报错。

      默认情况下它要求依赖的对象必须存在,如果允许 null,则可以将它的 required 属性设置为 false。

      如果想按照名字来自动装配,则需结合 @Qulifier 注解使用:

      @Autowired
      @Qulifier("userDao")
      private UserDao userDao;

个人感觉用Autowired会更整齐,而且也方便。