用小说的形式讲解Spring(2) —— 注入方式哪家强

本文发布于专栏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>
    <
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值