@Import 注解可以普通类导入到 IoC容器中。
想要让一个普通类接受 Spring 容器管理,有以下方法
使用 @Bean 注解
使用 @Controller @Service @Repository @Component 注解标注该类,然后再使用 @ComponentScan 扫描包
@Import 方法,即现在这种方式
Student 类
public class Student {}
配置类
@Configuration@Import(Student.class)public class ImportConfig { }
测试代码
@Test public void test7() { ApplicationContext ctx = new AnnotationConfigApplicationContext(ImportConfig.class); String[] beanDefinitionNames = ctx.getBeanDefinitionNames(); for (String name : beanDefinitionNames) { System.out.println(name); } }
观察有没有 Student 产生的 bean
结果
bean成功创建
以上导入普通的 Java 并将其声明为一个 bean 功能在 4.2 之后才可以使用在 spring 4.2 以前,该注解,只能导入配置类,其功能与 <import /> 标签类似
ImportSelector
ImportSelector : 返回需要导入的组件的全类名数组
MySelector 类
public class MySelector implements ImportSelector { public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{"me.sjl.bean.Person"}; } }
配置类
@Configuration@Import(MySelector.class)public class ImportConfig { }
测试代码不变,直接看结果
Person 类被加载
ImportBeanDefinitionRegistrar
BeanDefinitionRegistrar
public class MyBeanDefinitionRegistrat implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { BeanDefinition beanDefinition = new RootBeanDefinition(Person.class); registry.registerBeanDefinition("PERSON", beanDefinition); } }
配置类
@Configuration@Import(MyBeanDefinitionRegistrat.class)public class ImportConfig { }
测试代码不变,直接看结果,看看是否有 PERSON 这个组件
PERSON 成功注册
作者:宿命99
链接:https://www.jianshu.com/p/afd2c49394c2