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

Java啟動時(shí)循環(huán)依賴處理方式

 更新時(shí)間:2026年01月04日 09:59:17   作者:TTc_  
解決Spring Boot啟動時(shí)由于SwaggerAutoConfiguration注解重復(fù)啟用導(dǎo)致的循環(huán)導(dǎo)入問題,通過排除SwaggerAutoConfiguration并手動開啟Swagger配置

啟動時(shí)因?yàn)閟wagger的依賴中注解重復(fù)啟用報(bào)錯(cuò)

2025-11-01 10:03:21.059  INFO 30696 --- [           main] c.t.h.m.i.MedicalInsuranceApplication    : Starting MedicalInsuranceApplication using Java 1.8.0_131 on DESKTOP-TI09UU1 with PID 30696 (F:\tbyf\his9\tbyf-cloud-medical-insurance\target\classes started by t in F:\tbyf\his9\tbyf-cloud)
2025-11-01 10:03:21.063 DEBUG 30696 --- [           main] c.t.h.m.i.MedicalInsuranceApplication    : Running with Spring Boot v2.7.12, Spring v5.3.27
2025-11-01 10:03:21.063  INFO 30696 --- [           main] c.t.h.m.i.MedicalInsuranceApplication    : No active profile set, falling back to 1 default profile: "default"
2025-11-01 10:03:21.137  WARN 30696 --- [           main] c.a.c.n.c.NacosConfigDataLoader          : [Nacos Config] config[dataId=tbyf-cloud-medical-insurance.yml, group=DEFAULT_GROUP] is empty
2025-11-01 10:03:22.215  WARN 30696 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: A circular @Import has been detected: Illegal attempt by @Configuration class 'SwaggerAutoConfiguration' to import class 'SwaggerAutoConfiguration' as 'SwaggerAutoConfiguration' is already present in the current import stack [SwaggerAutoConfiguration->SwaggerAutoConfiguration->MedicalInsuranceApplication]
Offending resource: class path resource [com/tbyf/common/swagger/config/SwaggerAutoConfiguration.class]
2025-11-01 10:03:22.276 ERROR 30696 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: A circular @Import has been detected: Illegal attempt by @Configuration class 'SwaggerAutoConfiguration' to import class 'SwaggerAutoConfiguration' as 'SwaggerAutoConfiguration' is already present in the current import stack [SwaggerAutoConfiguration->SwaggerAutoConfiguration->MedicalInsuranceApplication]
Offending resource: class path resource [com/tbyf/common/swagger/config/SwaggerAutoConfiguration.class]
    at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:72) ~[spring-beans-5.3.27.jar:5.3.27]
    at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:561) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:310) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:249) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:599) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.annotation.ConfigurationClassParser.access$800(ConfigurationClassParser.java:110) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGroupingHandler.lambda$processGroupImports$1(ConfigurationClassParser.java:812) ~[spring-context-5.3.27.jar:5.3.27]
    at java.util.ArrayList.forEach(ArrayList.java:1249) ~[na:1.8.0_131]
    at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGroupingHandler.processGroupImports(ConfigurationClassParser.java:809) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorHandler.handle(ConfigurationClassParser.java:765) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:577) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:310) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:249) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:599) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.annotation.ConfigurationClassParser.access$800(ConfigurationClassParser.java:110) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGroupingHandler.lambda$processGroupImports$1(ConfigurationClassParser.java:812) ~[spring-context-5.3.27.jar:5.3.27]
    at java.util.ArrayList.forEach(ArrayList.java:1249) ~[na:1.8.0_131]
    at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGroupingHandler.processGroupImports(ConfigurationClassParser.java:809) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorHandler.process(ConfigurationClassParser.java:780) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:192) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:748) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) ~[spring-context-5.3.27.jar:5.3.27]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.12.jar:2.7.12]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) [spring-boot-2.7.12.jar:2.7.12]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) [spring-boot-2.7.12.jar:2.7.12]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-2.7.12.jar:2.7.12]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) [spring-boot-2.7.12.jar:2.7.12]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) [spring-boot-2.7.12.jar:2.7.12]
    at com.tbyf.his.medical.insurance.MedicalInsuranceApplication.main(MedicalInsuranceApplication.java:15) [classes/:na]

2025-11-01 10:03:22.285  WARN 30696 --- [      Thread-12] c.a.nacos.common.notify.NotifyCenter     : [NotifyCenter] Start destroying Publisher
2025-11-01 10:03:22.285  WARN 30696 --- [       Thread-6] c.a.n.common.http.HttpClientBeanHolder   : [HttpClientBeanHolder] Start destroying common HttpClient
2025-11-01 10:03:22.287  WARN 30696 --- [      Thread-12] c.a.nacos.common.notify.NotifyCenter     : [NotifyCenter] Destruction of the end
2025-11-01 10:03:22.287  WARN 30696 --- [       Thread-6] c.a.n.common.http.HttpClientBeanHolder   : [HttpClientBeanHolder] Destruction of the end
Disconnected from the target VM, address: '127.0.0.1:59248', transport: 'socket'

Process finished with exit code 1

其中關(guān)鍵的提示注解類SwaggerAutoConfiguration:

Exception encountered during context initialization 
- cancelling refresh attempt: org.springframework.beans.factory.parsing.BeanDefinitionParsingException:
Configuration problem: A circular @Import has been detected: 
Illegal attempt by @Configuration class 'SwaggerAutoConfiguration' 
to import class 'SwaggerAutoConfiguration' as 'SwaggerAutoConfiguration' 
is already present in the current import stack 
[SwaggerAutoConfiguration->SwaggerAutoConfiguration->MedicalInsuranceApplication]?

SwaggerAutoConfiguration 類上的 @EnableAutoConfiguration 注解導(dǎo)致了循環(huán)導(dǎo)入:

  • Spring Boot 2.7+ 通過 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 自動加載該類
  • 該類上的 @EnableAutoConfiguration 會再次觸發(fā)所有自動配置加載
  • 這導(dǎo)致它被重復(fù)加載,形成循環(huán)導(dǎo)入

Java SwaggerAutoConfiguration 類:

package com.tbyf.common.swagger.config;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.Contact;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.service.SecurityScheme;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.ApiSelectorBuilder;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
@EnableAutoConfiguration
@ConditionalOnProperty(name = "swagger.enabled", matchIfMissing = true)
public class SwaggerAutoConfiguration
{
    /**
     * 默認(rèn)的排除路徑,排除Spring Boot默認(rèn)的錯(cuò)誤處理路徑和端點(diǎn)
     */
    private static final List<String> DEFAULT_EXCLUDE_PATH = Arrays.asList("/error", "/actuator/**");

    private static final String BASE_PATH = "/**";

    @Bean
    @ConditionalOnMissingBean
    public SwaggerProperties swaggerProperties()
    {
        return new SwaggerProperties();
    }

    @Bean
    public Docket api(SwaggerProperties swaggerProperties)
    {
        // base-path處理
        if (swaggerProperties.getBasePath().isEmpty())
        {
            swaggerProperties.getBasePath().add(BASE_PATH);
        }
        // noinspection unchecked
        List<Predicate<String>> basePath = new ArrayList<Predicate<String>>();
        swaggerProperties.getBasePath().forEach(path -> basePath.add(PathSelectors.ant(path)));

        // exclude-path處理
        if (swaggerProperties.getExcludePath().isEmpty())
        {
            swaggerProperties.getExcludePath().addAll(DEFAULT_EXCLUDE_PATH);
        }

        List<Predicate<String>> excludePath = new ArrayList<>();
        swaggerProperties.getExcludePath().forEach(path -> excludePath.add(PathSelectors.ant(path)));

        ApiSelectorBuilder builder = new Docket(DocumentationType.SWAGGER_2).host(swaggerProperties.getHost())
                .apiInfo(apiInfo(swaggerProperties)).select()
                .apis(RequestHandlerSelectors.basePackage(swaggerProperties.getBasePackage()));

        swaggerProperties.getBasePath().forEach(p -> builder.paths(PathSelectors.ant(p)));
        swaggerProperties.getExcludePath().forEach(p -> builder.paths(PathSelectors.ant(p).negate()));

        return builder.build().securitySchemes(securitySchemes()).securityContexts(securityContexts()).pathMapping("/");
    }

    /**
     * 安全模式,這里指定token通過Authorization頭請求頭傳遞
     */
    private List<SecurityScheme> securitySchemes()
    {
        List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
        apiKeyList.add(new ApiKey("Authorization", "Authorization", "header"));
        return apiKeyList;
    }

    /**
     * 安全上下文
     */
    private List<SecurityContext> securityContexts()
    {
        List<SecurityContext> securityContexts = new ArrayList<>();
        securityContexts.add(
                SecurityContext.builder()
                        .securityReferences(defaultAuth())
                        .operationSelector(o -> o.requestMappingPattern().matches("/.*"))
                        .build());
        return securityContexts;
    }

    /**
     * 默認(rèn)的全局鑒權(quán)策略
     *
     * @return
     */
    private List<SecurityReference> defaultAuth()
    {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = authorizationScope;
        List<SecurityReference> securityReferences = new ArrayList<>();
        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
        return securityReferences;
    }

    private ApiInfo apiInfo(SwaggerProperties swaggerProperties)
    {
         return new ApiInfoBuilder()
             .title(swaggerProperties.getTitle())
             .description(swaggerProperties.getDescription())
             .license(swaggerProperties.getLicense())
             .licenseUrl(swaggerProperties.getLicenseUrl())
             .termsOfServiceUrl(swaggerProperties.getTermsOfServiceUrl())
             .contact(new Contact(swaggerProperties.getContact().getName(), swaggerProperties.getContact().getUrl(), swaggerProperties.getContact().getEmail()))
             .version(swaggerProperties.getVersion())
             .build();
    }
}

解決辦法

@SpringBootApplication(exclude = {SwaggerAutoConfiguration.class})
@EnableCustomSwagger2

在啟動類添加這兩行修改

  • 1.exclude = {SwaggerAutoConfiguration.class} 是去除springboot啟動時(shí)讀取SwaggerAutoConfiguration
  • 2.@EnableCustomSwagger2

這個(gè)類是手動開啟讀取加載SwaggerAutoConfiguration配置類

@Import注解是引入java類:

導(dǎo)入@Configuration注解的配置類(4.2版本之前只可以導(dǎo)入配置類,4.2版本之后也可以導(dǎo)入普通類)

@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({ SwaggerAutoConfiguration.class })
public @interface EnableCustomSwagger2
{

}

修改前:

@Configuration
@SpringBootApplication
@EnableRyFeignClients
@EnableDynamicDataSource
public class MedicalInsuranceApplication {
    public static void main(String[] args) {
        SpringApplication.run(MedicalInsuranceApplication.class, args);
    }
}

修改后:

@Configuration
@SpringBootApplication(exclude = {SwaggerAutoConfiguration.class})
@EnableCustomSwagger2
@EnableRyFeignClients
@EnableDynamicDataSource
public class MedicalInsuranceApplication {
    public static void main(String[] args) {
        SpringApplication.run(MedicalInsuranceApplication.class, args);
    }
}

