要说明JSR-250先要解释清楚JSR-175,要解释清楚JSR就的先了解JCP是什么。网上资料不少,就不细说了,简单的说JCP(Java Community Process)是管理Java生态(包括J2SE、J2EE等等)发展的合做组织。JSR(Java Specification Request)就是组织内的成员针对Java的发展提出的一些需求,经过审核以后即会融入到新版本的Java功能中成为Java的一项特性或功能,不一样的发行版本和虚拟机都会遵照这些约定。java
JSR-175的全文标题是 A Metadata Facility for the Java Programming Language (为Java语言提供元数据设施)。它明确提出了在Java平台引入“元编程”(Meta Programming)的思想,要求提供对“元数据”(Meta Data)的支持。这就是咱们如今大量使用的“@”注解(Annotation)功能的最先来源。JSR-175以后的JSR-181(Web服务支持)、JSR-250、JSR-330都是基于“元数据”功能提出的一些更细节的实现。spring
至于“元编程”、“元数据”是什么这里就不详细展开说明了,它的理论很早就提出了,听说最先是在Lisp这一类函数式编程语言上开始使用的。网上有不少相关的资料,简单的说它就是“对源码进行编码”,好比下面这样:编程
class MyClass { @Autowired private Interface support; }
经过@Autowired这个注解来对support这个域进行编码就能够很轻松的扩展原先类的功能。框架
JSR-250主要是围绕着“资源”的使用预约义了一些注解(Annotation),这里的“资源”能够理解为一个Class类的实例、一个JavaBean、或者一个Spring中的Bean。编程语言
JSR-250相关的注解所有在 javax.annotation 和 javax.annotation.security 包中,分红2个部分——资源定义和权限控制。它并无提供具体的实现方式,仅仅是提供了指导性的文档和几个注解,由具体的框架去实现。函数式编程
javax.annotation 中包含一下几个注解:函数
仔细看JSR-250定义的这些注解就会发现,他们都是关于“资源”的构建、销毁、使用的。Spring实现了@PostConstruct、@PreDestroy和@Resource。工具
javax.annotation.security 包中有如下内容:网站
security中的内容是在资源建立以后对资源的使用进行管理。和常规的权限控制模型同样——定义角色(@DeclareRoles )、肯定角色对资源的控制权限(@DenyAll、@PermitAll 、@RolesAllowed )。Spring并无实现这里的任何一个注解,在这里就不深刻介绍了。这一块内容在J2EE的构建中有很多的应用。ui
在没有仔细看Spring的官方文档和JSR-250以前,我一直觉得@Resource这个注解和@Autowired是2个不一样的功能,更早的时候还觉得是管理什么Properties资源的,不少网上的内容也写得比较模糊。虽然@Resource的实现是在 CommonAnnotationBeanPostProcessor 而@Autowired 是在 AutowiredAnnotationBeanPostProcessor,可是实际上二者的功能是重叠的,或者说@Resource的提供的功能是@Autowired的子集。
在Spring中使用@Resource注解时,把Bean理解为一项资源就很好理解了。下面经过一些简单的例子来介绍@Resource的使用。
@Resource的功能是告诉IoC容器标记的位置须要什么样的“资源”,以下:
class Abc {} class Xyz {} class Implement { @Resource private Abc abc; private Xyz xyz; @Resource private ApplicationContext context; @Resource(name="b_instance") public void setInject(Xyz xyz) { this.xyz = xyz; } }
<beans> <context:annotation-config/> <bean id="abc" class="x.y.Abc" /> <bean id="xyz_instance" name="inject" class="x.y.Xyz" /> <bean class="x.y.Implement" /> </beans>
运行后,IoC会向标记了@Resource的位置注入Bean——是否是感受和@Autowired如出一辙?可是须要注意的是虽然二者最后都是注入一个Bean,可是@Resource和@Autowired的处理过程是不同的。@Autowired若是没有提供任何参数,那么他优先按照类型注入,若是要对细节进行控制能够配合Primary和Qualifiers功能,详见注解自动装载的介绍。@Resource是按照命名来注入资源的,以上面的代码为例子:
因此@Resource的装载资源过程是:1)匹配name参数;2)没有name参数时会根据setter或域的名称来匹配Bean的名称;3)仍是匹配不上就根据标记位置的类型来注入数据。
与@Autowired相比主要有如下几点区别:
总的来讲若是是按照类型注入依赖对象,那么最终获得的结果并无任何差别,只是执行过程上有差异。若是按Bean的名称使用,@Resource比@Autowired便捷一些,可是功能少不少。
我的建议若是开发的是一个面向终端用户的应用,好比Web应用、网站什么的,直接用@Autowired就行了。若是制做的是一个给别的开发人员使用的工具,能够考虑@Resourec,他能获得更多框架的支持。
@PostConstruct 与@PreDestroy也是JSR-250中定义的注解,Spring都实现了他们的功能,使用方法能够查看 Bean的定义与控制 相关的说明和介绍。