Spring下的@Inject、@Autowired、@Resource注解區別(轉)


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(以上內容轉自此篇文章)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM