博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
@Configuration 去xml化添加事务功能
阅读量:7145 次
发布时间:2019-06-29

本文共 2237 字,大约阅读时间需要 7 分钟。

hot3.png

###初始化类###

类注解

@Configuration@ComponentScan(basePackages = AppConfig.BASEPACKAGE, 	excludeFilters = { 		@ComponentScan.Filter(type = FilterType.ANNOTATION, value = {Controller.class, RestController.class}) })public class RootConfiguration {

1.采用注解式事务,需要在类加添加@EnableTransactionManagement

@Bean    public PlatformTransactionManager transactionManager(DataSource dataSource) {        return new DataSourceTransactionManager(dataSource);    }

2.拦截器式

@Bean(name="transactionManager")	public DataSourceTransactionManager transactionManager(DataSource dataSource) {		DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();		transactionManager.setDataSource(dataSource);		transactionManager.setGlobalRollbackOnParticipationFailure(false);		return transactionManager;	}		@Bean(name="transactionInterceptor")	public TransactionInterceptor transactionInterceptor(DataSourceTransactionManager transactionManager) {		TransactionInterceptor transactionInterceptor = new TransactionInterceptor();		transactionInterceptor.setTransactionManager(transactionManager);		Properties properties = new Properties();		properties.setProperty("*", "PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception");		transactionInterceptor.setTransactionAttributes(properties);		return transactionInterceptor;	}		@Bean(name="beanNameAutoProxyCreator")	public BeanNameAutoProxyCreator beanNameAutoProxyCreator() {		BeanNameAutoProxyCreator beanNameAutoProxyCreator = new BeanNameAutoProxyCreator();		beanNameAutoProxyCreator.setProxyTargetClass(true);		beanNameAutoProxyCreator.setBeanNames("*Service");		beanNameAutoProxyCreator.setInterceptorNames("transactionInterceptor");		return beanNameAutoProxyCreator;	}

###注意事项###

在某个方法依赖另外一个bean时,不可以直接调用生成bean的方法。如以上依赖dataSource的地方较多,不可以直接调用dataSource()方法,否则会生成多个实例,导致最后事务不成功,实际使用的可能是实例A,但事务管理到的可能是实例B,从日志中看一切正常,也调用了doRollBack的。但在跟踪代码时会发现在TransactionSynchronizationManager.getSynchronizations()返回了两个,分别为:org.mybatis.spring.SqlSessionUtils$SqlSessionSynchronization@ff5c61forg.springframework.jdbc.datasource.DataSourceUtils$ConnectionSynchronization@4545f833。官方文档里面直接调用方法的,不知道是否可以通过什么方式实现这种直接调用

正确的获取方式为:

1.直接通过参数传递需要的依赖

2.参数传递ListableBeanFactory,通过这个获取

转载于:https://my.oschina.net/remind2010/blog/604579

你可能感兴趣的文章
【Python标准库:fileinput】优雅的读取文件
查看>>
“NO GENDER.NO BORDER.”,无性别服饰品牌“Bosie”获近千万元Pre-A轮融资
查看>>
用Python统计你的简书数据
查看>>
全票通过,百度 Doris 项目进入 Apache 基金会孵化器
查看>>
Retrofit2源码解析——网络调用流程(下)
查看>>
5G时代下的移动边缘计算(MEC)探索系列之二
查看>>
白衣天使要承包你的周末咯!快来3小时公益平台!
查看>>
用GitHub Issue取代多说,是不是很厉害?
查看>>
3 个实例带您了解如何快速迁移旧版的 Windows 应用程序
查看>>
第15天,JavaScript之事件介绍
查看>>
去除mysql 大小写敏感
查看>>
find: 路径必须在表达式之前:
查看>>
hanlp自然语言处理包的基本使用--python
查看>>
Linux网络协议栈(三)——网络设备(2)
查看>>
MAC下尝试PHP7 alpha版本的安装
查看>>
Laravel(1) 注册重写
查看>>
踩坑记:根据类型获取Spring容器中的Bean
查看>>
6-Java基础语法-数组之一维数组
查看>>
编译器中的 逃逸分析
查看>>
应用程序内部任意界面退出程序
查看>>