1.@Conditional注解

@Conditional 是Spring4新提供的注解。
它的作用是按照一定的条件进行判断,满足条件给容器注册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。
@ConditionalOnClass
当Classpath类路径下有指定某个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时,才会触发实例化。

Spring注解@Conditional相关用法的更多相关文章

  1. Spring注解(赋值相关)

    上面是与生命周期有关的内容,下面是属性赋值相关的: @Configuration public class ProperTyValueConfig { @Bean public Person pers ...

  2. spring注解的相关配置

    一.<context:annotation-config> 和 <context:component-scan> <context:annotation-config&g ...

  3. spring注解value的用法

    spring@value注解可以获取配置的*.properties中的值 具体见

  4. Spring注解@Value的用法

    有时候我们在配置文件中使用配置的信息不仅需要在xml文件中使用,还可能在类中使用,这个时候,我们可使用@Value注解了: @Value("${rest.service.url}" ...

  5. spring boot @ConditionalOnxxx相关注解总结

    Spring boot @ConditionalOnxxx相关注解总结 下面来介绍如何使用@Condition public class TestCondition implements Condit ...

  6. 二、Spring注解之@Conditional

    Spring注解之@Conditional [1]@Conditional介绍 ​ @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean. ...

  7. Spring Boot实战笔记(八)-- Spring高级话题(条件注解@Conditional)

    一.条件注解@Conditional 在之前的学习中,通过活动的profile,我们可以获得不同的Bean.Spring4提供了一个更通用的基于条件的Bean的创建,即使用@Conditional注解 ...

  8. Spring注解?啥玩意?

    目录 基础概念:@Bean 和 @Configuration 使用AnnotationConfigApplicationContext 实例化Spring容器 简单的构造 使用register注册IO ...

  9. 0、Spring 注解驱动开发

    0.Spring注解驱动开发 0.1 简介 <Spring注解驱动开发>是一套帮助我们深入了解Spring原理机制的教程: 现今SpringBoot.SpringCloud技术非常火热,作 ...

  10. 【建议收藏】阿里P7总结的Spring注解笔记,把组件注册讲的明明白白

    环境搭建 注解的方式是通过配置类的方式来注入组件,注解注入要比XML注入的方式简单,注解注入也需要在前者的基础上,添加一个spring-context的包,也是实际开发中常用的方式. 准备所需Jar包 ...

随机推荐

  1. Electron问题记录01:关于electron的notification在win10下不显示问题

    0.问题描述 在学习electron官网的notification例程时, 使用官网的代码运行时无法按照预期弹出窗口,在查询官网时发现以下解决方法. 官网解决方法:在 Windows 10 上,您的应 ...

  2. UG二次开发-内存访问违例

    在项目中修改路径参数后重算发生了内存访问违例的错误,经过调试,发现是下面这一行出的错 surfaceContourBuilder1.Commit(); 经过反复调试,发现这个东西不能随便放,不可以想当 ...

  3. kvm虚拟机添加在线快照

    1-1.创建默认快照--一般为一串数字 virsh snapshot-create 虚拟机名称 1-2.创建自定义名称快照 virsh snapshot-create-as 虚拟机名称 快照名称 2. ...

  4. 面试题:int[] arr 和 int... arr在参数列表中是一回事儿吗?

    public class Exer { public static void main(String[] args) { Base1 b1 = new Sub1(); b1.add(1,2,3); } ...

  5. SQLyog 13.1.1.0注册码证书秘钥

    注册信息: Name:(用户名随意) License Key: Professional: 8e053a86-cdd3-48ed-b5fe-94c51b3d343c Enterprise: a4668 ...

  6. C++ || 用类 写交换函数 ||函数指针传递

    点击查看代码 #include <iostream> using namespace std; void swap(int* a,int* b) //函数参数为指针形式 { int p = ...

  7. Navicat 连接MySQL数据库 报错2059

    Navicat 连接MySQL数据库 报错2059 - authentication plugin 'caching_sha2_password'的解决办法 2059 - Authentication ...

  8. websocket 数据分析

    WebSocket是一种通过单个TCP连接提供全双工通信信道的协议.2011年,IETF将WebSocket协议标准化为RFC 6455,W3C正在对Web IDL中的WebSocket API进行标 ...

  9. Go_day03

    Go基础语法 数组 数组是具有相同唯一类型的一组以编号且长度固定的数据项序列.类型可以是任意基本类型或者自定义类型. 数组一旦被定义后,大小不能被改变 func main() { //定义一个数组 v ...

  10. day01-2-依赖管理和自动配置

    依赖管理和自动配置 1.依赖管理 1.1什么是依赖管理 spring-boot-starter-parent 中还有父项目,声明了开发中常用的依赖的版本号 并且进行自动版本仲裁,即如果程序员没有指定某 ...