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. Thinking In Java 4th Chap7 复用类

    复用代码的两种方法:组合和继承 组合方法:(新类中产生现有类的对象) 没什么好说的,就是调用别类的对象而已 值得一提的是一个特殊方法:toString()当需要一个String却只有对象时能够自动调用 ...

  2. 【数据结构 Python & C++】顺序表

    用C++ 和 Python实现顺序表的简单操作 C++代码 // Date:2019.7.31 // Author:Yushow Jue #include<iostream> using ...

  3. 去除element-ui table表格右侧滚动条的高度

    /* //element-ui table的去除右侧滚动条的样式 */ ::-webkit-scrollbar { width: 1px; height: 1px; } /* // 滚动条的滑块 */ ...

  4. electron实现透明点投的方法

    1. electron createWindow 的时候 设置 transparent: true, clickThrough: 'pointer-events' 2. body 上添加 pointe ...

  5. 写文章 通俗易懂 悲观锁、乐观锁、可重入锁、自旋锁、偏向锁、轻量/重量级锁、读写锁、各种锁及其Java实现!

    网上关于Java中锁的话题可以说资料相当丰富,但相关内容总感觉是一大串术语的罗列,让人云里雾里,读完就忘.本文希望能为Java新人做一篇通俗易懂的整合,旨在消除对各种各样锁的术语的恐惧感,对每种锁的底 ...

  6. css 动画(二) transition 过渡 & animation 动画

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! translate:平移:是transform的一个属性: transform:变形:是一个静态属性,可以 ...

  7. (六)Hibernate的增删改查操作(3)

    一.在Hibernate中使用原生SQL语句 sql语句面向的是数据库,所以sql语句中对应的不再是bean了,比如sql="select * from user"   在hql中 ...

  8. 微信小程序wx:key以及wx:key=" *this"详解:

    今天写微信小程序无意中看到控制台给出了这样一行提示: 求解百度才知道,给大家分享一下: 1.wx:for定义 官方文档:在组件上使用 wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲 ...

  9. 客户端相关知识学习(十一)之Android H5交互Webview实现localStorage数据存储

    前言 最近有一个需求是和在app中前端本地存储相关的,所以恶补了一下相关知识 webView开启支持H5 LocalStorage存储 有些时候我们发现写的本地存储没有起作用,那是因为默认WebVie ...

  10. python实现暴力破解

    import urllib2 import urllib import cookielib import threading import sys import Queue from HTMLPars ...