最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot的條件裝配原理及實現(xiàn)思路

 更新時間:2025年08月26日 11:17:58   作者:練習(xí)時長一年  
SpringBoot的條件裝配是基于@Conditional注解實現(xiàn)的,下面我們使用原生的@Conditional注解模擬實現(xiàn)類的條件裝配,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

一.前言

       SpringBoot的條件裝配是基于@Conditional注解實現(xiàn)的。下面我們使用原生的@Conditional注解模擬實現(xiàn)類的條件裝配。

二.實現(xiàn)思路

1.實現(xiàn)Condition接口

       寫一個類實現(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條件裝配自動配置類

         自動配置類生效與否取決于自我實現(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.測試代碼如下

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 + "來源:"+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.測試結(jié)果

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

到此這篇關(guān)于SpringBoot的條件裝配原理及實現(xiàn)思路的文章就介紹到這了,更多相關(guān)SpringBoot條件裝配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Apache Commons fileUpload文件上傳多個示例分享

    Apache Commons fileUpload文件上傳多個示例分享

    這篇文章主要為大家分享了Apache Commons fileUpload文件上傳4個示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Spring Security OAuth2 授權(quán)碼模式的實現(xiàn)

    Spring Security OAuth2 授權(quán)碼模式的實現(xiàn)

    這篇文章主要介紹了Spring Security OAuth2 授權(quán)碼模式的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Spring整合Quartz開發(fā)代碼實例

    Spring整合Quartz開發(fā)代碼實例

    這篇文章主要介紹了Spring整合Quartz開發(fā)代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Spring中的BeanFactory工廠詳細(xì)解析

    Spring中的BeanFactory工廠詳細(xì)解析

    這篇文章主要介紹了Spring中的BeanFactory工廠詳細(xì)解析,Spring的本質(zhì)是一個bean工廠(beanFactory)或者說bean容器,它按照我們的要求,生產(chǎn)我們需要的各種各樣的bean,提供給我們使用,需要的朋友可以參考下
    2023-12-12
  • Java Spring處理循環(huán)依賴詳解

    Java Spring處理循環(huán)依賴詳解

    這篇文章主要介紹了Java中的Spring如何處理循環(huán)依賴,依賴指的是Bean與Bean之間的依賴關(guān)系,關(guān)于更多Spring?處理循環(huán)依賴的詳情,需要的朋友可以參考下面文章具體內(nèi)容
    2023-04-04
  • 詳解Java設(shè)計模式之職責(zé)鏈模式

    詳解Java設(shè)計模式之職責(zé)鏈模式

    責(zé)任鏈模式是一種行為設(shè)計模式,使多個對象都有機會處理請求,從而避免請求的發(fā)送者和接收者之間的耦合關(guān)系,文中通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Java中excel表數(shù)據(jù)的批量導(dǎo)入方法

    Java中excel表數(shù)據(jù)的批量導(dǎo)入方法

    這篇文章主要為大家詳細(xì)介紹了Java中excel表數(shù)據(jù)的批量導(dǎo)入方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Java中文件管理系統(tǒng)FastDFS詳解

    Java中文件管理系統(tǒng)FastDFS詳解

    這篇文章主要介紹了Java中文件管理系統(tǒng)FastDFS詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java中的MessageFormat.format用法實例

    Java中的MessageFormat.format用法實例

    這篇文章主要介紹了Java中的MessageFormat.format用法實例,本文先是講解了MessageFormat的語法,然后給出了多個操作實例,需要的朋友可以參考下
    2015-06-06
  • Java控制流程示例代碼詳解

    Java控制流程示例代碼詳解

    這篇文章主要介紹了Java控制流程,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03

最新評論

都兰县| 中牟县| 潢川县| 准格尔旗| 广德县| 汉川市| 房产| 义乌市| 万山特区| 岚皋县| 泾川县| 玛多县| 宁河县| 黄大仙区| 黑山县| 黄山市| 汝阳县| 峨眉山市| 神木县| 南川市| 思南县| 柳州市| 五华县| 永新县| 滕州市| 方正县| 岚皋县| 萨嘎县| 铜山县| 河北区| 黔江区| 北辰区| 闻喜县| 红原县| 邳州市| 东乌| 信阳市| 奉化市| 瓮安县| 嘉义市| 方山县|