1、@Inject
- javax.inject
- JSR330 (Dependency Injection for Java)
這是JSR330中的規范,通過AutowiredAnnotationBeanPostProcessor類實現的依賴注入。
@Inject使用
如下是@Inject的使用,不加@Named注解,需要配置與變量名一致即可。
@Inject @Named("mongo") private Mongo mongo;
2、@Autowired
- org.springframework.bean.factory
- Spring
@Autowired是Spring提供的注解,通過AutowiredAnnotationBeanPostProcessor類實現的依賴注入,與@inject二者具有可互換性。
@Autowired的使用
@Autowired有個屬性為required,可以配置為false,如果配置為false之后,當沒有找到相應bean的時候,系統不會拋錯。
@Autowired private MongoTemplate mongoTemplate;
3、@Resource
- javax.annotation
- JSR250 (Common Annotations for Java)
這是JSR250規范的實現,@Resource通過CommonAnnotationBeanPostProcessor類實現依賴注入。
@Resource的使用
@Resource一般會指定一個name屬性,如下:
@Resource(name = "userMapper") private UserMapper userMapper;
4、三個注解的相異之處
@Autowired和@Inject基本是一樣的,因為兩者都是使用AutowiredAnnotationBeanPostProcessor來處理依賴注入。但是@Resource是個例外,它使用的是CommonAnnotationBeanPostProcessor來處理依賴注入。當然,兩者都是BeanPostProcessor。
@Autowired和@Inject
默認autowired by type,可以通過@Qualifier顯式指定autowired by qualifier name。
@Resource
默認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。
5、總結
個人在使用上,更偏重使用@Inject,這是JSR330規范的實現,而@Autowired是Spring的實現,如果不用Spring一般用不上這個,而@Resource則是JSR250的實現,這是多年前的規范。
參考:
http://blog.csdn.net/u012734441/article/details/51706504(以上內容轉自此篇文章)
