作成が失敗すると、ネストされたクラス@Configuration @Bean春豆のオーバーライドの2.1.xの「その名前を持つBeanはすでに定義されています」

ディルク・ホフマン:

春ブート2.1.0.M4ビーンへのアップグレードオーバーライドは、デフォルトでは無効になっています。あなたがオーバーライドに依存している場合は、trueに豆精細-spring.main.allow上書き設定する必要があります。

しかし、なぜ豆も重複Bean定義のように扱わ内部クラスで定義されています。これはバグですか?またはこれは、いくつかの説明を持っていますか?

例えば:

@Configuration
public class BusinessLogicConfig {

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

春ブート2.0.xのに罰金作品

例えば、スプリング・ブート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

私ははっきりのみ(内部のみ@Configurationクラスで定義された)、Beanの単一の定義を持っているように、これは私にはバグのように思えます。

私は、ネストされたインナー使っている理由を尋ねる場合は@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クラスのネストが判明しました。それは@Componentあるとして名ビジネスロジックでBeanであることを、ビジネスロジッククラス自体です。その上でビジネスロジックという名前のビーンの第二のバージョンを作成します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=221034&siteId=1