簡體   English   中英

嵌套類中的spring Bean Overriding 2.1.x @Configuration創建@Bean創建失敗,並且'已經定義了具有該名稱的bean'

[英]spring Bean Overriding 2.1.x in nested class @Configuration @Bean creation fails with 'A bean with that name has already been defined'

升級到spring-boot 2.1.0.M4默認情況下已禁用Bean覆蓋。 如果依賴於覆蓋,則需要將spring.main.allow-bean-definition-overriding設置為true。

但是為什么在內部類中定義的Bean也被視為重復的bean定義。 這是一個錯誤嗎? 或者有這個解釋?

例如:

@Configuration
public class BusinessLogicConfig {

    @Configuration
    class BusinessLogicSourceConfig {
        @Bean
        public BusinessLogic businessLogic() {
            return new BusinessLogic("source");
        }
    }
}

適用於spring-boot 2.0.x

但是當使用例如spring-boot 2.1.0.M4時,它在啟動時給出了一個錯誤:

The bean 'businessLogic', defined in class path resource [com/example/di/bootconfigs/BusinessLogicConfig$BusinessLogicTier1Config.class], could not be registered.
A bean with that name has already been defined in URL [jar:file:/.../di/build/libs/di-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/com/example/di/businesslogic/BusinessLogic.class]
and overriding is disabled.

Action:

Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

因為我顯然只有bean的單一定義(僅在內部@Configuration類中定義),這對我來說似乎是個錯誤。

如果你問為什么我使用嵌套的內部@Configuration類:

我經常有演示代碼,演示分布式系統行為,其中我需要多個應用程序來演示事物。 因為我不想擁有多個應用程序代碼,所以我只是使用不同的配置文件啟動相同的應用程序,並且配置文件注入了“不同的業務邏輯”,我想在一個文件中“保持在一起”,例如:

@Configuration
public class BusinessLogicConfig {

    @Value("${app.info.instance_index}")
    private String instanceIndex;

    @Profile({ "source" }) // unused fake BusinessLogic for pure sources
    @Configuration
    class BusinessLogicSourceConfig {
        @Bean
        public BusinessLogic businessLogic() {
            return new BusinessLogic("source", instanceIndex);
        }
    }

    @Profile({ "sink" }) // unused fake BusinessLogic for pure sinks
    @Configuration
    class BusinessLogicSinkConfig {
        @Bean
        public BusinessLogic businessLogic() {
            return new BusinessLogic("sink", instanceIndex);
        }
    }

    @Profile({ "tier1" })
    @Configuration
    class BusinessLogicTier1Config {
        @Bean
        public BusinessLogic businessLogic() {
            return new BusinessLogic("tier1", instanceIndex);
        }
    }

    @Profile({ "tier2" })
    @Configuration
    class BusinessLogicTier2Config {
        @Bean
        public BusinessLogic businessLogic() {
            return new BusinessLogic("tier2", instanceIndex);
        }
    }

    @Profile({ "tier3" })
    @Configuration
    class BusinessLogicTier3Config {
        @Bean
        public BusinessLogic businessLogic() {
            return new BusinessLogic("tier3", instanceIndex);
        }
    }

}

原來它不是@Configuration類嵌套。 它是BusinessLogic類本身,它是名為BusinessLogic的Bean,因為它是@Component。 所以上面創建了一個名為BusinessLogic的Bean的第二個版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM