前言
先说明一下, 这三个注解都可以用在注入对象时使用. 他们两个是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
参数
总结
- @Autowired是Spring提供给我们的, @Inject(遵循JSR330规范)和@Resource(遵循JSR250规范)是javax包提供给我们的.
- @Autowired和@Inject是根据类型装配, @Resource是根据名称装配.
- @Autowired有required参数, @Inject没有.
- @Autowired配合@Qualifier可以使用名称装配, @Inject配合@Named可以使用名称装配, @Resource根据名称无法装配时, 会根据类型装配.
平时使用记住一种就可以了. 一般推荐使用 @Autowired, 毕竟你是用它们的框架.