7、组件注册-@Conditional-按照条件注册bean
7、组件注册-@Conditional-按照条件注册bean
- @Conditional 按照一定的条件进行判断,满足条件给容器注入bean
- 按照条件进行动态装配。
- Spring 4 开始提供的一个注解,Spring Boot底层大量运用此注解。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
/**
* All {@link Condition Conditions} that must {@linkplain Condition#matches match}
* in order for the component to be registered.
*/
Class<? extends Condition>[] value();
}
7.1 编写自定义的条件判断Condition
- 需求:根据当前的os.name判断,如果是Linux则注入linus,如果是Windos则注入bill
- MainConfig.java类下 新添加 linus 和bill两个bean。
/**
* 如果是windows 注册bill
*
* @return
*/
@Conditional({WindowsConditional.class})
@Bean("bill")
public Pension pension01() {
return new Pension("bill", 23);
}
/**
* linux
*
* @return
*/
@Bean("linus")
@Conditional({LinuxConditional.class})
public Pension pension02() {
return new Pension("linus", 48);
}
7.2 实现自定义的LinuxConditional 和 WindowsConditional
- 需要实现 org.springframework.context.annotation.Condition 接口,重写matches方法。
package com.hw.springannotation.conditional;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* @Description TODO
* @Author hw
* @Date 2018/11/28 15:02
* @Version 1.0
*/
public class LinuxConditional implements Condition {
/**
* Determine if the condition matches.
*
* @param context 判断条件使用的上下文环境
* @param metadata 当前标注了该注解的注释信息
*/
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// TODO: 2018/11/28 判断是否是linux系统
// 1 能获取到ioc使用的beanFactory
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
// 2 获取类加载器
ClassLoader classLoader = context.getClassLoader();
// 3 获取当前环境信息
Environment environment = context.getEnvironment();
// 4 获取bean定义的注册类
BeanDefinitionRegistry beanDefinitionRegistry = context.getRegistry();
// 判断容器中是否包含某个bean
boolean de = beanDefinitionRegistry.containsBeanDefinition("pension");
String property = environment.getProperty("os.name");
if (property.contains("Linux")) {
return true;
}
return false;
}
}
package com.hw.springannotation.conditional;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* @Description TODO
* @Author hw
* @Date 2018/11/28 15:02
* @Version 1.0
*/
public class WindowsConditional implements Condition {
/**
* Determine if the condition matches.
*
* @param context 判断条件使用的上下文环境
* @param metadata 当前标注了该注解的注释信息
*/
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// TODO: 2018/11/28 是否是Windows操作系统
Environment environment = context.getEnvironment();
String property = environment.getProperty("os.name");
if (property.contains("Windows")) {
return true;
}
return false;
}
}
7.4 运行测试类
@Test
public void test3() {
String[] names = applicationContext.getBeanNamesForType(Pension.class);
for (String name : names) {
System.out.println(name);
}
// 获取操作系统环境变量值 Windows 7
Environment environment = applicationContext.getEnvironment();
String osName = environment.getProperty("os.name");
System.out.println(osName);
Map<String, Pension> map = applicationContext.getBeansOfType(Pension.class);
System.out.println(map);
}
运行如下:

我们更改测试类运行的JVM环境,设置-Dos.name=Linux,如图所示:

再次运行如下:

