@Autowired和@Resource注解的一個意外重要區別


今天上午,因為公司要跟客戶展示最近開發的項目,然后安排了我重新構建一個template項目,用來向客戶展示參考。基於已開發好的代碼,我在進行一些簡化抽取的時候出現了一個有趣的問題

因為我們有一個spring security配置類時需要每個模塊都使用,就是可能有些參數不同,現在我把他弄到一個公共的jar包,把之前類拷貝進去,然后把參數寫活,結果出現了一些有意思的小問題,它源代碼使用了@Resource注解,用來對一個不是返回bean的方法進行參數注入,父類有使用@Autowired注解

執行后發現執行順序是:

  1、先執行父類的構造

  2、執行本類構造

  3、執行本類有@Resource注解的方法

  4、父類按順序執行標有@Autowired的方法

  5、執行子類標有的@Autowired方法

  6、最后執行子類的重寫方法

當時有點郁悶,郁悶的是@Resource注解標注的方法是在最下面,不僅比本類放在它上面的標有@Autowired方法的優先級高,還高於父類@Autowired的方法,反正這樣的情況以前還真是從來沒遇到過,一方面沒怎么實際經歷這種場景,另一方面我從來不用@Resouce注解

然后我試着在子類添加了一個方法加上了@PostConstructo注解,這個時候執行順序和上面差不多,@PostConstructor標注的方法在上面第五條之后執行

然后我試着加上一個@Bean注解的方法,它的優先級還要低於@PostConstructor

最后把@Resouce注解改成了@Autowired,這個時候是先執行父類標有@Autowired的方法。得出一個結論,@Resource標注在方法上注入方法形參的時候,它會優先於父類及其本類所有標有@Autowired的注解先執行。代碼這里就不貼了,有興趣可以自己寫寫

最后結論

  在@Configuration的配置類中標有@Resource、@Autowired這些的方法(必須要標注在方法上的情況下),會自動觸發執行,且@Resource注解優先級高於@Autowired及其@PostConstructor,@PostConstructor優先級最低

 如果想注入多個bean,@Autowired還可以按下面的方式用來注入多個,而@Resource只能標注在方法上面,且也只能在方法形參注入一個

  @Autowired public void testAutowiredAnon(AuthenticationManagerBuilder auth, @Autowired ApplicationContext ApplicationContext){ System.out.println("=========@Autowired testAutowiredAnon"); } @Resource public void testResourceAnon(AuthenticationManagerBuilder auth){ System.out.println("=========@Resource testResourceAnon"); }

 

順便溫習下兩個注解其他的區別

  @Autowired默認byType匹配,默認情況下要求依賴的bean必須存在,如果依賴的bean可以沒有,可以使用require=false,如果想byName匹配,需要配合@Qualifier注解指定其value值,value值就是beanName

  @Resource默認byName匹配,沒指定的話,它認為beanName是字段名,當找不到的會按照byType進行匹配,如果指定了name或type屬性,它就會根據你指定的去找,沒找到,拋出異常,@Resource不能放在方法的形參上,屬於java jdk自帶的注解

  

  

 


免責聲明!

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



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