zoukankan      html  css  js  c++  java
  • @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注入,不建议使用。
  • 相关阅读:
    VMware Workstation9安装Mac OS X10.9系统
    如何在windows下的Python开发工具IDLE里安装其他模块?
    Git在下搭建下环境的工具
    Git的安装与使用
    Linux(CentOs6.4)安装Git
    VMware虚拟机上网络连接(network type)的三种模式--bridged、host-only、NAT
    centos 6.5 升级内核 linux 3.12.17
    让CentOS系统时间同步
    编译安装LNMP Centos 6.5 x64 + Nginx1.6.0 + PHP5.5.13 + Mysql5.6.19
    64位CentOS5.6安装Mysql 5.5.11GA
  • 原文地址:https://www.cnblogs.com/wang-yaz/p/9340156.html
Copyright © 2011-2022 走看看