@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
结果
![](http://upload-images.jianshu.io/upload_images/1999788-e10a8d7cfa160220.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/565/format/webp)
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 { }
测试代码不变,直接看结果
![](http://upload-images.jianshu.io/upload_images/1999788-9d34fadd71d90398.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/479/format/webp)
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 这个组件
![](http://upload-images.jianshu.io/upload_images/1999788-332d169253007066.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/454/format/webp)
PERSON 成功注册