zoukankan      html  css  js  c++  java
  • springBoot启动的时候动态选择装载某些bean

    一、缘起

    最近有这样一个场景,我们使用了elasticjob lite框架,希望某些job在指定服务器不启动。让spring动态的来装载所需要的job及相关bean

    这个时候可以使用@Conditional家族注解,该注解spring4.X后出现

    二、@Conditional

    @Conditional源码如下,接受一个参数,实现了Condition接口的Class

    Condition接口里面就一个方法

    ConditionContext可以获取到spring比较多有用信息,具体翻看api,AnnotatedTypeMetadata能获取到标注@Conditional注解的类或方法的信息,有几个实现类,想获取这些信息需要强转到子类获取,matches()方法返回true他就会装载这个bean,返回false就不会去装载,当时我把他和@Bean注解还有@Service注解一起配合使用

    以下是自定义Condition类代码

    import org.springframework.context.annotation.Condition;
    import org.springframework.context.annotation.ConditionContext;
    import org.springframework.core.env.Environment;
    import org.springframework.core.type.AnnotatedTypeMetadata;
    import org.springframework.core.type.classreading.AnnotationMetadataReadingVisitor;
    import org.springframework.core.type.classreading.MethodMetadataReadingVisitor;
    
    public class MyCondition implements Condition {
    
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            Environment env = context.getEnvironment();
            String enableGroup = env.getProperty("simpleJob.enableGroup");
            boolean result = true;
            if (metadata instanceof MethodMetadataReadingVisitor){
                MethodMetadataReadingVisitor mmrv = (MethodMetadataReadingVisitor) metadata;
                String methodName = mmrv.getMethodName();
                result = methodName.toUpperCase().startsWith(enableGroup);
            }else if (metadata instanceof AnnotationMetadataReadingVisitor){
                AnnotationMetadataReadingVisitor amrv = (AnnotationMetadataReadingVisitor) metadata;
                String className = amrv.getClassName();
                String simpleClassName = className.substring(className.lastIndexOf("."));
                result = simpleClassName.toUpperCase().startsWith(enableGroup);
            }
            return result;
        }
    }

     引用《Spring Boot实战》一书中@Conditional家族注解的解释

    三、Spring Boot中的运用

    其实Spring Boot的自动配置全都是基于这些注解来实现的,@Conditional家族注解是springboot提供自动配置的关键

    1、首先配置类上面会有@ConditionalOnClass注解,来说明存在某个class我就启动这个配置类

    2、然后类中的方法会带有@ConditionalOnMissBean注解,如果上下文不存在某个bean就去运行下面的方法,装载bean

    下图以jdbcTemplate和web自动配置为例

     

  • 相关阅读:
    spring
    google-c-style
    process想停就停,真爽
    mytop
    Java 图片设置圆角(设置边框,旁白)
    当setTimeout遇到闭包
    FreeMarker辅助
    ImageIO.wtrie生成jpg图片质量损失方案:BufferedImage生成jpg图片文件流
    从BufferedImage到InputStream,实现绘图后进行下载(生成二维码图片并下载)
    使用Javascript 实现类
  • 原文地址:https://www.cnblogs.com/xhy-shine/p/10678180.html
Copyright © 2011-2022 走看看