本文发布于专栏Effective Java,如果您觉得看完之后对你有所帮助,欢迎订阅本专栏,也欢迎您将本专栏分享给您身边的工程师同学。
本集概要:
- 构造器注入有什么缺点?
- 如何使用setter注入?
- setter注入为什么会导致空指针异常?
前情回顾:用小说的形式讲解Spring(1) —— 为什么需要依赖注入
大雄给项目引入了Spring框架,解决了代码过度耦合的问题,当然,这只是Spring强大功力的冰山一角,菜鸟大雄还仍然是菜鸟大雄……
越来越庞大的构造函数
一天,晨会过后,哆啦对大雄说,“大雄,我们的订单接口和支付接口都已经非常完善了,现在需要在支付完成时更新一下订单的状态,你看看这个需求如何实现。”
“这个好办,只需要给支付接口添加一个新的依赖IOrderDao,然后把OrderDao注入进去就可以了。”
“好小子,张嘴一个‘依赖’,闭嘴一个‘注入’,术语说的挺溜的呀”
“那是,你等着,马上搞定这个需求”,说完,大雄就火急火燎地写代码去了。
大雄给PaymentAction加了一个成员变量orderDao,然后新建了一个构造函数,把orderDao注入到PaymentAction里面去,接着写了一个updateOrderAfterPayment方法,调用orderDao的方法更新订单(本文使用的代码,可以到 SpringNovel 下载,欢迎加星):
public class PaymentAction {
private ILogger logger;
// new proprety !!!
private IOrderDao orderDao;
public PaymentAction(ILogger logger) {
super();
this.logger = logger;
}
// new constructor !!!
public PaymentAction(ILogger logger, IOrderDao orderDao) {
super();
this.logger = logger;
this.orderDao = orderDao;
}
public void pay(BigDecimal payValue) {
logger.log("pay begin, payValue is " + payValue);
// do otherthing
// ...
logger.log("pay end");
}
// new method !!!
public void updateOrderAfterPayment(String orderId) {
orderDao.updateOrderAfterPayment(orderId);
}
}
最后大雄修改了一下payment.xml,注入orderDao:
<bean id="paymentAction" class="com.springnovel.payment.springxml.PaymentAction">
<constructor-arg ref="serverLogger">
</constructor-arg>
<