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