問題:
一. 在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 }
弊端
-
如果你使用的是構造器注入
恭喜你,當你有十幾個甚至更多對象需要注入時,你的構造函數的參數個數可能會長到無法想像。
-
如果你使用的是field反射注入
如果不使用Spring框架,這個屬性只能通過反射注入,太麻煩了!這根本不符合JavaBean規范。
還有,當你不是用過Spring創建的對象時,還可能引起NullPointerException。
並且,你不能用final修飾這個屬性。 -
如果你使用的是setter方法注入
那么你將不能將屬性設置為final。
兩者取其輕
- Spring3.0官方文檔建議使用setter注入覆蓋構造器注入。
- Spring4.0官方文檔建議使用構造器注入。
結論
- 如果注入的屬性是必選的屬性,則通過構造器注入。
- 如果注入的屬性是可選的屬性,則通過setter方法注入。
- 至於field注入,不建議使用。