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、分析原因
- 经过debug发现,注入的TransactionTemplate属性是gfasSharingTransactionTemplate,因为只有gfasShareTransactionTemplate能控制A表的回滚,所以会出现问题。
- 为什么定义的属性为TransactionTemplate gfasShareTransactionTemplate,但是注入的结果却是gfasSharingTransactionTemplate呢?这是因为下面set方法名之前写错了,写成了setGfasSharingTransactionTemplate,只需将方法名改为setGfasShareTransactionTemplate即可。
4、总结spring初始化bean的时候,会进行依赖注入,调用setPropertiesValues方法。以上面例子来说,初始化Test的时候,会读取其setGfasSharingTransactionTemplate方法组装成一个Properties bean,这个Bean名称就是set方法后面那部分gfasSharingTransactionTemplate,然后在为Test类的属性赋值时,会调用set方法,将刚才的那个gfasSharingTransactionTemplate bean作为参数传进去(因为是TransactionTemplate类型所以不会报错)。所以产生了上述的问题,由此可见,对spring进行依赖注入时,要严格遵守其规范,不然会产生意想不到的错误。
阅读全文
0 0
- spring按类型进行依赖注入引起的问题
- Spring依赖注入类型
- 使用Spring进行依赖注入
- spring依赖注入枚举类型
- 关于Spring的依赖注入问题
- Spring 依赖注入 之 设值注入 的小问题
- spring 的依赖注入
- Spring的依赖注入
- Spring的依赖注入
- spring的依赖注入
- spring的依赖注入
- spring的依赖注入
- Spring的依赖注入
- Spring的依赖注入
- Spring的依赖注入
- Spring的依赖注入
- spring的依赖注入
- Spring的依赖注入
- chrome 开发者工具
- ubuntu开机进入initramfs的解决办法
- 集体智慧编程错误总结第三章
- hive添加分区字段
- How to set up minimal Redhat 7.3
- spring按类型进行依赖注入引起的问题
- 修改keil5工程名称
- 自定义控件 带删除按钮的EditText
- 欢迎使用CSDN-markdown编辑器
- Linux进行yum 程序安装时遇到的公钥没有安装的问题解决方法
- 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists).
- 10、Android开发基础之点击事件的处理
- JQuery EasyUI与EXTjs有什么区别?
- java web项目生成二维码思想