zoukankan      html  css  js  c++  java
  • spring-context中@Import的源码解析说明

    spring版本为5.0.11

    1. 声明一个bean
    2. 导入@Configuration注解的配置类
    3. 导入ImportSelector的实现类
    4. 导入ImportBeanDefinitionRegistrar的实现类
    @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注解的使用

    1.声明一个bean

    @Import({Bean1.class,TestConfiguration.class,TestImportBeanDefinitionRegistrar.class,TestImportSelector.class})
    @Configuration
    public class ImportConfiguration {
    
    }

    2.导入@Configuration注解的配置类

    @Configuration
    public class TestConfiguration {
        @Bean
        public User user(){
            return new User();
        }
    }
    @Import({Bean1.class,TestConfiguration.class,TestImportBeanDefinitionRegistrar.class,TestImportSelector.class})
    @Configuration
    public class ImportConfiguration {
    
    }

    3.导入ImportSelector的实现类

    public class TestImportSelector implements ImportSelector {
        @Override
        public String[] selectImports(AnnotationMetadata annotationMetadata) {
            return new String[]{"com.mufeng.bean.bean2"};
        }
    }

    4.导入ImportBeanDefinitionRegistrar的实现类

    public class TestImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
        @Override
        public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
            RootBeanDefinition rootBeanDefinition=new RootBeanDefinition(Bean3.class);
            beanDefinitionRegistry.registerBeanDefinition("Bean3",rootBeanDefinition);
        }
    }
    @Import({Bean1.class,TestConfiguration.class,TestImportBeanDefinitionRegistrar.class,TestImportSelector.class})
    @Configuration
    public class ImportConfiguration {
    
    }

    测试结果

    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = StartBootTestApplication.class)
    public class TestImport {
        @Test
        public void test1(){
            AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(ImportConfiguration.class);
            String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
            System.out.println("---------------------------------");
            for(String beanDefinition:beanDefinitionNames){
                System.out.println(beanDefinition);
            }
            System.out.println("------------------------------------");
        }
    }
    Bean1 instanced
    Bean2 instanced
    Bean3 instanced
    ---------------------------------
    org.springframework.context.annotation.internalConfigurationAnnotationProcessor
    org.springframework.context.annotation.internalAutowiredAnnotationProcessor
    org.springframework.context.annotation.internalRequiredAnnotationProcessor
    org.springframework.context.annotation.internalCommonAnnotationProcessor
    org.springframework.context.event.internalEventListenerProcessor
    org.springframework.context.event.internalEventListenerFactory
    importConfiguration
    com.mufeng.bean.Bean1
    com.mufeng.config.TestConfiguration
    user
    com.mufeng.bean.Bean2
    Bean3
    ------------------------------------

    Bean1、Bean2、Bean3、User导入到spring容器中

  • 相关阅读:
    Oracle日期周具体解释以及周開始结束时间计算
    getActivity nullPointerException
    dTree无限级文件夹树和JQuery同步Ajax请求
    按键精灵微信群内加好友
    QPS、RT、PV、UV之间的关系
    [简谈]绕过HR破门而入的求职智慧
    Mina、Netty、Twisted一起学(十):线程模型
    ubuntu查看硬件信息
    openstack API debug OpenstackEveryProject_CLI,curl_based
    openstack configure
  • 原文地址:https://www.cnblogs.com/mufeng07/p/12193461.html
Copyright © 2011-2022 走看看