springBoot启动的时候动态选择装载某些bean

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

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

@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;
    }
}

 

@ConditionalOnBean(上下文存在某个对象时,才会实例化一个bean)

@ConditionalOnClass(存在某个类时,不存在也不能填啊,汗、、、)

@ConditionalOnExpression(表达式为true的时候,才会实例化一个Bean)

@ConditionalOnMissingBean(上下文中不存在某个对象时,才会实例化一个Bean)

@ConditionalOnMissingClass(按意思是不存在某个类的时候偶会进入条件,但是测试并没有用,不知怎么回事)

@ConditionalOnNotWebApplication(不是web应用的时候,条件成立)

@ConditionalOnProperty(这个更配置文件有关,对配置属性的判断)

 

转载于:https://www.cnblogs.com/xhy-shine/p/10678180.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值