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

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

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

一.前言

       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文件上傳多個(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)

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

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

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

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

    這篇文章主要介紹了Spring中的BeanFactory工廠詳細(xì)解析,Spring的本質(zhì)是一個(gè)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è)計(jì)模式之職責(zé)鏈模式

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

    責(zé)任鏈模式是一種行為設(shè)計(jì)模式,使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(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ì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Java中文件管理系統(tǒng)FastDFS詳解

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

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

    Java中的MessageFormat.format用法實(shí)例

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

    Java控制流程示例代碼詳解

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

最新評(píng)論

杭锦后旗| 邛崃市| 慈利县| 汝南县| 锡林郭勒盟| 潮州市| 浦东新区| 鹤庆县| 扎赉特旗| 东山县| 沈丘县| 乐亭县| 南江县| 富锦市| 磴口县| 宁津县| 呼伦贝尔市| 宁强县| 徐州市| 望谟县| 家居| 济阳县| 化隆| 厦门市| 兴仁县| 焉耆| 昌吉市| 伊川县| 西充县| 靖边县| 乌恰县| 石家庄市| 泰和县| 仁化县| 习水县| 绥阳县| 临沧市| 从江县| 余庆县| 大竹县| 阳信县|