Spring注解@Conditional相关用法

世上唯一不能复制的是时间,唯一不能重演的是人生,唯一不劳而获的是年龄。该怎么走,过什么样的生活,全凭自己的选择和努力。人生很贵,请别浪费!与智者为伍,与良善者同行。Spring注解@Conditional相关用法,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1.@Conditional注解

@ConditionalSpring4新提供的注解。
它的作用是按照一定的条件进行判断,满足条件给容器注册bean,否则不注入。
可以作用在方法上,也可以作用在类上。
使用的时候需要传入实现Condition接口类数组。
如果是类和方法都加了@Conditional注解,最终在方法上的注解为最终的条件。
如果返回true则加入容器,反之不会加入容器。
如果只是类上加了@Conditional注解,整个类的所有方法都会加入容器中。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Animal {
    private String name;
    private String skill;
}
@Configuration
public class AnimalConfig {
    @Bean(name = "dog")
    @Conditional({Test1.class})
    public Animal dog(){return new Animal("阿拉斯加","看门"); }
    @Bean(name = "cat")
    @Conditional({Test2.class})
    public Animal cat(){return new Animal("小花猫","抓老鼠");}
}
public class Test1 implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return true;
    }
}
public class Test2 implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return false;
    }
}

测试

Map<String, Animal> beansOfType = this.applicationContext.getBeansOfType(Animal.class);
Animal bean = this.applicationContext.getBean(Animal.class);
log.warn("Animal Type: {}", beansOfType);
System.out.println(JSON.toJSONString(beansOfType));
log.warn("==========================================");
Data Animal Type: {dog=Animal(name=阿拉斯加, skill=看门)}
{"dog":{"name":"阿拉斯加","skill":"看门"}}

2.@ConditionalOnBean注解

@ConditionalOnBean 
当容器中有指定的Bean条件下 , 才会实例化一个Bean@ConditionalOnClassClasspath类路径下有指定某个class的条件下,才会实例化一个Bean。。
@ConditionalOnExpression 
基于SpEL表达式的条件判断。当表达式值为true的时候,才会实例化一个Bean
public class Test1{}
@Configuration
public class Test2 {}
@Configuration
public class AnimalConfig {
    @Bean(name = "dog")
    @ConditionalOnBean(Test1.class)
    public Animal dog(){
        return new Animal("阿拉斯加","看门");
    }
    @Bean(name = "cat")
    @ConditionalOnBean(Test2.class)
    public Animal cat(){
        return new Animal("小花猫","抓老鼠");
    }
}
Map<String, Animal> beansOfType = this.applicationContext.getBeansOfType(Animal.class);
log.warn(" Data Animal Type: {}", JSON.toJSONString(beansOfType));
Data Animal Type: {"cat":{"name":"小花猫","skill":"抓老鼠"}}

3.@ConditionalOnMissingBean注解

@ConditionalOnMissingBean 
当容器里没有指定Bean的条件下进行实例化。
仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean。
保证bean只有一个,实例只有一个,当注册多个相同的bean时,会出现异常
@Bean注解
可以注册多次,这时需要用的@Primary来确定要实现哪个。
@ConditionalOnMissingClass 当类路径下没有指定类的条件下,才会实例化一个Bean
public class Test1{}
@Configuration
public class Test2 {}
@Configuration
public class AnimalConfig {
    @Bean(name = "dog")
    @ConditionalOnMissingBean(value = Test1.class)
    public Animal dog(){
        return new Animal("阿拉斯加","看门");
    }
    @Bean(name = "cat")
    @ConditionalOnMissingBean(value = Test2.class)
    public Animal cat(){
        return new Animal("小花猫","抓老鼠");
    }
}
@Slf4j
@Configuration
public class TestConfiguration implements ApplicationContextAware {
	private ApplicationContext applicationContext;
	 @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
     @PostConstruct
    public void post() {
       Map<String, Animal> beansOfType = this.applicationContext.getBeansOfType(Animal.class);
	   log.warn(" Data Animal Type: {}", JSON.toJSONString(beansOfType));
    }
}
Data Animal Type: {"dog":{"name":"阿拉斯加","skill":"看门"}}

4.@ConditionalOnProperty注解

用来控制配置类是否生效,读取配置文件指定的属性,如果指定的值相同进行实例化。
//指定的属性路径 prefix+name
String[] value() default {};
//指定的属性的前缀
String prefix() default "";
//指定的属性
String[] name() default {};
//指定的值
String havingValue() default "";
//从properties中读取某个属性值,如果该值为空,可以配置true或者false
boolean matchIfMissing() default false;
//举例
@ConditionalOnProperty(value = "apps.test.enable", havingValue = "true", matchIfMissing = true)

5.其他@ConditionalOnXXX相关注解

@ConditionalOnWebApplication 当项目是一个Web项目时进行实例化。
@ConditionalOnNotWebApplication 当项目不是一个Web项目时进行实例化。
@ConditionalOnJava:当JVM版本为指定的版本范围时触发实例化。
@ConditionalOnResource:当类路径下有指定的资源时触发实例化。
@ConditionalOnJndi:在JNDI存在的条件下触发实例化。
@ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个、或者有多个,
但是指定了首选的Bean时,才会触发实例化。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/260320.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!