SpringBoot的條件裝配原理及實(shí)現(xiàn)思路
一.前言
SpringBoot的條件裝配是基于@Conditional注解實(shí)現(xiàn)的。下面我們使用原生的@Conditional注解模擬實(shí)現(xiàn)類的條件裝配。
二.實(shí)現(xiàn)思路
1.實(shí)現(xiàn)Condition接口
寫一個(gè)類實(shí)現(xiàn)Condition接口并重寫matches方法,matches方法返回的布爾值決MyConditional1是否生效。下面我們模擬DruidDataSource類存在則返回真。
static class MyConditional1 implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return ClassUtils.isPresent("com.alibaba.druid.pool.DruidDataSource", null);
}
}同上,但是條件剛好相反,模擬DruidDataSource類不存在則返回真。
static class MyConditional2 implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return !ClassUtils.isPresent("com.alibaba.druid.pool.DruidDataSource", null);
}
}2.使用注解@Conditional條件裝配自動(dòng)配置類
自動(dòng)配置類生效與否取決于自我實(shí)現(xiàn)的MyConditional1、MyConditional2類中match方法的返回值。
@Configuration
@Conditional(MyConditional1.class)
static class AutoConfiguration1{
@Bean
public Bean1 Bean1(){
return new Bean1();
}
}
@Configuration
@Conditional(MyConditional2.class)
static class AutoConfiguration2{
@Bean
public Bean2 Bean2(){
return new Bean2();
}
}
static class Bean1{
}
static class Bean2{
}3.測(cè)試代碼如下
package com.example.springdemo.demos.a08;
import org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration;
import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext;
import org.springframework.context.annotation.*;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.util.ClassUtils;
/**
* @author zhou
* @version 1.0
* @description TODO
* @date 2025/8/24 16:11
*/
public class TestMyConditional {
public static void main(String[] args) {
AnnotationConfigServletWebServerApplicationContext context = new AnnotationConfigServletWebServerApplicationContext();
context.registerBean("config", Config.class);
context.refresh();
for(String name : context.getBeanDefinitionNames()){
String resource = context.getBeanDefinition(name).getResourceDescription();
if(resource != null){
System.out.println(name + "來(lái)源:"+resource);
}
}
context.close();
}
@Configuration
@Import(MyImportSelector.class)
static class Config{
}
static class MyImportSelector implements DeferredImportSelector{
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{AutoConfiguration1.class.getName(),AutoConfiguration2.class.getName(), ServletWebServerFactoryAutoConfiguration.class.getName()};
}
}
static class MyConditional1 implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return ClassUtils.isPresent("com.alibaba.druid.pool.DruidDataSource", null);
}
}
static class MyConditional2 implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return !ClassUtils.isPresent("com.alibaba.druid.pool.DruidDataSource", null);
}
}
@Configuration
@Conditional(MyConditional1.class)
static class AutoConfiguration1{
@Bean
public Bean1 Bean1(){
return new Bean1();
}
}
@Configuration
@Conditional(MyConditional2.class)
static class AutoConfiguration2{
@Bean
public Bean2 Bean2(){
return new Bean2();
}
}
static class Bean1{
}
static class Bean2{
}
}4.測(cè)試結(jié)果

由于我的代碼中不存在com.alibaba.druid.pool.DruidDataSource類,所以AutoConfiguration1類配置的Bean1沒有生效,所以輸出Bean1。現(xiàn)在我們換一個(gè)存在的類,代碼中的一個(gè)類com.example.springdemo.demos.a08.TestMyConditional.AutoConfiguration1,由于該類存在,所以AutoConfiguration1類上的配置生效,AutoConfiguration2類上剛好需要相反的條件,所以不成立。最后打印了Bean1類。

到此這篇關(guān)于SpringBoot的條件裝配原理及實(shí)現(xiàn)思路的文章就介紹到這了,更多相關(guān)SpringBoot條件裝配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Apache Commons fileUpload文件上傳多個(gè)示例分享
這篇文章主要為大家分享了Apache Commons fileUpload文件上傳4個(gè)示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Spring Security OAuth2 授權(quán)碼模式的實(shí)現(xiàn)
這篇文章主要介紹了Spring Security OAuth2 授權(quán)碼模式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Java中excel表數(shù)據(jù)的批量導(dǎo)入方法
這篇文章主要為大家詳細(xì)介紹了Java中excel表數(shù)據(jù)的批量導(dǎo)入方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Java中的MessageFormat.format用法實(shí)例
這篇文章主要介紹了Java中的MessageFormat.format用法實(shí)例,本文先是講解了MessageFormat的語(yǔ)法,然后給出了多個(gè)操作實(shí)例,需要的朋友可以參考下2015-06-06

