Java では、@Import
アノテーションは、他の構成クラスまたは Bean を導入するために使用されるアノテーションです。これは、特定の構成クラスまたは Bean を Spring コンテナーに登録し、アプリケーションで使用できるようにするのに役立ちます。
@Importの詳しい説明
@Import
アノテーションは、@Configuration アノテーションが付けられたクラス、または通常のクラスで使用できます。@ImportResource
これは、 、@ImportSelector
、 などの他のアノテーションにタグを付けることができるメタ アノテーションとして機能します@ImportBeanDefinitionRegistrar
。
アノテーションを使用すると@Import
、次のものを Spring コンテナにインポートできます。
- 構成クラス(Configuration Class): 他の構成クラスをインポートすることで、内部で定義されたBeanをコンテナに登録できます。
- 通常のクラス (非構成クラス): 通常のクラスを 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 登録、依存関係注入のメカニズムが含まれます。
-
@Configuration
コンポーネントのスキャン: Spring フレームワークは、コンポーネント スキャン メカニズムを通じて、アノテーションまたはその他の指定されたアノテーションを持つ構成クラスを自動的にスキャンしてロードし、それらを構成クラスとして認識します。 -
構成クラスの登録: 構成クラスが認識されると、Spring はそれを Bean としてインスタンス化し、コンテナーに登録します。このようにして、構成クラス内で定義されたすべての Bean を Spring コンテナーで管理できます。
-
アノテーションの処理: アノテーションが
@Import
構成クラスで使用される@Import
場合、Spring はアノテーションのパラメーターを解析し、さまざまなタイプのパラメーターに従って対応する処理を実行します。-
@Import
他の構成クラスをインポートする:パラメーターが別の構成クラス (アノテーション付きクラスなど)の場合@Configuration
、Spring はインポートされた構成クラスもコンテナーに追加します。これにより、インポートされた構成クラス内で定義された Bean も管理できるようになります。 -
通常クラスのインポート:
@Import
パラメータが通常クラスの場合、Spring はクラスを Bean としてインスタンス化し、コンテナに登録します。 -
実装された
ImportSelector
クラスをインポートする:@Import
パラメータがImportSelector
インターフェイスを実装するクラスの場合、Spring はImportSelector
インターフェイスのメソッドを呼び出しselectImports()
、返されたクラス名の配列に従って対応するクラスを Bean として登録します。このようにして、インポートする必要があるクラスを特定のロジックに従って動的に選択できます。 -
実装された
ImportBeanDefinitionRegistrar
クラスをインポートする:パラメーターがインターフェイス@Import
を実装するクラスの場合、Spring はインターフェイスのメソッドを呼び出し、プログラムによって Bean 定義をコンテナーに登録します。このようにして、カスタム ロジックを通じて追加の Bean を登録できます。ImportBeanDefinitionRegistrar
ImportBeanDefinitionRegistrar
registerBeanDefinitions()
-
上記の手順により、アノテーションを使用して、他の構成クラス、共通クラス、またはインターフェース@Import
を実装するクラスを簡単にインポートし、Spring コンテナに登録して、Bean 管理と依存関係の注入を実現できます。ImportSelector
ImportBeanDefinitionRegistrar
インポートする必要があるクラス
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();
}
}