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

原文地址:https://www.cnblogs.com/mufeng07/p/12193461.html