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

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

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

啟動時因為swagger的依賴中注解重復啟用報錯

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

其中關鍵的提示注解類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 注解導致了循環(huán)導入:

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

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
{
    /**
     * 默認的排除路徑,排除Spring Boot默認的錯誤處理路徑和端點
     */
    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;
    }

    /**
     * 默認的全局鑒權策略
     *
     * @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啟動時讀取SwaggerAutoConfiguration
  • 2.@EnableCustomSwagger2

這個類是手動開啟讀取加載SwaggerAutoConfiguration配置類

@Import注解是引入java類:

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

@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);
    }
}

最后啟動成功

總結

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

相關文章

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

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

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

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

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

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

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

    Java SpringBoot的相關知識點詳解

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

    java return用法實例詳解

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

    Apache Ignite 與 Spring Boot 集成詳細指南

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

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

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

    java 利用反射機制,獲取實體所有屬性和方法,并對屬性賦值

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

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

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

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

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

最新評論

上杭县| 株洲市| 乐昌市| 莱州市| 安康市| 左云县| 蒙阴县| 永靖县| 建平县| 荣成市| 九龙县| 惠来县| 崇仁县| 连江县| 芷江| 清水县| 当雄县| 冕宁县| 新安县| 德清县| 津南区| 开阳县| 大冶市| 辽中县| 都江堰市| 武鸣县| 七台河市| 大荔县| 新邵县| 乌鲁木齐县| 荔波县| 沭阳县| 内黄县| 松潘县| 甘泉县| 安泽县| 汝城县| 旬邑县| 武夷山市| 资阳市| 中宁县|