spring Bean Overriding 2.1.x in geschachtelten Klasse @Configuration @Bean-Erstellung fehlschlägt mit „Eine bean mit diesem Namen wurde bereits definiert‘

Upgrade auf spring-boot-2.1.0.M4 Bean überschreiben wurde standardmäßig deaktiviert. Wenn Sie sich auf überschreiben, müssen Sie Frühjahr.main.allow-bean-definition-überschreiben zu wahren.

Aber warum ist ein Bean definiert in einer inneren Klasse auch behandelt wie eine doppelte bean-definition. Ist das ein bug? oder hat dies irgendeine Erklärung?

z.B.:

@Configuration
public class BusinessLogicConfig {

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

funktioniert gut bis zu spring-boot-2.0.x

aber z.B. bei der Verwendung mit spring-boot-2.1.0.M4 es gibt mir eine Fehlermeldung beim Start:

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

Als ich deutlich nur eine einzige definition der bean (nur definiert in einer inneren @Configuration-Klasse) das scheint ein bug zu mir.

Wenn Sie Fragen, warum ich mich mit der eine verschachtelte innere @Configuration Klasse:

Oft habe ich den demo-code, der Demonstration verteiltes system Verhalten, in dem ich mehr als eine app zu zeigen, die Dinge. Wie ich nicht wollen, um mehrere App-code, ich starte einfach die gleiche App mit unterschiedlichen Profilen und die profile ist die Injektion von „verschiedene business-Logik“ ich will „zusammen zu halten“ in einer Datei, wie:

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

}
  • haben Sie eine Antwort gefunden?
InformationsquelleAutor Dirk Hoffmann | 2018-10-11



One Reply
  1. 0

    Stellt sich heraus, das ist aber nicht die @Configuration-Klassen verschachteln.
    Es ist die Klasse BusinessLogic selbst, das ist ein Bean mit dem Namen BusinessLogic, wie es ist eine @Komponente. also oben erstellt eine zweite version von eine Bean mit dem Namen BusinessLogic.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.