spring按类型进行依赖注入引起的问题

          1、背景

系统中定义了两个事务模板,分别为gfasShareTransactionTemplate、gfasSharingTransactionTemplate,都是属于spring的TransactionTemplate类型。

A表可以被gfasShareTransactionTemplate控制,但不能被gfasSharingTransactionTemplate控制。

业务实现类需要开启一个事物,对A表进行插入操作。代码如下

public class Test {

    /**
     * 事务模板
     */
    protected TransactionTemplate gfasShareTransactionTemplate;

    public void test() {

        gfasShareTransactionTemplate.execute(new TransactionCallbackWithoutResult() {

            @Override
            protected void doInTransactionWithoutResult(final TransactionStatus status) {

                //执行A表插入操作,已省略

                //抛出异常
                int a = 1 / 0;

            }
        });
    }

    /**
     * Setter method for property <tt>gfasSharingTransactionTemplate</tt>.
     * 
     */
    public void setGfasSharingTransactionTemplate(TransactionTemplate gfasShareTransactionTemplate) {
        this.gfasShareTransactionTemplate = gfasShareTransactionTemplate;
    }

}


2、出现问题

        当事务中出现异常时,对A的插入操作没有回滚。


3、分析原因

  1. 经过debug发现,注入的TransactionTemplate属性是gfasSharingTransactionTemplate,因为只有gfasShareTransactionTemplate能控制A表的回滚,所以会出现问题。
  2. 为什么定义的属性为TransactionTemplate gfasShareTransactionTemplate,但是注入的结果却是gfasSharingTransactionTemplate呢?这是因为下面set方法名之前写错了,写成了setGfasSharingTransactionTemplate,只需将方法名改为setGfasShareTransactionTemplate即可。
4、总结
       spring初始化bean的时候,会进行依赖注入,调用setPropertiesValues方法。以上面例子来说,初始化Test的时候,会读取其setGfasSharingTransactionTemplate方法组装成一个Properties bean,这个Bean名称就是set方法后面那部分gfasSharingTransactionTemplate,然后在为Test类的属性赋值时,会调用set方法,将刚才的那个gfasSharingTransactionTemplate bean作为参数传进去(因为是TransactionTemplate类型所以不会报错)。所以产生了上述的问题,由此可见,对spring进行依赖注入时,要严格遵守其规范,不然会产生意想不到的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值