最后啟動成功

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot YAML 配置讀取機(jī)制 + 數(shù)據(jù)庫自動初始化原理解析

    SpringBoot YAML 配置讀取機(jī)制 + 數(shù)據(jù)庫自動初始化原理解析

    本文介紹了SpringBoot中YAML配置的讀取流程,包括配置文件加載、配置綁定和容器管理,還詳細(xì)講解了數(shù)據(jù)庫自動初始化原理,感興趣的朋友跟隨小編一起看看吧
    2025-05-05
  • JAVA使用前綴樹(Tire樹)實(shí)現(xiàn)敏感詞過濾、詞典搜索

    JAVA使用前綴樹(Tire樹)實(shí)現(xiàn)敏感詞過濾、詞典搜索

    本文主要介紹了JAVA使用前綴樹(Tire樹)實(shí)現(xiàn)敏感詞過濾、詞典搜索,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • SpringBoot實(shí)現(xiàn)簡單的日志鏈路追蹤

    SpringBoot實(shí)現(xiàn)簡單的日志鏈路追蹤

    隨著分布式應(yīng)用的普及,現(xiàn)在的一些應(yīng)用系統(tǒng)不再像以前,所有的文件(前后端程序)都打包在一個(gè)包中,本文通過一個(gè)簡單的SpringBoot應(yīng)用來總結(jié),我們?nèi)绾螌⑷罩敬?lián)起來,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-10-10
  • Java SpringBoot的相關(guān)知識點(diǎn)詳解

    Java SpringBoot的相關(guān)知識點(diǎn)詳解

    這篇文章主要介紹了SpringBoot的相關(guān)知識點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-10-10
  • java return用法實(shí)例詳解

    java return用法實(shí)例詳解

    在本篇文章里小編給大家整理的是關(guān)于java return用法以及相關(guān)知識點(diǎn)總結(jié),需要的朋友們參考下。
    2019-08-08
  • Apache Ignite 與 Spring Boot 集成詳細(xì)指南

    Apache Ignite 與 Spring Boot 集成詳細(xì)指南

    Apache Ignite官方指南詳解如何通過Spring Boot Starter擴(kuò)展實(shí)現(xiàn)自動配置,支持厚/輕客戶端模式,簡化Ignite節(jié)點(diǎn)和客戶端的部署與管理,提升開發(fā)效率和可維護(hù)性,接下來通過本文介紹Apache Ignite與Spring Boot 集成詳細(xì)指南,感興趣的朋友一起看看吧
    2025-07-07
  • SpringBoot整合數(shù)據(jù)庫訪問層的實(shí)戰(zhàn)

    SpringBoot整合數(shù)據(jù)庫訪問層的實(shí)戰(zhàn)

    本文主要介紹了SpringBoot整合數(shù)據(jù)庫訪問層的實(shí)戰(zhàn),主要包含JdbcTemplate和mybatis框架的整合應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-03-03
  • java 利用反射機(jī)制,獲取實(shí)體所有屬性和方法,并對屬性賦值

    java 利用反射機(jī)制,獲取實(shí)體所有屬性和方法,并對屬性賦值

    這篇文章主要介紹了 java 利用反射機(jī)制,獲取實(shí)體所有屬性和方法,并對屬性賦值的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Java頻繁GC的完整排查流程與解決方法

    Java頻繁GC的完整排查流程與解決方法

    這篇文章主要介紹了Java中頻繁GC的常見問題及其解決步驟,涵蓋內(nèi)存泄漏、堆內(nèi)存不足、大對象創(chuàng)建等問題的排查與處理方法,通過實(shí)際操作指導(dǎo)幫助開發(fā)者精準(zhǔn)定位和解決性能問題,需要的朋友可以參考下
    2026-06-06
  • Spring-boot的debug調(diào)試代碼實(shí)例

    Spring-boot的debug調(diào)試代碼實(shí)例

    這篇文章主要介紹了Spring-boot的debug調(diào)試代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評論

平度市| 上杭县| 依兰县| 政和县| 蒲城县| 府谷县| 舞钢市| 遵化市| 洛扎县| 兴山县| 石屏县| 汪清县| 灵川县| 松桃| 鹤壁市| 南丹县| 麻阳| 灯塔市| 安溪县| 水城县| 习水县| 长岛县| 门源| 康平县| 扎兰屯市| 远安县| 九龙县| 十堰市| 长葛市| 社旗县| 安远县| 大名县| 通化县| 康乐县| 黔西| 德安县| 赣榆县| 邯郸县| 常山县| 三都| 滨海县|