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

问题:
一. 在IDEA升级2017版后,发现以前使用的 @Autowired 出现了个警告 Field injection is not recommended。
@Autowired的三种使用方式

@Service("accountEmailService") public class AccountEmailServiceImpl implements AccountEmailService{/**通过构造器注入---begin**/ private JavaMailSender javaMailSender; @Autowired public AccountEmailServiceImpl(JavaMailSender javaMailSender){ this.javaMailSender = javaMailSender; } /** 通过构造器注入---end**//** 通过set方法注入---begin **/ private JavaMailSender javaMailSender; @Autowired public void setJavaMailSender(JavaMailSender javaMailSender){ this.javaMailSender = javaMailSender; } /** 通过set方法注入---end **//** 通过field注入 **/ @Autowired private JavaMailSender javaMailSender; @Override public void sendMail(String to, String subject, String htmlText) throws Exception{String systemMail = "xxx@qq.com"; MimeMessage msg = javaMailSender.createMimeMessage(); MimeMessageHelper messageHelper = new MimeMessageHelper(msg); messageHelper.setFrom(systemMail); messageHelper.setTo(to); messageHelper.setSubject(subject); messageHelper.setText(htmlText); //messageHelper.setText(htmlText,true); javaMailSender.send(msg); }}



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

    推荐阅读