@Autowired, @Inject, @Resource 三个注解的作用和区别

前言

先说明一下, 这三个注解都可以用在注入对象时使用. 他们两个是javax包下自带的, 一个是由spring提供给我们的.

@Autowired

先说Autowired, 因为他是我们大多数人经常使用到的, 它是由spring为我们提供的依赖注入的注解,

  • 它可以用在变量, 构造器和setter方法上.
  • 它是根据 类型 进行装配bean的, 提供一个 required 参数, 指定为false时, 当无法注入时, 不会报错.
  • 它可以配合 @Qualifier 注解进行使用, 通过它的 value 参数, 指定注入时需要的bean的 名称, 就可以根据名称进行注入了.

@Resource

这个注解大多数人不常使用, 它是javax包提供的, 基于 JSR250 的注解. 我平时更多的是使用它.

  • 它可以用在字段或setter方法上.
  • 它是根据 名称 进行装配bean的, 提供一个 name 参数, 但是默认情况下不指定的话, 作用在参数上时会根据参数名注入, 作用在setter方法时, 会根据属性名进行装配, 都无法查找时, 会根据类型进行匹配.

@Inject

这个注解应该大多数人都没见过, 在写文章之前, 我也没见过 😃
这个注解是遵循 JSR330 规范的, 是由javax包提供的. 这里简单讲解一下(其实就是@Autowired的翻版).
它可以作用在@Autowired能作用的地方, 并且默认也是根据类型装配, 通过 @Named 修改为根据 名称 装配.
它与Autowired不同点在于它没有 required 参数

总结

  1. @Autowired是Spring提供给我们的, @Inject(遵循JSR330规范)和@Resource(遵循JSR250规范)是javax包提供给我们的.
  2. @Autowired和@Inject是根据类型装配, @Resource是根据名称装配.
  3. @Autowired有required参数, @Inject没有.
  4. @Autowired配合@Qualifier可以使用名称装配, @Inject配合@Named可以使用名称装配, @Resource根据名称无法装配时, 会根据类型装配.

平时使用记住一种就可以了. 一般推荐使用 @Autowired, 毕竟你是用它们的框架.