我有一个具有可配置事务行为的方法,比如基于布尔值,它应该在该方法上应用@Transactional
。有这样的事情:
@Transactional(if myBooleanVariable is true)
public boolean executeQueries(List<String> queries) {
Iterator<String> it = queries.iterator();
}
答案 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
}
}