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自动配置为例

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM