@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 }
弊端
-
如果你使用的是构造器注入
恭喜你,当你有十几个甚至更多对象需要注入时,你的构造函数的参数个数可能会长到无法想像。
-
如果你使用的是field反射注入
如果不使用Spring框架,这个属性只能通过反射注入,太麻烦了!这根本不符合JavaBean规范。
还有,当你不是用过Spring创建的对象时,还可能引起NullPointerException。
并且,你不能用final修饰这个属性。 -
如果你使用的是setter方法注入
那么你将不能将属性设置为final。
两者取其轻
- Spring3.0官方文档建议使用setter注入覆盖构造器注入。
- Spring4.0官方文档建议使用构造器注入。
结论
- 如果注入的属性是必选的属性,则通过构造器注入。
- 如果注入的属性是可选的属性,则通过setter方法注入。
- 至于field注入,不建议使用。
hello world!!!