@Autowired 警告 Field injection is not recommended Spring @Autowired注入


問題:

一. 在IDEA升級2017版后,發現以前使用的 @Autowired 出現了個警告 Field injection is not recommended。

@Autowired的三種使用方式

 1 @Service("accountEmailService")
 2 public class AccountEmailServiceImpl implements AccountEmailService{
 3 
 4 
 5     /**  通過構造器注入---begin  **/
 6     private JavaMailSender javaMailSender;
 7 
 8     @Autowired
 9     public AccountEmailServiceImpl(JavaMailSender javaMailSender){
10         this.javaMailSender = javaMailSender;
11     }
12     /** 通過構造器注入---end  **/
13 
14     /** 通過set方法注入---begin **/
15     private JavaMailSender javaMailSender;
16     @Autowired
17     public void setJavaMailSender(JavaMailSender javaMailSender){
18         this.javaMailSender = javaMailSender;
19     }
20     /** 通過set方法注入---end **/
21 
22     /** 通過field注入 **/
23     @Autowired
24     private JavaMailSender javaMailSender;
25 
26     @Override
27     public void sendMail(String to, String subject, String htmlText) throws Exception{
28 
29         String systemMail = "xxx@qq.com";
30 
31         MimeMessage msg = javaMailSender.createMimeMessage();
32 
33         MimeMessageHelper messageHelper = new MimeMessageHelper(msg);
34 
35         messageHelper.setFrom(systemMail);
36         messageHelper.setTo(to);
37         messageHelper.setSubject(subject);
38         messageHelper.setText(htmlText);
39 //        messageHelper.setText(htmlText,true);
40 
41         javaMailSender.send(msg);
42     }
43 
44 }

弊端

  1. 如果你使用的是構造器注入

    恭喜你,當你有十幾個甚至更多對象需要注入時,你的構造函數的參數個數可能會長到無法想像。

  2. 如果你使用的是field反射注入

    如果不使用Spring框架,這個屬性只能通過反射注入,太麻煩了!這根本不符合JavaBean規范。

    還有,當你不是用過Spring創建的對象時,還可能引起NullPointerException。 
    並且,你不能用final修飾這個屬性。

  3. 如果你使用的是setter方法注入

    那么你將不能將屬性設置為final。

兩者取其輕

  1. Spring3.0官方文檔建議使用setter注入覆蓋構造器注入。
  2. Spring4.0官方文檔建議使用構造器注入。

結論

    1. 如果注入的屬性是必選的屬性,則通過構造器注入。
    2. 如果注入的屬性是可選的屬性,則通過setter方法注入。
    3. 至於field注入,不建議使用。


免責聲明!

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



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