Spring Fraamewarkコンポーネント登録の@Import


Spring Fraamewarkコンポーネント登録の@Import
前に書く
springにコンポーネントを登録するか、javaBeanと呼ぶかは、springの機能を使用する前提条件です.また、springは、前の記事Spring Framwardorkコンポーネント登録のような一般的なjavaBenをspring容器に登録することができます@Componentに書いた@Componentを利用して、本明細書で述べた@Import注釈もspring Frame orkが提供している一般的なjava容器に登録します.また、後続の文章で話す@ConfigurationFactoryBeanなどの方式があります.
@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インターフェース実行中に追加します.
勉強はいつまでも簡単なことではないです.迷いがあって、怠けてもいいです.
寄り添って歩こうとしないなら、千里にも満たない.