@import注解用法

@Import通过快速导入的方式实现把实例加入spring的IOC容器中
@Import注解的作用和在使用spring的xml配置时用到的类似。但应注意是@Import在使用时,
必须要保证能被IOC容器扫描到,所以通常它会和@Configuration或者@ComponentScan配套使用。
@Import在使用时可以声明在JAVA类上,或者作为元注解使用(即声明在其他注解上)

@Import注解有三种用法

直接导入@Configuration配置类
public class Dog {
     
    public void run() {
     
        System.out.println("Dog run");
    }
}

@Import(Dog.class)
@Configuration
public class AppConfig {
     
}
// 测试类
public class annoTest {
     
    private static AnnotationConfigApplicationContext classPath;
    @Test
    public void testConsutrator(){
     
        classPath = new AnnotationConfigApplicationContext(AppConfig.class);
        Dog exampleBean = classPath.getBean(Dog.class);
        System.out.println(exampleBean);
    }
}

@import注解用法_第1张图片

导入实现了ImportSelector的类

返回值: 就是我们实际上要导入到容器中的组件全类名
参数: AnnotationMetadata表示当前被@Import的类上的所有注解信息

public class MyImportSelector implements ImportSelector {
     
    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
     
        Set<String> annotationTypes = annotationMetadata.getAnnotationTypes();
        for (String str:annotationTypes) {
     
            System.out.println(str);
        }
        return new String[]{
     "com.picc.spring.annotation.Dog"};
    }
}

@Import({
     MyImportSelector.class})
@Configuration
public class AppConfig {
     
}

public class annoTest {
     
    private static AnnotationConfigApplicationContext classPath;
    @Test
    public void testConsutrator(){
     
        classPath = new AnnotationConfigApplicationContext(AppConfig.class);
        Dog exampleBean = classPath.getBean(Dog.class);
        System.out.println(exampleBean);
    }
}

@import注解用法_第2张图片

导入实现了ImportBeanDefinitionRegistrar的类
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
     
    @Override
    public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
     
        Set<String> annotationTypes = annotationMetadata.getAnnotationTypes();
        for (String str:annotationTypes) {
     
            System.out.println(str);
        }
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Dog.class);
        beanDefinitionRegistry.registerBeanDefinition("dog",rootBeanDefinition);
    }
}

@Import({
     MyImportBeanDefinitionRegistrar.class})
@Configuration
public class AppConfig {
     
}

@import注解用法_第3张图片

你可能感兴趣的:(springboot)