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