SpringBoot条件注入@Condition
阅读数:84 评论数:0
跳转到新版页面分类
python/Java
正文
一、条件注解
Spring本身提供了条件装配@Conditional,但是要自己编写比较复杂的Condition来做判断,比较麻烦。Spring Boot则为我们准备好了几个非常有用的:
@ConditionalOnProperty | 如果有指定的配置,条件生效 |
@ConditionalOnBean | 当容器中存在某个特定的bean时,才创建bean。 |
@ConditionalOnMissingBean | 当容器中缺少某个特定的bean时,才创建bean。 |
@ConditinalOnMissingClass |
当类路径上缺少某个类时,才创建bean。 |
@ConditionalOnWebApplication | 在web环境中条件生效 |
@ConditionalOnExpression | 根据表达式判断条件是否生效 |
@ConditionalOnClass | 当类路径上存在某个类时,才创建bean。 |
@ConditionalOnExpression | 基于SpEL表达式的结果来创建bean。 |
这几个注解通常会结合使用,一般都是在配置类中使用。
简单来讲,一般是在配置类上或者是@Bean修饰的方法上,添加此注解表示一个类是否要被Spring上下文加载,若满足条件则加载,若不满足条件则不加载。
二、@ConditionalOnProperty
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(OnPropertyCondition.class)
public @interface ConditionalOnProperty {
//数组,获取对应property名称的值,与name不可同时使用
String[] value() default {};
//property名称的前缀,可有可无
String prefix() default "";
//数组,property完整名称或部分名称(可与prefix组合使用,组成完整的property名称),与value不可同时使用
String[] name() default {};
//可与name组合使用,比较获取到的属性值与havingValue给定的值是否相同,相同才加载配置
String havingValue() default "";
//缺少该property时是否可以加载。如果为true,没有该property也会正常加载;反之报错
boolean matchIfMissing() default false;
}
请注意,@ConditionalOnProperty
和其他条件注解通常用于方法级别的bean定义,而不是字段注入。如果你想要条件性地注入一个字段,你可以使用@Autowired
配合@Conditional
注解在一个配置类中定义条件bean,然后将其注入到你的组件中。
例如:
@Configuration
public class MyConfiguration {
@Bean
@ConditionalOnProperty(name = "my.property.enabled", havingValue = "true")
public MyService myService() {
return new MyService();
}
}
@Component
public class MyComponent {
@Autowired(required = false)
private MyService myService;
// ...
}
在这个例子中,MyService
类型的myService
字段将仅在my.property.enabled
属性被设置为true
时被注入到MyComponent
中。required = false
参数确保了即使条件不满足(即myService
bean没有被创建),Spring也不会抛出异常,而是会将myService
设置为null
。
相关推荐
一、概述
1、spring容器
spring中有三种bean容器:BeanFactory、ApplicationContext、WebApplicationContext。
(1)BeanFactor
@ConditionalOnMissingBean只能在@Bean注解的方法上使用。
可以给该注解传入参数例如@ConditionOnMissingBean(name = "exa