JSR-330标准注解
Last updated
Last updated
Java依赖注入标准(JSR-330,Dependency Injection for Java)1.0 规范主要是面向依赖注入使用者,而对注入器实现、配置并未作详细要求。目前 Spring 、Guice 已经开始兼容该规范,JSR-299(Contexts and Dependency Injection for Java EE platform,参考实现 Weld )在依赖注入上也使用该规范。JSR-330 规范并未按 JSR 惯例发布规范文档,只发布了规范 API 源码。
从Spring 3.0开始,Spring开始支持JSR-330标准的注解。这些注解和Spring注解扫描的方式是一直的,开发者只需要引入javax.inject
即可。
JSR-330中的标准注解与Spring中的注解的对应关系如下:
为什么要使用JSR-330提供的标准注解
JSR-330相当于接口,而Spring是一种实现,在编程中一般面向接口,而不依赖具体实现。
Spring
JSR-330
说明
@Autowired
@Inject
@Inject注解没有required属性,但是可以通过Java 8的Optional取代
@Component
@Named
JSR_330标准并没有提供复合的模型,只有一种方式来识别组件
@Scope(“singleton”)
@Singleton
JSR-330默认的作用域类似Spring的prototype,然而,为何和Spring的默认保持一致,JSR-330标准中的Bean在Spring中默认也是单例的。如果要使用非单例的作用域,开发者应该使用Spring的@Scope注解。java.inject也提供一个@Scope注解,然而,这个注解仅仅可以用来创建自定义的作用域时才能使用。
@Qualifier
@Qualifier/@Named
javax.inject.Qualifier仅仅是一个元注解,用来构建自定义限定符的。而String的限定符(比如Spring中的@Qualifier)可以通过javax.inject.Named来实现
@Value
-
不等价
@Required
-
不等价
@Lazy
-
不等价
ObjectFactory
Provider
javax.inject.Provider是SpringObjectFactory的另一个选择,通过get()方法来代理,Provider可以和Spring的@Autowired组合使用