va:http://blog.csdn.net/ethanwhite/article/details/51879871
当使用JSR-330标准的注解时,了解其和Spring注解的不同点也是十分必要的,参考如下表:
Spring | javax.inject.* | javax.inject 限制 |
---|---|---|
@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 |
|
- JSR330:Dependency Injection for Java
- JSR250:Common Annotation for Java
@Inject | @Autowired | @Resource | |
---|---|---|---|
隶属包 | javax.inject | org.springframework.bean.factory | javax.annotation |
提供者 | JSR330中的规范 | Spring | JSR250规范的实现 |
实现依赖注入 | AutowiredAnnotationBeanPostProcessor | CommonAnnotationBeanPostProcessor | |
使用 | 不加@Named注解,需要配置与变量名一致即可 @Inject @Named(“mongo”) private Mongo mongo; | 有个required属性,可以配置为false,required=false后,当没有找到相应bean的时候,系统不抛错。 @Autowired private Mongo Mongo; | 一般会指定一个name属性 @Resource(name="userMapper") private UserMapper userMapper; |
相异之处 | 默认 autowired by type 可以通过@Qualifier显式指定 autowired by qualifier name | 默认autowired by field name 如果autowired by field name失败,会退化为autowired by type 可以通过@Qualifier显式指定 autowired by qualifier name 如果autowired by qualifier name 失败,会退化为 autowired by field name。但是这时候如果autowired by field name失败,就不会再退化为autowired by type 了 |
via:http://blog.csdn.net/u012734441/article/details/51706504