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容器中

  • 相关阅读:
    hotmail 收不到邮件的问题
    getaddrinfo 报错 Invalid value for ai_flags
    Avoiding Common Networking Mistakes
    关掉标准输出
    不需要 root 权限的 ping
    select 的问题
    Behavior Tree 用 Lua 实现一个最简行为树
    对 UDP 的一些思考
    Windows UDP sockets: recvfrom() fails with error 10054
    和等于某个数的所有组合
  • 原文地址:https://www.cnblogs.com/mufeng07/p/12193461.html
Copyright © 2011-2022 走看看