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的更多相关文章

  1. 四、Spring中使用@Conditional按照条件注册Bean

    以前其实是写过@Condtional注解的笔记的,这里附上链接: Spring中的@conditional注解 但已经忘记的差不多了,所以今天再重新学习下,可以互补着学习 @Contional:按照一 ...

  2. Spring注解驱动开发03(按照条件注册bean)

    按照条件注册bean 使用@Conditional注解来控制bean的注册 使用步骤 先实现Condition接口,条件写在matches方法里 注意事项:Condition接口是org.spring ...

  3. Vue 全局注册逐渐 和 局部注册组件

    //定义一个名为 button-counter 的新组件 Script: Vue.component('button-counter',{//button-counter 这个是组件的名字 data: ...

  4. 最原始的COM组件调用过程(不使用注册表信息)

    最原始的COM组件调用过程(不使用注册表信息) 最近因为项目的关系开始研究COM组件了,以前都认为COM过时了,所以也没怎么接触. 现在好好补补课了. 一般调用COM都是通过注册表找到它的位置, 然后 ...

  5. Django【第23篇】:利用Form组件和ajax实现的注册

    利用Form组件和ajax实现的注册 一.注册相关的知识点 1.Form组件 我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面 ...

  6. Django-利用Form组件和ajax实现的注册

    利用Form组件和ajax实现的注册 一.注册相关的知识点 1.Form组件 我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面 ...

  7. 第七十一篇:Vue组件的私有和全局注册

    好家伙, 1.组件的父子关系 我们封装三个组件,分别为left组件,right组件和App组件 在封装时: 在封装时,彼此的关系是独立的,并不存在父子关系 在使用时: 在使用时,根据彼此的嵌套关系,形 ...

  8. SpringCloud-服务注册与发现(注册中心)

    SpringCloud-服务注册与发现(注册中心) 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:作者使用IDEA + Gradle 注:需要有一定的java&& ...

  9. SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-003-@Conditional根据条件生成bean及处理profile

    一.用@Conditional根据条件决定是否要注入bean 1. package com.habuma.restfun; public class MagicBean { } 2. package ...

随机推荐

  1. 正则表达式(Regular Expression, RegEx)学习入门

    1. 概述 正则表达式(Regular Expression, RegEx)是一种匹配模式,描述的是一串文本的特征. 正如自然语言中高大.坚固等词语抽象出来描述事物特征一样,正则表达式就是字符的高度抽 ...

  2. Django路由配置

    Django路由配置系统.视图函数 1.路由配置系统(URLconf) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是 ...

  3. 2019java学习路线图

    学习路线图往往是学习一样技术的入门指南.网上搜到的Java学习路线图也是一抓一大把.但是很多学习路线图总结的云里雾里,也没有配套的视频,学习效果并不好. 分享一个完整的Java学习路线图给大家,也是贴 ...

  4. 【5号课堂】scratch制作电子生日贺卡

    贺卡在我国的使用由来已久,在古代,上层士大夫有用名帖互相问候的习俗 唐宋以后,贺卡的名称及功能有所进步,称为”门状“或“飞帖“,到了明清,又叫“红单“.“贺年帖“等等,听着名字就知功能越来越世俗化,文 ...

  5. ActiveMQ Queue示例

    一.Queue 发送 public class JmsSend { public static void main(String[] args) throws JMSException { Conne ...

  6. linux中的内核级防火墙(SELINUX)

    SElinux是基于内核开发出来的一种安全机制,被称之为内核级加强型防火墙,有力的提升了系统的安全性. SElinux的作用分为两方面:1.在服务上面加上标签: 2.在功能上面限制功能 在linux系 ...

  7. B+Tree的基本介绍

    概念 特点 B-Tree有许多变种,其中最常见的是B+Tree,例如MySQL就普遍使用B+Tree实现其索引结构. 与B-Tree相比,B+Tree有以下不同点: 每个节点的指针上限为2d而不是2d ...

  8. CCF 201809-1 卖菜

    题目: 问题描述 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜. 第一天,每个商店都自己定了一个价格.店主们希望自己的菜价和其他商店的一致,第二天,每一家商店都会根据他自己 ...

  9. T4模板使用笔记

    路径获取 ① 获取当前解决方案路径 string solutionsPath = Host.ResolveAssemblyReference("$(SolutionDir)"); ...

  10. C#操作DOS命令,并获取处理返回值

    // /*---------------- // // 文件名:Method // // 文件功能描述: // //    使用 ADB 来进行安卓设备与PC端之间的文件交互,具体adb命令操作请百度 ...