7.4 @Conditional 用法
- 标注在方法上,只有满足条件,该bean才能注册
- 标注在类上,只有满足条件,该类中配置的bean注册才能生效
7、组件注册-@Conditional-按照条件注册bean的更多相关文章
- 四、Spring中使用@Conditional按照条件注册Bean
以前其实是写过@Condtional注解的笔记的,这里附上链接: Spring中的@conditional注解 但已经忘记的差不多了,所以今天再重新学习下,可以互补着学习 @Contional:按照一 ...
- Spring注解驱动开发03(按照条件注册bean)
按照条件注册bean 使用@Conditional注解来控制bean的注册 使用步骤 先实现Condition接口,条件写在matches方法里 注意事项:Condition接口是org.spring ...
- Vue 全局注册逐渐 和 局部注册组件
//定义一个名为 button-counter 的新组件 Script: Vue.component('button-counter',{//button-counter 这个是组件的名字 data: ...
- 最原始的COM组件调用过程(不使用注册表信息)
最原始的COM组件调用过程(不使用注册表信息) 最近因为项目的关系开始研究COM组件了,以前都认为COM过时了,所以也没怎么接触. 现在好好补补课了. 一般调用COM都是通过注册表找到它的位置, 然后 ...
- Django【第23篇】:利用Form组件和ajax实现的注册
利用Form组件和ajax实现的注册 一.注册相关的知识点 1.Form组件 我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面 ...
- Django-利用Form组件和ajax实现的注册
利用Form组件和ajax实现的注册 一.注册相关的知识点 1.Form组件 我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面 ...
- 第七十一篇:Vue组件的私有和全局注册
好家伙, 1.组件的父子关系 我们封装三个组件,分别为left组件,right组件和App组件 在封装时: 在封装时,彼此的关系是独立的,并不存在父子关系 在使用时: 在使用时,根据彼此的嵌套关系,形 ...
- SpringCloud-服务注册与发现(注册中心)
SpringCloud-服务注册与发现(注册中心) 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:作者使用IDEA + Gradle 注:需要有一定的java&& ...
- SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-003-@Conditional根据条件生成bean及处理profile
一.用@Conditional根据条件决定是否要注入bean 1. package com.habuma.restfun; public class MagicBean { } 2. package ...
随机推荐
- NotePad++ 正则表达式 转
https://gerardnico.com/ide/notepad/replace https://notepad-plus-plus.org/community/topic/16787/find- ...
- C++:链表(有头链表)
介绍 把链表分为无头链表和有头链表. 无头链表:所有的节点都包含了有效数据,上一篇文章中演示代码使用的就是无头链表. 有头链表:用一个固定的头节点来指代整个链表,所有的对象都挂在这个头节点下面,而头节 ...
- mosquitto安装遇到问题和解决办法
问题1 make编译报错,提示xsltproc命令未找到 解决办法: yum install libxslt 问题2 make编译报错,提示: failed to load external ent ...
- scratch少儿编程第一季——02、scratch界面介绍
各位小伙伴大家好: 上期我们简单的介绍了Scratch的一些基本信息,和scratch软件的下载. 今天我们一起来了解一下Scratch的编程界面的介绍. 关于版本我考虑之后还是决定基于Scratch ...
- uboot 与 代码重定位
ref: https://blog.csdn.net/dhauwd/article/details/78566668 https://blog.csdn.net/yueqian_scut/articl ...
- (二十一)SpringBoot之集成mybatis:使用mybatis xml
一.引入maven依赖 <dependencies> <dependency> <groupId>org.springframework.boot</grou ...
- 微软升级 WSL Window Subsystem for Linux Win10系统自带Linux
在设计之初,微软就允许类似于Win32这种子系统运行于windows NT内核之上,它可以为上层应用提供编程接口,同时避免应用去实现内核里的一些调用细节.NT内核的设计在最开始就可以支持POSIX,O ...
- 使用element-ui中的el-upload组件时携带其他参数
解决方法:// template <el-upload action="/api/oss/file/add" :headers="headers" // ...
- (详细)JAVA使用JDBC连接MySQL数据库(2)- MySQL Connectors
欢迎任何形式的转载,但请务必注明出处. 本节内容 mysql connectors介绍 下载安装 在java中配置 点击进入官网下载 一.mysql connectors介绍 mysql connec ...
- iOS有哪些数据类型/基本数据类型?
简述 本文主要探究使用OC作为iOS开发语言时,我们能使用哪些数据类型. 一切类型始于C. C语言的类型 基本数据类型: 基本数据类型(fundamental data types)也叫原始数据类型( ...