@Import の詳細な説明と @Import でオブジェクトを挿入する 4 つの方法

Java では、@Importアノテーションは、他の構成クラスまたは Bean を導入するために使用されるアノテーションです。これは、特定の構成クラスまたは Bean を Spring コンテナーに登録し、アプリケーションで使用できるようにするのに役立ちます。

@Importの詳しい説明

  @Importアノテーションは、@Configuration アノテーションが付けられたクラス、または通常のクラスで使用できます。@ImportResourceこれは、 、@ImportSelector、 などの他のアノテーションにタグを付けることができるメタ アノテーションとして機能します@ImportBeanDefinitionRegistrar

アノテーションを使用すると@Import、次のものを Spring コンテナにインポートできます。

  1. 構成クラス(Configuration Class): 他の構成クラスをインポートすることで、内部で定義されたBeanをコンテナに登録できます。
  2. 通常のクラス (非構成クラス): 通常のクラスを Bean として Spring コンテナにインポートします。

@ソースコードをインポートする


@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {

   /**
    * {@link Configuration @Configuration}, {@link ImportSelector},
    * {@link ImportBeanDefinitionRegistrar}, or regular component classes to import.
    */
   Class<?>[] value();

}
 

アノテーションの観点から見ると、@Import アノテーションはクラス上でのみマークでき、@Configuration アノテーション、ImportSelector、ImportBeanDefinitionRegistrar、またはインポート通常クラスと組み合わせて使用​​できます。

したがって、@Import を使用するには、クラスを直接インポートする方法、Bean をインポートするための構成クラスをインポートする方法、ImportSelector の実装クラスをインポートする方法、ImportBeanDefinitionRegister の実装クラスをインポートする方法の 4 つの方法があります。ImportSelector と ImportBeanDefinitionRegistrar の両方のインターフェースは、一緒に使用するには @Import に依存する必要がありますが、@Import は単独で使用できることに注意してください。

@Importの実装原理

@Importアノテーションの実装原理には、Spring フレームワークのコンポーネント スキャン、Bean 登録、依存関係注入のメカニズムが含まれます。

  1. @Configurationコンポーネントのスキャン: Spring フレームワークは、コンポーネント スキャン メカニズムを通じて、アノテーションまたはその他の指定されたアノテーションを持つ構成クラスを自動的にスキャンしてロードし、それらを構成クラスとして認識します。

  2. 構成クラスの登録: 構成クラスが認識されると、Spring はそれを Bean としてインスタンス化し、コンテナーに登録します。このようにして、構成クラス内で定義されたすべての Bean を Spring コンテナーで管理できます。

  3. アノテーションの処理: アノテーションが@Import構成クラスで使用される@Import場合、Spring はアノテーションのパラメーターを解析し、さまざまなタイプのパラメーターに従って対応する処理を実行します。

    • @Import他の構成クラスをインポートする:パラメーターが別の構成クラス (アノテーション付きクラスなど)の場合@Configuration、Spring はインポートされた構成クラスもコンテナーに追加します。これにより、インポートされた構成クラス内で定義された Bean も管理できるようになります。

    • 通常クラスのインポート:@Importパラメータが通常クラスの場合、Spring はクラスを Bean としてインスタンス化し、コンテナに登録します。

    • 実装されたImportSelectorクラスをインポートする:@ImportパラメータがImportSelectorインターフェイスを実装するクラスの場合、Spring はImportSelectorインターフェイスのメソッドを呼び出しselectImports()、返されたクラス名の配列に従って対応するクラスを Bean として登録します。このようにして、インポートする必要があるクラスを特定のロジックに従って動的に選択できます。

    • 実装されたImportBeanDefinitionRegistrarクラスをインポートする:パラメーターがインターフェイス@Importを実装するクラスの場合、Spring はインターフェイスのメソッドを呼び出し、プログラムによって Bean 定義をコンテナーに登録します。このようにして、カスタム ロジックを通じて追加の Bean を登録できます。ImportBeanDefinitionRegistrarImportBeanDefinitionRegistrarregisterBeanDefinitions()

        上記の手順により、アノテーションを使用して、他の構成クラス、共通クラス、またはインターフェース@Importを実装するクラスを簡単にインポートし、Spring コンテナに登録して、Bean 管理と依存関係の注入を実現できます。ImportSelectorImportBeanDefinitionRegistrar

インポートする必要があるクラス


public class HelloImport {
  
    public void test() {
       System.out.println("hello JF");
    }
}

1. クラスを直接インポートする

@Import(HelloImport.class)
public class SpringTestApplication {

    public static void main(String[] args) {
        //1.通过AnnotationConfigApplicationContext创建spring容器,参数为@Import标注的类
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringTestApplication.class);
        HelloImport helloImport = applicationContext.getBean(HelloImport.class);
        elloImport.test();
    }
}

次のメソッドがプロジェクトでよく使用されます。


@Import(HelloImport.class)
@Configuration
public class ConfigTest { 
}

2. 設定クラスをインポートしてBeanを注入する

@Configuration
public class HelloImportConfiguration {

    @Bean
    public HelloImport helloImport() {
        return new HelloImport();
    }
}

@Import(HelloImportConfiguration.class)
public class SpringTestApplication {

    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringTestApplication.class);
        HelloImport helloImport = applicationContext.getBean(HelloImport.class);
        helloImport.test();
    }
}

このメソッドの使用シナリオは、構成クラスを直接スキャンできないことです。

3.インポートImportSelector実装クラス

ImportSelector はインターフェイスであり、このインターフェイスを実装するには selectImports メソッドを書き直す必要があります。selectImports メソッドは、コンテナーにインポートする必要があるクラスの完全修飾名を要素とする String 配列を返します。


public class HelloImportSelector implements ImportSelector {
    /**
     * 返回需要导入的类名的数组,可以是任何普通类,配置类(@Configuration、@Bean、@CompontentScan等标注的类)
     * @importingClassMetadata:用来获取被@Import标注的类上面所有的注解信息
     */
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        List list = new ArrayList<>();
        list.add("intl.skw.test.HelloImport");
        return StringUtils.toStringArray(list);
    }
}

@Import(HelloImportSelector.class)
public class SpringTestApplication {

    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringTestApplication.class);
        HelloImport helloImport = applicationContext.getBean(HelloImport.class);
        helloImport.test();
    }
}

4. ImportBeanDefinitionRegistrar実装クラスをインポートする

クラスが ImportBeanDefinitionRegistrar インターフェースを実装すると、レジストリを取得し、コンテナに Bean を登録し、Bean にプロパティを追加できます。

public class HelloImportDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(HelloImport.class)
                .getBeanDefinition();
        registry.registerBeanDefinition("HelloImport", beanDefinition);
    }
}

@Import(HelloImportDefinitionRegistrar.class)
public class SpringTestApplication {

    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringTestApplication.class);
        HelloImport helloImport = applicationContext.getBean(HelloImport.class);
        helloImport.test();
    }
}

おすすめ

転載: blog.csdn.net/Ascend1977/article/details/131391041