@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注入,不建议使用。
posted @ 2018-07-20 10:36  低调的小白  阅读(11966)  评论(0编辑  收藏  举报