# Spring Transaction Enhance **Repository Path**: devaper/spring-transaction-enhance ## Basic Information - **Project Name**: Spring Transaction Enhance - **Description**: 支持this调用且性能更好一丢丢的声明式事务解决方案 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-06-10 - **Last Updated**: 2023-06-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java, Spring, javassist ## README # Spring Transaction Enhance #### 介绍 声明式事务, 主要填补了Spring声明式事务使用代理模式导致this调用事务失效的不足。 这只是一个基本的解决方案提供一个思路, 也能够满足基本使用, 更多的功能需要自己去改进一下。 #### 实现原理: 利用BeanFactoryPostProcessor扩展机制在容器中扫描并利用javassist创建子类替换掉原始的BeanClass, 这样创建的实例就是我们生成的类了, this调用自然也就指向了子类重写方法o(* ̄▽ ̄*)ブ 使用继承其中会遇到一些问题: 1. 继承后父类的`@Autowired`失效怎么办? 可以将父类设置为抽象父类, 这个父类(业务类)一般都是标了`@Component`的, 一旦是抽象类, 那么就不会创建一份`BeanDefinition`, 也就无法检测到这个Bean的存在了, 所以这个方法行不通 目前是重写了所有非私有、非final、非static、存在注解的字段, 此时就可以正常注入了 2. 父类中的`@Autowired`字段是`private`怎么办? 由于private不能重写,目前的做法是在子类中创建一个set方法,将该字段上所有的注解标记在方法上(仅限@Target({ElementType.METHOD})), 然后在set方法中利用反射强制设置值到父类的字段中 #### 基本流程: 1. 扫描所有的BeanDefinition 2. 使用ASM读取Bean所有方法的Metadata, 看谁标记了Transactional注解 3. 重写所有可能存在特殊意义的字段(正常可以被重写且带有注解) 4. 为所有可能存在特殊意义且private的字段创建set方法, 利用反射强制设置字段值 5. 重写所有标记了Transactional注解的方法, 在方法内植入事务代码并调用super的方法 6. 创建构造器(与父类同等数量、同等参数), 然后使用super()调用父类构造器完成初始化 #### 性能优化 相对于Spring的声明式事务来说, 这个方法少了一层代理类, 同时也少了反射去调用方法, 性能自然会好一些, 不过是微乎其微的...