如何默默地取消bean的创建?
How to silently cancel bean creation?
@Component
public class MyBean {
@Autowired
public MyBean(@Value("${optional:#{null}}") String optional) {
if (optional == null) {
// cancel bean creation?
}
}
}
如何静默取消bean的创建?我可以抛出 RuntimeException
,但我不希望将此取消视为错误:不能创建 bean,应用程序初始化必须继续。
不可能。
如果不创建 bean,则无法使用它。就是一个简单的Javaclass,bean里面的属性used/autowired就没用了。
但是,您可以为 'Dev'、'Test' 或 'Production' 等不同类型的环境配置基本配置 bean。
https://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile/
这里可以利用@Conditional
步骤 1- 实施 Condition.matches 以指定何时创建 bean 或不创建。
public class SomeCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return System.getProperty("optional") != null;
}
}
条件 class 被称为直接 class(而不是 spring bean)所以它不能使用 @Value
属性注射。参见 here 替代方案
步骤2 - 在配置class中指定上面的class作为条件来决定bean创作
@Configuration
public class SomeAppConfig {
@Bean
@Condition(SomeCondition.class)
public MyBean myBean() {
return new MyBean();
}
}
P.S.:我假设您使用 Java 配置。
@Component
public class MyBean {
@Autowired
public MyBean(@Value("${optional:#{null}}") String optional) {
if (optional == null) {
// cancel bean creation?
}
}
}
如何静默取消bean的创建?我可以抛出 RuntimeException
,但我不希望将此取消视为错误:不能创建 bean,应用程序初始化必须继续。
不可能。
如果不创建 bean,则无法使用它。就是一个简单的Javaclass,bean里面的属性used/autowired就没用了。
但是,您可以为 'Dev'、'Test' 或 'Production' 等不同类型的环境配置基本配置 bean。
https://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile/
这里可以利用@Conditional
步骤 1- 实施 Condition.matches 以指定何时创建 bean 或不创建。
public class SomeCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return System.getProperty("optional") != null;
}
}
条件 class 被称为直接 class(而不是 spring bean)所以它不能使用 @Value
属性注射。参见 here 替代方案
步骤2 - 在配置class中指定上面的class作为条件来决定bean创作
@Configuration
public class SomeAppConfig {
@Bean
@Condition(SomeCondition.class)
public MyBean myBean() {
return new MyBean();
}
}
P.S.:我假设您使用 Java 配置。