@Import 注解可以普通類導(dǎo)入到 IoC容器中。
想要讓一個(gè)普通類接受 Spring 容器管理咕村,有以下方法
- 使用 @Bean 注解
- 使用 @Controller @Service @Repository @Component 注解標(biāo)注該類,然后再使用 @ComponentScan 掃描包
- @Import 方法的圆,即現(xiàn)在這種方式
Student 類
public class Student {
}
配置類
@Configuration
@Import(Student.class)
public class ImportConfig {
}
測(cè)試代碼
@Test
public void test7() {
ApplicationContext ctx = new AnnotationConfigApplicationContext(ImportConfig.class);
String[] beanDefinitionNames = ctx.getBeanDefinitionNames();
for (String name : beanDefinitionNames) {
System.out.println(name);
}
}
觀察有沒(méi)有 Student 產(chǎn)生的 bean
結(jié)果
bean成功創(chuàng)建
以上導(dǎo)入普通的 Java 并將其聲明為一個(gè) bean 功能在 4.2 之后才可以使用在 spring 4.2 以前贮配,該注解,只能導(dǎo)入配置類耍铜,其功能與 <import /> 標(biāo)簽類似
ImportSelector
ImportSelector : 返回需要導(dǎo)入的組件的全類名數(shù)組
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 {
}
測(cè)試代碼不變邑闺,直接看結(jié)果
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 {
}
測(cè)試代碼不變,直接看結(jié)果棕兼,看看是否有 PERSON 這個(gè)組件
PERSON 成功注冊(cè)