如何在非Spring托管bean中使用@Transactional?

时间:2019-09-17 12:11:29

标签: spring spring-transactions

我有一个由我自己初始化的bean,我想使该方法具有事务性。

class Foo {

  @Transcational
  void method() {
  }
}

这是行不通的,因为Foo不是由Spring管理的,我该如何使其工作?

我尝试使用AutowareCapableBeanFactoryfoo注册到应用程序上下文中,如下所示:

class BeanConfig {

  // programatically initilized
  AutowareCapableBeanFactory beanFactory;

  void doSomething() {
    Foo foo = new Foo();
    beanFactory.autowireBean(foo);
    foo.method();
  }

}

使用这种方法,@AutowiredFoo.class中工作,但是@Transactional仍然不工作,但是如果我使用spring托管bean,则事务在工作,回滚和数据库锁定所有作品。

1 个答案:

答案 0 :(得分:0)

问题是spring使用动态代理实现@Transactional,但是您自己调用Foo的构造函数,因此,这里不涉及代理

您可以使用Spring的TransactionTemplate来解决此问题

Foo foo = new Foo();
beanFactory.autowireBean(foo);
context.getBean(TransactionTemplate.class).execute(() -> { 
    foo.method();
});