Spring装配对JSR-250的@Resourse的支持

Spring在通过注解来装配Bean的时候,可以使用三种注解。
1. @Autowired
2. @Inject
3. @Resource

1. @Resource

@Resource是JSR-250(Java Specification Requests 简称JSR,意思是JAVA规范提案)的一部分。Spring在2.5版本实现了对它的支持。

1.1 什么是@Resource

@Resource是JCP组织定义的用于依赖注入的标准注解,而Spring支持此标准。就是说可以在Spring中使用此注解。

1.2 @Resource有什么用

@Resourcek可以用于装配Bean,作用等同于@Autowired。

1.3 为什么要用@Resource

其实与其说为什么要用@Resource,还不如说是在什么情况下使用@Resource,或者@Resource与其他的注解解决方案来对比有什么区别呢?

1.3.1 来源上

区别:@Resource来自JCP组织定义,可以说是JAVA的标准规范。当然与此相同的还有来自JSR-330的@Inject注解,而@Autowired是来自Spring自己的注解。
建议:在项目中使用@Resource和@Inject,这两个注解来自JAVA自身,而@Autowired是来自Spring自身将会带入对Spring的耦合。即使这只是一个注解。

1.3.2 对注解装配的两个局限的处理

1.3.2.1 对无匹配Bean的处理

1.3.2.1.1 @Resource

没有发现的Bean,抛出异常(来自搜索,没有检验)

1.3.2.1.2 @Inject

抛出异常,@Inject注解不允许注入不成功

1.3.2.1.3@Autowired

如果设置required属性为true(默认),则如果没有匹配Bean则抛出异常。如果设置required属性为false,没有匹配的Bean则不装配,或者说是装配NULL。

1.3.2.1.4总结:

处理规则的差不多,如果Bean里面的属性是必须的,那就不如早点抛出错误吧,总比报空指针要好。

1.3.2.2 多个匹配的Bean的处理

1.3.2.2.1 @Resource

对于多个可以匹配的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方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;(并不太清楚回退到原始类型进行匹配时什么意思?需要写代码测试一下)

1.3.2.2.2 @Inject

@Inject推荐通过@Qualifier来自定义注解来限定Bean。自定义注解的方式跟@Autowired使用@Qualifier来自定义注解的方式一样,但是这两个@Qualifier是不同的注解,这要分清楚。
@Inject还提供了一个@Name注解,这个注解根据Bean的id来匹配Bean。其实@Name也就是使用@Qualifier注解所标注的注解

1.3.2.2.3 @Autowired

@Autowired使用注解@Qualifer来限制Bean的匹配。可以如同@Name那样使用。
例如:

@Autowired
@Qualifer("test")
private Boot boot;

这样就指定了只有id为test的Bean才可以装配。
或者是使用@Qualifer来标注自定义的注解,以定义自己的注解。
这么说起来,其实@Autowired跟@Inject是非常非常相似的,无论是语法还是用法上。

1.3.2.2.4 总结

在需要限定多个Bean的匹配的时候,其实三个注解的想法都基本相同,硬要说些不同,那么就是@Autowired和@Inject需要引入其他的注解,而@Resource通过自身的属性便是可以。大部分人都认为使用@Resource比较优雅,我也认为这样少引入一些属性也确实好那么一点点。

你可能感兴趣的:(Spring装配对JSR-250的@Resourse的支持)