bugfix> java > 投稿

スプリングブート2.0.2構成があります

@Configuration
public class ApiConfig {
    @Bean
    @Profile("!tests")
    @ConditionalOnProperty(name = "enabled", havingValue = "true")
    public MyService service() {
        return new MyServiceImpl();
    }
}

...およびMyService Beanが初期化されている場合にのみ作成してアプリケーションコンテキストに追加する必要のあるコントローラ。

@RestController
@ConditionalOnBean(MyService.class)
public class MyController {
   @Autowired
   private MyService service;
}

うまくいきます。ただし、ときどきスプリングブートでMyControllerの作成がスキップされることがあります。ログによると、MyServiceは作成されますが、最後に他のBean(すべてのコントローラーを含む)の後に作成されます。

ブートが @Configuration を処理しない理由 @RestController より前のBean ? ありがとう。

回答 1 件
  • Why boot does not process @Configuration beans prior to @Controller? Thanks.

    Springはそれを保証していないからです。
    @ConditionalOnBean と同様に  この仕様のこの種の問題について警告します:

    The condition can only match the bean definitions that have been processed by the application context so far and, as such,it is strongly recommended to use this condition on auto-configuration classes only.If a candidate bean may be created by another auto-configuration, make sure that the one using this condition runs after.

    また、自動構成クラスでは注釈を使用しません。あなたは確かに @RestController で注釈されたクラスでそれを指定しました 。

    要件を達成するには、 @RestController を移動する必要があると思います   @Configuration でのBean宣言  クラスまたは @DependsOn を使用   @ConditionalOnBean と一緒に  Beanのインスタンス化の順序を設定するには、コントローラーの前のサービスを使用します。

    @DependsOn  確かに指定されます:

    Beans on which the current bean depends. Any beans specified are guaranteed to be created by the container before this bean.

    テストされていませんが、2番目のソリューションでそのようなものを試すことができます。

    @RestController
    @ConditionalOnBean(MyService.class)
    @DependsOn("service")
    public class MyController {
       @Autowired
       private MyService service;
    }
    
    

あなたの答え