1、@Inject
? ? javax.inject
? ?JSR330 (Dependency Injection for Java)
? ?這是jsr330中的規(guī)范,通過‘AutowiredAnnotationBeanPostProcessor’ 類實(shí)現(xiàn)的依賴注入。
1.1、@Inject使用
? ?如下是@Inject的使用,不加@Named注解,需要配置與變量名一致即可。
? ? @Inject
? ? @Named("mongo")
? ? ?private Mongo mongo;
?2、@Autowired
? ?org.springframework.bean.factory
? Spring
? @Autowired是Spring提供的注解,通過‘AutowiredAnnotationBeanPostProcessor’ 類實(shí)現(xiàn)的依賴注入,與@inject二者具有可互換性。
2.1 @Autowired的使用
? ? @Autowired有個(gè)屬性為required,可以配置為false,如果配置為false之后,當(dāng)沒有找到相應(yīng)bean的時(shí)候,系統(tǒng)不會(huì)拋錯(cuò)。
? ? @Autowired
? ? private MongoTemplate mongoTemplate;
?3、@Resource
? ?javax.annotation
? JSR250 (Common Annotations for Java)
? ?這是jsr250規(guī)范的實(shí)現(xiàn),‘@Resource’通過 ‘CommonAnnotationBeanPostProcessor’ 類實(shí)現(xiàn)依賴注入。
3.1@Resource的使用
? ?@Resource一般會(huì)指定一個(gè)name屬性,如下:
? ? @Resource(name = "userMapper")
? ? private UserMapper userMapper;
?4、三個(gè)注解的相異之處
? @Autowired和@Inject基本是一樣的,因?yàn)閮烧叨际鞘褂肁utowiredAnnotationBeanPostProcessor來處理依賴注入。但是@Resource是個(gè)例外,? 它使用的是CommonAnnotationBeanPostProcessor來處理依賴注入。當(dāng)然,兩者都是BeanPostProcessor。
? @Autowired和@Inject
?默認(rèn) autowired by type
?可以 通過@Qualifier 顯式指定 autowired by qualifier name。
@Resource
默認(rèn) autowired by field name
如果 autowired by field name失敗,會(huì)退化為 autowired by type
可以 通過@Qualifier 顯式指定 autowired by qualifier name
如果 autowired by qualifier name失敗,會(huì)退化為 autowired by field name。但是這時(shí)候如果 autowired by field name失敗,就不會(huì)再退化為autowired by type了。
?5、總結(jié)
個(gè)人在使用上,更偏重使用@Inject,這是jsr330規(guī)范的實(shí)現(xiàn),而@Autowired是spring的實(shí)現(xiàn),如果不用spring一般用不上這個(gè),而@Resource則是jsr250的實(shí)現(xiàn),這是多年前的規(guī)范。
歡迎關(guān)注微信公眾號(hào):Java的學(xué)習(xí)之路
里面資料非常全,從java初級(jí)到高級(jí)都有,視頻,電子書,面試寶典,簡(jiǎn)歷模板,經(jīng)典案例,源碼分析程序員故事以及解決bug方法。。。。應(yīng)有盡有,可以推薦大家一起學(xué)習(xí)下??!
?