唐僧喜欢小龙女

导航

@Import 注解的学习

1、@Import注解的作用

通过手动导入的方式想IOC容器里面注入bean,这个注解的属性值放的是Class的数组

这里也可以把不在Spring Boot 的包扫描路径下的文件加载到容器里面

2、代码事例放不同类型的java类

放的类一定要有一个无参的构造器,否则会报错

@Import(默认的beanId是 全类名)
1)ImportSelector:接口返回值是需要导入的组件的全类名数组,实现了这个接口的类是不会导入到容器里面的 Springboot中用的很多
2)ImportBeanDefinitionRegistrar,通过手动的方式把需要放到容器里的类,放到容器里面,实现了这个接口的类是不会导入到容器里面的
3)通过ImportSelector 和 ImportBeanDefinitionRegistrar 被注入进容器里面的bean,必须有无参的构造器,否则报错注入不进去
如Color

2.1 放一个普通的java类

@Configuration
@Import({Color.class})
public class MainConfig {

}

public class Color {

    public Color() {
    }

    private int num;


    public Color(int num) {
        this.num = num;
    }
}

 

2.2 放一个实现了ImportSelector 接口的类

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


}

public class MyImportSelector implements ImportSelector {


    //返回值就是需要向容器中注入的全类名
    //importingClassMetadata 这个里面获取 使用@Import注解类的全部注解信息
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        Set<String> stringSet = importingClassMetadata.getAnnotationTypes();
        Iterator iterator = stringSet.iterator();
//        for (int i = 0; i < stringSet.size(); i++) {
//            if(iterator.hasNext()){
//                System.out.println(iterator.next());
//            }
//
//        }

        return new String[]{"com.ali.sofa.gts.pojo.Blue"};
    }
}

  

2.3 放一个实现了ImportBeanDefinitionRegistrar 接口的类

@Configuration
@Import({MyBeanDefinitionRegistry.class})
public class MainConfig {

    
}


public class MyBeanDefinitionRegistry implements ImportBeanDefinitionRegistrar {
    /**
     *
     *
     *
     * @param importingClassMetadata  这个里面获取 使用@Import注解类的全部注解信息
     * @param registry                注册类:用来注册bean的,把需要放到容器里面的类可以调用这个类的registerBeanDefinition方法
     */
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

        Boolean b =registry.containsBeanDefinition("com.ali.sofa.gts.pojo.Red");

        Boolean b1 =registry.containsBeanDefinition("com.ali.sofa.gts.pojo.Blue");

        if(b && b1){
            registry.registerBeanDefinition("yellow",new RootBeanDefinition(Yellow.class));
        }

    }
}

  

posted on 2021-05-29 10:40  与时具进&不忘初心  阅读(96)  评论(0编辑  收藏  举报