如何在非Spring Boot的Spring应用中启用@Transactional注解处理?
Spring + Struts 遗留应用启用@Transactional注解替代TransactionTemplate
要在你的Spring+Struts遗留应用里用@Transactional替代TransactionTemplate的样板代码,按以下步骤操作:
1. 启用Spring声明式事务管理
你已经有PlatformTransactionManager实例,只需开启注解驱动的事务支持:
- XML配置方式:在Spring配置文件中添加:
<tx:annotation-driven transaction-manager="platformTransactionManager"/> <!-- 确保platformTransactionManager是你已定义的事务管理器bean的id -->
- Java配置方式:在配置类上添加
@EnableTransactionManagement注解:
@Configuration @EnableTransactionManagement public class AppConfig { // 已有的PlatformTransactionManager bean定义 @Bean public PlatformTransactionManager platformTransactionManager() { // 你的实现代码 } }
2. 确保目标Bean被Spring容器管理
Struts默认自行创建Action实例,Spring的AOP代理无法对其生效,需将Action交给Spring管理:
- 配置Struts使用Spring对象工厂:在
struts.xml中添加:
<constant name="struts.objectFactory" value="spring"/>
- 将Struts Action声明为Spring原型Bean(Struts Action通常需要多例):
<bean id="yourAction" class="com.yourpackage.YourAction" scope="prototype"> <!-- 注入业务类等依赖 --> </bean>
或Java配置:
@Bean @Scope("prototype") public YourAction yourAction() { return new YourAction(); }
3. 替换TransactionTemplate代码
直接在需要事务的方法上添加@Transactional注解,将原业务逻辑移入方法内:
@Transactional public void transactionalOp(Req request, Resp responseObserver) { // 原internalTransactionalOp中的业务代码直接编写在此 }
关键注意事项
- 方法访问权限:
@Transactional仅对public方法生效,确保目标方法为public修饰。 - 避免自调用问题:同一类内部调用带
@Transactional的方法时,Spring动态代理不会触发事务。解决方式:将事务方法抽取到独立业务Bean中,通过依赖注入调用。 - 事务属性对齐:根据原
TransactionTemplate的配置调整@Transactional属性,例如传播行为、隔离级别、回滚规则。默认传播行为PROPAGATION_REQUIRED与@Transactional默认值一致;若需回滚所有异常,可写@Transactional(rollbackFor = Exception.class)。 - 依赖注入检查:确保Action中的业务类通过Spring注入(如
@Autowired),而非手动new,否则业务类的@Transactional不会生效。
内容的提问来源于stack exchange,提问作者Archimedes Trajano
相关产品推荐
相关产品推荐

