Spring Fraamewarkコンポーネント登録の@Import
Spring Fraamewarkコンポーネント登録の@Import
前に書く
springにコンポーネントを登録するか、javaBeanと呼ぶかは、springの機能を使用する前提条件です.また、springは、前の記事Spring Framwardorkコンポーネント登録のような一般的なjavaBenをspring容器に登録することができます@Componentに書いた
@Import登録普通ビーン
context id:org.springframe ework.com ntenxt.annotation.AnnotationConfigApplicationContext@21b8d17cBeanName is:[compring.study.ioc.register.TestImport]TestImport bean:TestImport(id=@Import)
@Import導入プロファイル
context id:org.springframe ework.com ntenxt.annotation.AnnotationConfigApplicationContext@21b8d17cBeanName is:[testImport,testImport 2]TestImport bean:TestImport(id=@Import)
その結果、登録されたコンポーネント名は、構成クラスで指定されたコンポーネント名であり、構成クラスを介して、複数のコンポーネントを一度に導入することができる.
@ImportはImport Selectorで登録します.
context id:org.springframe ework.com ntenxt.annotation.AnnotationConfigApplicationContext@238e0d81TestSelectorbean:TestSelector(id=@Import:Import Selector)bean names:[comp.spring.study.ioc.register.TestSelector]
結果から分かるように、
@ImportはImportBeanDefinitionRegistrarで登録します.
context id:org.springframe ework.com ntenxt.annotation.AnnotationConfigApplicationContext@238e0d81TestRegistrarbean:TestRegistar(id=@Import:TestRegistar)bean names:[testRegistar]
これにより、
@Import複数のインターフェースを同時に指定して登録する
上記の例では、
context id:org.springframe ework.com ntenxt.annotation.AnnotationConfigApplicationContext@238e0d81beannames:org.springfraamewaork.com ntxt.annotatitin.internalConfigrationAnnotatititiononProtocssor、org.sprigfraameew ork.com.annotatitititititin.internalAutotttwitwitAnnotatitionProttionProtonProtonProtocococococsosososototototototototototototototototototototorsor、orse、orse、orse、ororse、orgggggggorororororororororororororgggggg. org.org.org.org.sprig. sperProcessor,org.spring frame eweet.com nt.event.internal EventListestImport Bootststration、compring.studiy.ioc.register.TestComponent、compring.studing.ioc.register.TestConfigration、testImport、testImport 2、compring.study.ioc.stregister.Segister.strecturer.strectorer.ster.stregister.strectorer.ster.strectorer.
締め括りをつける
spring容器には多くのコンポーネントを登録する方法があります.本明細書では、
勉強はいつまでも簡単なことではないです.迷いがあって、怠けてもいいです.
寄り添って歩こうとしないなら、千里にも満たない.
前に書く
springにコンポーネントを登録するか、javaBeanと呼ぶかは、springの機能を使用する前提条件です.また、springは、前の記事Spring Framwardorkコンポーネント登録のような一般的なjavaBenをspring容器に登録することができます@Componentに書いた
@Component
を利用して、本明細書で述べた@Import
注釈もspring Frame orkが提供している一般的なjava容器に登録します.また、後続の文章で話す@Configuration
、FactoryBean
などの方式があります.@Import登録普通ビーン
@Import
を使用して、普通のBeaビンを登録します.登録するBeaビンのクラスを@Import
の注釈で指定すればいいです./**
* Import , Bean
*/
@Data
public class TestImport {
private String id = "@Import";
}
スプリングスタートガイドクラスに@Import
の注釈を追加します./**
* spring
*/
@Import(TestImport.class)
public class TestImportBootstrap {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext =
new AnnotationConfigApplicationContext(TestImportBootstrap.class);
System.out.println("context id : " + applicationContext.getId());
String[] beanNames = applicationContext.getBeanNamesForType(TestImport.class);
System.out.println("Bean Name is : " + Arrays.toString(beanNames));
TestImport bean = applicationContext.getBean(TestImport.class);
System.out.println("TestImport bean : " + bean);
applicationContext.close();
}
}
スプリング容器が起動したら、コンソールが印刷した結果:context id:org.springframe ework.com ntenxt.annotation.AnnotationConfigApplicationContext@21b8d17cBeanName is:[compring.study.ioc.register.TestImport]TestImport bean:TestImport(id=@Import)
@Import
の注釈を簡単に使うことによって、普通のjavaBeanをspring容器に登録することができる.そして、@Import
によってデフォルトで登録されたコンポーネント名がjavaBeanの全クラス名であることがわかる.@Import導入プロファイル
@Import
で構成クラスを導入すると、構成クラスのすべてのコンポーネントがスプリング容器に登録されます.springでは、@Configuration
に表示されているクラスこそが構成クラスではないが、@Configuration
に表示されているクラスはプロキシオブジェクトを生成し、spring注入時と@Configuration
を使用しない注釈とは大きな違いがあり、ここでは単独で説明する./**
* spring
*/
//@Configuration @Import ,
public class TestConfiguration {
@Bean
public TestImport testImport() {
return new TestImport();
}
@Bean
public TestImport testImport2() {
return new TestImport();
}
}
@Import
注釈では導入すべき構成クラスを指定します./**
* spring
*/
@Import(TestConfiguration.class)
public class TestImportBootstrap {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext =
new AnnotationConfigApplicationContext(TestImportBootstrap.class);
System.out.println("context id : " + applicationContext.getId());
String[] beanNames = applicationContext.getBeanNamesForType(TestImport.class);
System.out.println("Bean Name is : " + Arrays.toString(beanNames));
TestImport bean = (TestImport) applicationContext.getBean("testImport");
System.out.println("TestImport bean : " + bean);
applicationContext.close();
}
}
spring容器が起動したら、配置類のコメントもspring容器に登録されます.context id:org.springframe ework.com ntenxt.annotation.AnnotationConfigApplicationContext@21b8d17cBeanName is:[testImport,testImport 2]TestImport bean:TestImport(id=@Import)
その結果、登録されたコンポーネント名は、構成クラスで指定されたコンポーネント名であり、構成クラスを介して、複数のコンポーネントを一度に導入することができる.
@ImportはImport Selectorで登録します.
ImportSelector
インターフェースでは一つのインターフェースselectImports
だけが定義されており、このインターフェースを通じて登録が必要なJavaBeanの全クラス名配列が返され、@Import
を使用して導入されると、インターフェースから返されるすべてのクラスがspring容器に登録される./**
* ImportSelector
*/
@Data
public class TestSelector {
private String id = "@Import:ImportSelector";
}
カスタム実装ImportSelector
インターフェース/**
* , bean , IOC
*/
public class CustomImportSelector implements ImportSelector {
/**
* @param importingClassMetadata @Import
*/
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{TestSelector.class.getName()};
}
}
@Import
注釈でImportSelector実装クラスを指定します./**
* spring
*/
@Import(CustomImportSelector.class)
public class TestImportBootstrap {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext =
new AnnotationConfigApplicationContext(TestImportBootstrap.class);
System.out.println("context id : " + applicationContext.getId());
TestSelector bean = applicationContext.getBean(TestSelector.class);
System.out.println("TestSelector bean : " + bean);
String[] beanNames = applicationContext.getBeanNamesForType(TestSelector.class);
System.out.println("bean names:" + Arrays.asList(beanNames));
applicationContext.close();
}
}
スプリング容器が起動したら、コンソールが印刷した結果:context id:org.springframe ework.com ntenxt.annotation.AnnotationConfigApplicationContext@238e0d81TestSelectorbean:TestSelector(id=@Import:Import Selector)bean names:[comp.spring.study.ioc.register.TestSelector]
結果から分かるように、
TestSelector
はスプリング容器に登録されている.前の直接登録と比較して、ImportSelector
インターフェースの突出した特性は見られなかった.本明細書では単なる説明であるImportSelector
インターフェースは、登録コンポーネントの機能を有しており、spring容器の起動時に、BeanDefinitionRegistryPostProcessor
をどのように実行してselectImports
方法を呼び出すかを示す.ImportSelector
インターフェースを使用して、より複雑な登録機能を実現するには、後続の文章で深く理解されるだろう.@ImportはImportBeanDefinitionRegistrarで登録します.
ImportBeanDefinitionRegistrar
インターフェースには一つのregisterBeanDefinitions
方法しか定義されていません.この方法では、BeanDefinitionRegistry
オブジェクトを取得し、このオブジェクトを利用して、必要なコンポーネントを手動で登録することができます.BeanDefinitionRegistry
オブジェクトを使用する場合には、コンポーネントがspring容器に登録されているbean名を指定することもできる./**
* ImportBeanDefinitionRegistrar
*/
@Data
public class TestRegistrar {
private String id = "@Import:TestRegistrar";
}
カスタム実装ImportBeanDefinitionRegistrar
インターフェース/**
* IOC
*/
public class CustomImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* @param importingClassMetadata @Import
* @param registry BeanDefinition , registry
*/
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
if (!registry.containsBeanDefinition("testRegistrar")) {
BeanDefinition definition = new RootBeanDefinition(TestRegistrar.class);
registry.registerBeanDefinition("testRegistrar", definition);
}
}
}
@Import
注釈において、ImportBeanDefinitionRegistar実現類を指定します./**
* spring
*/
@Import(CustomImportBeanDefinitionRegistrar.class)
public class TestImportBootstrap {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext =
new AnnotationConfigApplicationContext(TestImportBootstrap.class);
System.out.println("context id : " + applicationContext.getId());
TestRegistrar bean = applicationContext.getBean(TestRegistrar.class);
System.out.println("TestRegistrar bean : " + bean);
String[] beanNames = applicationContext.getBeanNamesForType(TestSelector.class);
System.out.println("bean names:" + Arrays.asList(beanNames));
applicationContext.close();
}
}
スプリング容器が起動したら、コンソールが印刷した結果:context id:org.springframe ework.com ntenxt.annotation.AnnotationConfigApplicationContext@238e0d81TestRegistrarbean:TestRegistar(id=@Import:TestRegistar)bean names:[testRegistar]
これにより、
TestRegistrar
がスプリング容器に登録されていることがわかる.ImportSelector
インターフェースと同様に、spring容器の起動時には、BeanDefinitionRegistryPostProcessor
を介してインターフェース方法が実行される.@Import複数のインターフェースを同時に指定して登録する
上記の例では、
@Import
を使用して、直接Bean class、構成クラス、ImportSelector
インターフェース、ImportBeanDefinitionRegistrar
インターフェースを導入することによって、spring容器にコンポーネントを登録することを説明した.もちろん@Import
の注釈を使用する場合、上記のいずれかの方法を同時に指定して登録することができます./**
* spring
*
* @author TangFD
* @since 2019/6/25.
*/
@Import({
TestComponent.class,
TestConfiguration.class,
CustomImportSelector.class,
CustomImportBeanDefinitionRegistrar.class
})
public class TestImportBootstrap {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext =
new AnnotationConfigApplicationContext(TestImportBootstrap.class);
System.out.println("context id : " + applicationContext.getId());
String[] beanNames = applicationContext.getBeanDefinitionNames();
System.out.println("bean names:" + Arrays.asList(beanNames));
applicationContext.close();
}
}
スプリング容器が起動したら、コンソールが印刷した結果:context id:org.springframe ework.com ntenxt.annotation.AnnotationConfigApplicationContext@238e0d81beannames:org.springfraamewaork.com ntxt.annotatitin.internalConfigrationAnnotatititiononProtocssor、org.sprigfraameew ork.com.annotatitititititin.internalAutotttwitwitAnnotatitionProttionProtonProtonProtocococococsosososototototototototototototototototototototorsor、orse、orse、orse、ororse、orgggggggorororororororororororororgggggg. org.org.org.org.sprig. sperProcessor,org.spring frame eweet.com nt.event.internal EventListestImport Bootststration、compring.studiy.ioc.register.TestComponent、compring.studing.ioc.register.TestConfigration、testImport、testImport 2、compring.study.ioc.stregister.Segister.strecturer.strectorer.ster.stregister.strectorer.ster.strectorer.
締め括りをつける
spring容器には多くのコンポーネントを登録する方法があります.本明細書では、
@Import
を使用してスプリング容器にコンポーネントを登録する方法を説明しています.spring容器が起動するときに、BeanDefinitionRegistryPostProcessor
を実行することによって、どのようにコンポーネント登録を行うかについての理解が必要な知識点が残されています.ここでは、後続のspring容器が登録されます.コンテナ起動中、分析ImportSelector
インターフェース実行中に追加します.勉強はいつまでも簡単なことではないです.迷いがあって、怠けてもいいです.
寄り添って歩こうとしないなら、千里にも満たない.