问题:
一. 在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);
}}
弊端
- 如果你使用的是构造器注入
恭喜你,当你有十几个甚至更多对象需要注入时,你的构造函数的参数个数可能会长到无法想像。
- 如果你使用的是field反射注入
如果不使用Spring框架,这个属性只能通过反射注入,太麻烦了!这根本不符合JavaBean规范。
还有,当你不是用过Spring创建的对象时,还可能引起NullPointerException。
并且,你不能用final修饰这个属性。
- 如果你使用的是setter方法注入
那么你将不能将属性设置为final。
- Spring3.0官方文档建议使用setter注入覆盖构造器注入。
- Spring4.0官方文档建议使用构造器注入。
-
- 如果注入的属性是必选的属性,则通过构造器注入。
- 如果注入的属性是可选的属性,则通过setter方法注入。
- 至于field注入,不建议使用。
推荐阅读
- 工具|后天就是七夕节,你准备好了吗(送上几个七夕代码,展示你技能的时候到了!)
- 工具|Wireshark抓包对其字TCP段理解
- 在线时间戳计算时间差
- 在线条码生成器
- 在线HTML5,CSS3,VueJS,jQuery运行测试练习工具
- 申请gmail邮箱及foxmail邮箱
- 工具|dockerfile