关于@Bean声明而不是类实现的春季@Transactional
2022-09-03 15:04:51
我想从我的Spring类中配置“事务性”bean,而不是用.@Configuration
@Transactional
有点像老式的方式,从XML文件配置事务性建议,但不需要对我的类/方法名称的字符串引用来创建切入点。
原因是Bean实现在另一个代码库中,它所属的模块不依赖于Spring。阅读:我没有触及那颗豆子的源代码,只是实例化了它。该类是最终的,也无法扩展它以将Spring注释添加到子类。假设为了简单起见,所有方法都必须是事务性的。
豆子实现:
/** This class has no Spring dependency... */
// @Transactional <- which means I can't use this here
public final class ComplexComponentImpl implements ComplexComponent {
private SomeRepository repo;
public ComplexComponentImpl(SomeRepository repository) { this.repo = repository }
public void saveEntities(SomeEntity e1, SomeEntity e2) {
repo.save(e1);
throw new IllegalStateException("Make the transaction fail");
}
我想在我的配置类中做什么(在我的单元测试中不起作用):
@Configuration
@EnableTransactionManagement
public class ComplexComponentConfig {
@Bean
@Transactional // <- Make the bean transactional here
public ComplexComponent complexComponent() {
return new ComplexComponentImpl(repository());
}
// ...
}
事实上,上面的例子不起作用,因为在运行时没有任何东西是“事务性的”:即使抛出异常,实体也会持久化。e1
请注意,我的事务管理设置与标有 .@Transactional
问题:是否可以从类中声明 s 事务性,或者考虑到上述约束,是否有任何替代方案?@Bean
@Configuration