Spring @Transactional基于方法级别的条件

时间:2017-10-03 11:48:29

标签: java database spring hibernate spring-transactions

我有一个具有可配置事务行为的方法,比如基于布尔值,它应该在该方法上应用@Transactional。有这样的事情:

@Transactional(if myBooleanVariable is true)
public boolean executeQueries(List<String> queries) {
    Iterator<String> it = queries.iterator();
}

1 个答案:

答案 0 :(得分:4)

是的,有条件的注射豆是可能的。有很多方法,但是,我建议你使用配置文件。

它允许您根据配置文件同时拥有更多未命名的bean。

@Bean
@Profile("!dev")
public class MyClass1 implements MyInterface {}

@Bean
@Profile("dev")
public class MyClass2 implements MyInterface {}

您可以在Java Configuration类中配置配置文件:

@Configuration
public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        servletContext.setInitParameter("spring.profiles.active", "dev");
    }
}

然后注释@Autowired将根据活动配置文件找到要注入的正确实现。阅读Baeldung's websize上的更多内容,我从中获取了示例。

第二种方法是使用注释@Conditional,它根据已实现的接口Condition的返回方法有条件地注入bean。

@Bean
@Conditional(MyClass1Condition.class)
public class MyClass1 implements MyInterface {}

@Bean
@Conditional(MyClass2Condition.class)
public class MyClass2 implements MyInterface {}

以下是实现框架的外观:

public class MyClass1Condition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        // perform your logic
    }
}