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

来源:互联网 发布:elton john知乎 编辑:程序博客网 时间:2024/05/21 08:50

          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进行依赖注入时,要严格遵守其规范,不然会产生意想不到的错误。

原创粉丝点击