Spring在通过注解来装配Bean的时候,可以使用三种注解。
1. @Autowired
2. @Inject
3. @Resource
@Resource是JSR-250(Java Specification Requests 简称JSR,意思是JAVA规范提案)的一部分。Spring在2.5版本实现了对它的支持。
@Resource是JCP组织定义的用于依赖注入的标准注解,而Spring支持此标准。就是说可以在Spring中使用此注解。
@Resourcek可以用于装配Bean,作用等同于@Autowired。
其实与其说为什么要用@Resource,还不如说是在什么情况下使用@Resource,或者@Resource与其他的注解解决方案来对比有什么区别呢?
区别:@Resource来自JCP组织定义,可以说是JAVA的标准规范。当然与此相同的还有来自JSR-330的@Inject注解,而@Autowired是来自Spring自己的注解。
建议:在项目中使用@Resource和@Inject,这两个注解来自JAVA自身,而@Autowired是来自Spring自身将会带入对Spring的耦合。即使这只是一个注解。
没有发现的Bean,抛出异常(来自搜索,没有检验)
抛出异常,@Inject注解不允许注入不成功
如果设置required属性为true(默认),则如果没有匹配Bean则抛出异常。如果设置required属性为false,没有匹配的Bean则不装配,或者说是装配NULL。
处理规则的差不多,如果Bean里面的属性是必须的,那就不如早点抛出错误吧,总比报空指针要好。
对于多个可以匹配的Bean,@Resource通过它的两个的属性来限制。@Resource有两个属性,一个是name,一个是type.通过下面的限定规则,可以看出@Resource是name优先type,而且不用添加其他犹如@Qualifier的注解
@Resource限定规则
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;(并不太清楚回退到原始类型进行匹配时什么意思?需要写代码测试一下)
@Inject推荐通过@Qualifier来自定义注解来限定Bean。自定义注解的方式跟@Autowired使用@Qualifier来自定义注解的方式一样,但是这两个@Qualifier是不同的注解,这要分清楚。
@Inject还提供了一个@Name注解,这个注解根据Bean的id来匹配Bean。其实@Name也就是使用@Qualifier注解所标注的注解
@Autowired使用注解@Qualifer来限制Bean的匹配。可以如同@Name那样使用。
例如:
@Autowired
@Qualifer("test")
private Boot boot;
这样就指定了只有id为test的Bean才可以装配。
或者是使用@Qualifer来标注自定义的注解,以定义自己的注解。
这么说起来,其实@Autowired跟@Inject是非常非常相似的,无论是语法还是用法上。
在需要限定多个Bean的匹配的时候,其实三个注解的想法都基本相同,硬要说些不同,那么就是@Autowired和@Inject需要引入其他的注解,而@Resource通过自身的属性便是可以。大部分人都认为使用@Resource比较优雅,我也认为这样少引入一些属性也确实好那么一点点。