01、条件化配置bean

@Bean
@Conditional(MagicExistsCondition.class)---->条件化创建bean
public MagicBean magicBean(){
return new MagicBean();
}

02、条件接口

public interface Condition{
boolean matches(ConditionContext ctxt, AnnotatedTypeMetadata metadata);
}

03、条件类实现

public class MagicExistsCondition implement Condition {
public boolean matches( ConditionContext context, AnnotatedTypeMetadata metadata){
Environment env = context.getEnvironment();
return env.containsProperty("magic"); ---->检查magic属性
}
}

04、ConditionContext接口

public interface ConditionContext{
BeanDefinitionRegistry getRegistry(); ---->检查bean定义
ConfigurableListableBeanFactory getBeanFactory(); ---->检查bean是否存在,并探查bean的属性
Environment getEnvironment(); ---->检查环境变量是否存在,及其值是什么
ResourceLoader getResourceLoader(); ---->探查加载的资源
ClassLoader getClassLoader(); ---->加载并检查类是否存在
}

05、AnnotatedTypeMetadata接口

public interface AnnotatedTypeMetadata{
boolean isAnnotated(String annotationType); ---->判断带@bean的注解,是否还带其它注解
Map<String, Object> getAnnotationAttributes(String annotationType); ---->检查其它注解的属性
Map<String, Object> getAnnotationAttributes(String annotationType, boolean classValuesAsString);
MultiValueMap<String, Object> getAllAnnotationAttributes(String annotationType);
MultiValueMap<String, Object> getAllAnnotationAttributes(String annotationType, boolean classValuesAsString);
}

06、举例:Profile注解的实现

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional(ProfileCondition.class)
public @interface Profile{
String [] value();
} class ProfileCondition implements Condition {
public boolean matches(ConditionContext context, AnnotatedTypeMethodMetadata metadata){
if(context.getEnvironment() != null){
MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.calss.getName());
if(attrs != null){
for(Object value : attrs.get("value")){
if(context.getEnvironment().acceptsProfiles((String[]) value)){
return true;
}
}
return false;---->没有激活,则不创建bean
}
}
return true;
}
}

002Conditional条件化创建bean的更多相关文章

  1. 001profile条件化创建bean

    01.类级别条件创建 @Configuration @Profile("dev") public class Aclass{}---->影响整个类,包括类的注解.开发环境,类 ...

  2. Spring 梳理-profile与条件化定义bean

    定义profile <beans> //root <beans profile="dev"> <bean id=.../> </beans ...

  3. 第3章—高级装配—条件化的Bean

    条件化的Bean 通过活动的profile,我们可以获得不同的Bean.Spring 4提供了一个更通用的基于条件的Bean的创建方式,即使用@Conditional注解. @Conditional根 ...

  4. (二)spring 高级装配-Condition -条件化的bean

    Condition:满足某个特定条件的情况下创建bean 条件化配置bean: a:@Conditional 指定一个class ,它指明了通过条件对比的类.如果没有指定class则通过Condito ...

  5. 【Java Web开发学习】Spring4条件化的bean

    [Java Web开发学习]Spring4条件化的bean 转载:https://www.cnblogs.com/yangchongxing/p/9071960.html Spring4引入了@Con ...

  6. Spring入门(六):条件化的bean

    1. 概念 默认情况下,Spring中定义的bean在应用程序启动时会全部装配,不管当前运行的是哪个环境(Dev,QA或者Prod),也不管当前运行的是什么系统(Windows或者Linux),但有些 ...

  7. Spring高级装配(二) 条件化的bean

    如果你希望一个bean在特定的条件下才会出现: 应用的类路径下包含特定的库时才创建 只有当某个特定的bean也声明之后才会创建 某个特定的环境变量设定之后才创建某个bean 在Spring 4之前,很 ...

  8. @Condition 条件化注册Bean

    看<Spring源码深度解析>笔记 1.@Condition: 按照一定的条件进行判断,满足条件给容器中注册bean:实例: 根据系统给容器中注册Bean,如果是windows注册(“bi ...

  9. spring对bean的高级装配之基于@Conditional条件化装配

    上篇介绍了如何基于profile来条件化创建bean,spring会根据profile的激活状态来进行创建;这篇介绍如何基于spring4.0引入的@Conditional和Condition接口来更 ...

随机推荐

  1. ObjectMapper 动态用法

    class DymicObject {     private Object o; public DymicObject(Object o) {         this.o = o;     } p ...

  2. gradle第一篇:初入门

    有的时候,感觉技术真是一年一个样,之前呢ant式微,被maven取代,而现在呢,maven慢慢式微,又渐渐要被gradle取代,不说多了我们现在就来讲一讲gradle吧. 第一步——安装: ①安装所需 ...

  3. DGIS之遥感影像数据获取

    1.概要 在GIS圈的同行或多或少接触过遥感,记得在大学老师就说过"数据是GIS的核心".本文介绍在国内下载遥感影像的方法. 地理空间数据云,这个是中科院计算机网络中心建设的一个免 ...

  4. 【Three.js】如何选中外部模型

    1.问题 three.js中模型选中使用的是射线法,根据摄像机角度,鼠标点击位置和模型选中的distance参数判断来选中模型.对于原生的矢量模型完全没有问题,但是当遇到导入的外部模型,如obj.st ...

  5. service iptables xxx无效命令的情况下,如何启动/重启iptables

    最近在CentOS 7.6下使用service iptables xxx相关命令,提示如下错误:The service command supports only basic LSB actions ...

  6. 剑指offer——面试题29:顺时针打印矩阵

    #include"iostream" #include"stdio.h" using namespace std; void PrintMatrixInCirc ...

  7. 使用NHibernate(6)-- HQL && ICriteria 简单介绍

    1,HQL. HQL是NHibernate特有的查询方式,早先的java语法还没有类似Linq的Jinq,所以Hibernate就弄了一套自己的查询语言,NHibernate移植的时候把这种语言也一块 ...

  8. maven 根据profile,resources,filters来区分部署环境

    项目过程中,在不同的阶段,分别需要部署开发环境,测试环境,线上环境.如果都用一套配置文件,很容易弄乱,所以维持多套配置文件很有必要. maven提供了一组属性以供开发人员灵活搭配,可以根据环境来打包, ...

  9. 【es6】变量解构赋值

    1.数组解构赋值 let [a,b,c]=[1,2,3];//数组解构赋值,注意:左右两边格式需一致 let [a,b]=[1,2,3];//不完全解构,取位置靠前的值 let [a=1,b]=[un ...

  10. Mysql5.7 半同步改进

    Mysql5.6半同步策略 Mysql 5.6在半同步的时候,采用的是After Commit策略.即在主库上commit了之后,等待从库返回确认. 在这里,首先会出现幻读的问题,即当前连接的事务读取 ...