我有一个由我自己初始化的bean,我想使该方法具有事务性。
class Foo {
@Transcational
void method() {
}
}
这是行不通的,因为Foo不是由Spring管理的,我该如何使其工作?
我尝试使用AutowareCapableBeanFactory
将foo
注册到应用程序上下文中,如下所示:
class BeanConfig {
// programatically initilized
AutowareCapableBeanFactory beanFactory;
void doSomething() {
Foo foo = new Foo();
beanFactory.autowireBean(foo);
foo.method();
}
}
使用这种方法,@Autowired
在Foo.class
中工作,但是@Transactional
仍然不工作,但是如果我使用spring托管bean,则事务在工作,回滚和数据库锁定所有作品。
答案 0 :(得分:0)
问题是spring使用动态代理实现@Transactional,但是您自己调用Foo的构造函数,因此,这里不涉及代理
您可以使用Spring的TransactionTemplate来解决此问题
Foo foo = new Foo();
beanFactory.autowireBean(foo);
context.getBean(TransactionTemplate.class).execute(() -> {
foo.method();
});