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 ...
随机推荐
- windows版mysql添加远程访问
use mysql; ##然后查看下当前连接允许情况 select host, user, authentication_string, plugin from user; ##依次执行 CREATE ...
- win10系统,jdk环境变量配置,编辑系统变量窗口显示旧版单行和新版列表问题
大家好,今天说一下我在配置jdk环境变量时遇到的编辑系统变量窗口显示问题. 首先我们说一下如何配置jdk环境变量. 右击此电脑,点击属性. 跳出如下窗口,点击高级系统设置. 跳出如下窗口,点击环境变量 ...
- 一个好隐蔽的C/C++代码bug
来自:微博@ruanyf, 一本书上说,下面的 C 语言代码可能会产生无限循环.看了半天,才意识到 Bug 在哪里. 完美解答: 数组下标越界.数组a总共有10个值,a[0]~a[9].for循环里面 ...
- 基于聚类K-Means方法实现图像分割
”“”K-Means to realize Image segmentation “”“ import numpy as np import PIL.Image as image from sklea ...
- 笔记-9:使用random库生成随机数
random:主要目的是生成随机数 函数 说明 seed(a=None) 初始化随机数,默认值为当前系统时间 random() 生成一个[0.0,1.0)之间的随机数小数 randint(a,b) 生 ...
- asp.net core-1.在控制台创建ASP.NET Core应用程序
创建asp.net core应用程序,需要先把环境安装好,我这边选的是vs2017 第一步先执行dotnet 我执行dotnet --help可以把所有的命令全部列出来: 红框内就是我们可以用来初始化 ...
- C# EF添加ADO.NET实体数据模型时,产生.Desiger.cs文件为空
// T4 code generation is enabled for model 'D:\DKX4003\work\VWFC_CCS\SrcCCG-branch\CCGSPBOCOne-FCA\C ...
- SSL Virtual Servers
SSL Virtual Servers 来源 https://www.carlstalhood.com/ssl-virtual-servers-netscaler-12/ SSL Virtual Se ...
- 常用shell命令积累
把学习工作中见到的shell命令积累下来 创建文件夹 mkdir 创建文件 touch 发送get请求 curl xxxxx 发送post请求 curl -d xxxxx
- ElementUi使用表单验证出现验证问题
问题: 使用vue element-ui中的form表单验证出现了输入框或者下拉框中明明有值, 但是却还是提示请输入或请选择,错误如下: <el-form status-icon :ref=&q ...