ホームページ  >  記事  >  Java  >  SpringBoot は Bean をロードするときにどのようにして最初に私を選択しますか?

SpringBoot は Bean をロードするときにどのようにして最初に私を選択しますか?

王林
王林転載
2023-05-15 21:13:041261ブラウズ

    1. 該当するシナリオ

    • アプリケーションのすべての階層で特定の Bean の起動シーケンスを管理する必要がある場合。たとえば、アプリケーションの起動時に Bean を初期化する必要があります。

    • パブリック ライブラリ内の Bean が他の開発者サービスで使用されているが、シナリオによっては Bean をカスタマイズする必要がある場合は、これらのカスタマイズされた Bean の前に Bean をロードする必要があります。公共図書館。

    #2 つと 3 つの実装方法

    Spring Boot アプリケーションでは、次の 3 つの方法を採用して、独自の Bean の優先読み込みを実現できます。

    1. @Configuration アノテーション @DependsOn アノテーション

    @Configuration アノテーションは Spring Boot アプリケーションで Bean を宣言し、Bean の優先順位を指定できるようにします。次に、@DependsOn アノテーションを使用して、アプリケーションのどの段階でこれらの Bean をロードする必要があるかを Spring コンテナに明示的に指示できます。

    使用方法は次のとおりです。

    (1) @Configuration アノテーションを宣言し、@DependsOn アノテーションを使用して、参照される Bean がすでに存在することを確認します (他の Bean または構成クラス)。

    @Configuration 
    @DependsOn("myOrderBean") 
    public class MyOrderedBeanConfig {
       // 配置类内普通Bean
       @Bean
       public MyBean myBean() {
          return new MyBean();
       }
    }

    (2) @Configuration アノテーションを Spring Boot アプリケーションに導入して、アプリケーションの起動時に実行できるようにします。

    @SpringBootApplication
    @Import(MyOrderedBeanConfig.class)
    public class DemoApplication {
       public static void main(String[] args) {
          SpringApplication.run(DemoApplication.class, args);
       }
    }

    2. @Component アノテーション @DependsOn アノテーション

    @Component アノテーションは Bean を宣言する最も速い方法の 1 つであり、Bean の名前を指定できます。 。アプリケーションの起動時に既存の Bean を最初にロードしたい場合は、@DependsOn アノテーションを使用してこれを実現できます。複数の Bean を指定する場合は、カンマを使用してそれらを区切ることができます。

    使用方法は以下のとおりです。

    (1)

    @Componentアノテーションが付けられたクラス内で、@DependsOnアノテーションを使用して明示的に指定します。 Bean オーダーのロード。

    @Component("myBean") 
    @DependsOn({"bean1", "bean2"}) 
    public class MyBean {
       // ...
    }

    (2)

    @Component アノテーションを Spring Boot アプリケーションに導入し、アプリケーションの起動時に実行します。

    @SpringBootApplication 
    @ComponentScan(basePackages = "com.example.demo") 
    public class DemoApplication {
       public static void main(String[] args) {
          SpringApplication.run(DemoApplication.class, args);
       }
    }

    3. PriorityOrdered インターフェイスの実装

    PriorityOrdered インターフェイスを実装し、読み込み順序を制御できるように getOrder() メソッドを実装します。豆の。最後に、BeanPostProcessor インターフェイスを使用して、これらの Bean が初めて生成されたときに確実にロードされるようにすることができます。

    使用方法は次のとおりです。

    (1)

    PriorityOrdered インターフェイスを実装し、getOrder() メソッドを使用して正の値を返します。 Bean クラスの優先順位を指定する整数。値が小さいほど優先度が高くなります。

    public class MyBean implements InitializingBean, PriorityOrdered {
       public void afterPropertiesSet() {
           // ...
       }
       public int getOrder() {
          return 0; // 这个值将确保此 bean 被最先加载
       }
    }

    (2) BeanPostProcessor インスタンスを提供し、@Order アノテーションで順序を指定します。このインスタンスは、Spring コンテナのライフサイクル内のすべての通常の Bean よりも前に実行されます。

    @Component 
    @Order(value = 1) 
    public class MyBeanPostProcessor implements BeanPostProcessor {
       // ...
    }

    (3) @ComponentScan アノテーションを Spring Boot アプリケーションに導入して、アプリケーションの起動時に実行できるようにします。

    @SpringBootApplication 
    @ComponentScan(basePackages = {"com.example.demo"}) 
    public class DemoApplication {
       public static void main(String[] args) {
          SpringApplication.run(DemoApplication.class, args);
       }
    }

    Notes

    • アプリケーションで上記のメソッドのいずれかを使用すると、Bean の優先順位を管理できますが、これはそうではありません。優先順位は他の Bean によって上書きされません。

    • 以前に宣言した Bean を上書きする場合は、対応するテクノロジー スタックの優先度の高い Bean を使用して、以前に宣言した Bean を上書きできます。

    • すべての Bean で @Order アノテーションを使用することも、Ordered インターフェースを実装して Bean のソートを実装することもできます。

    • 複数のテクノロジー スタックを使用する場合、目的を達成するためにこれらのテクノロジー スタックを混合できます。

    以上がSpringBoot は Bean をロードするときにどのようにして最初に私を選択しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。