【Spring注解】@Import注解
4.@Import常用的导入注解分类:注册自己写的类service、dao、controller可用包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)@Bean[导入的第三方包里面的组件]@Import[快速给容器中导入一个组件]1)、@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是...
·
4.@Import
常用的导入注解分类:
注册自己写的类service、dao、controller可用包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)
@Bean[导入的第三方包里面的组件]
@Import[快速给容器中导入一个组件]
1)、@Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名 2)、ImportSelector:返回需要导入的组件的全类名数组; 3)、ImportBeanDefinitionRegistrar:手动注册bean到容器中
4.1 @Import
新建实体类Animal、Cat、Dog来测试
配置类 ImportConfig
/**
* @author GaoYuzhe
* @date 2018/3/13.
*/
//注入Animal对象
@Import(Animal.class)
@Configuration
public class ImportConfig {
}
测试类
/**
* @author GaoYuzhe
* @date 2018/3/13.
*/
public class ImportConfigTest {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(ImportConfig.class);
/**
* 遍历匹配的组件名称
* @param annotationConfigApplicationContext 注解上下文
*/
private void printClassName(AnnotationConfigApplicationContext annotationConfigApplicationContext){
String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
for (int i = 0; i < beanDefinitionNames.length; i++) {
System.out.println("匹配的类"+beanDefinitionNames[i]);
}
}
@Test
public void testImport(){
printClassName(annotationConfigApplicationContext);
}
}
运行结果:可用看到容器中注册了Animal对象,id为全类名
4.2@ImportSelector
自定义导入选择器,需要实现ImportSelector接口,重写selectImports(AnnotationMetadata importingClassMetadata)方法返回一个全类名的数组,注意不能返回null,不然会报NullPointException
/**
* 自定义导入选择器
* @author GaoYuzhe
* @date 2018/3/13.
*/
public class MyImportSelecttor implements ImportSelector{
/**
*
* @param importingClassMetadata 加@Import注解的类,所有注解信息
* @return
*/
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
//当前类的所有注解
Set<String> annotationTypes = importingClassMetadata.getAnnotationTypes();
System.out.println("当前配置类的注解信息:"+annotationTypes);
//注意不能返回null,不然会报NullPointException
System.out.println("注册了com.gaoyuzhe.pojo.Cat");
return new String[]{"com.gaoyuzhe.pojo.Cat"};
}
配置类注解
@Import({Animal.class, MyImportSelecttor.class})
运行结果,测试方法同4.1
4.3@ImportBeanDefinitionRegistrar
MyImportBeanDefinitionRegistrar 自定义ImportBeanDefinitionRegistrar
实现ImportBeanDefinitionRegistrar接口
**
* @author GaoYuzhe
* @date 2018/3/13.
*/
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{
/**
* 注册bean
* @param importingClassMetadata 当前类的信息
* @param registry Bean注册器
*/
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
/**
* BeanDefinition可以设置组件的多个信息
* 例如:
* setBeanClassName 设置bean的全类名
* setScope 设置bean的作用域
*/
BeanDefinition beanDefinition =new RootBeanDefinition();
beanDefinition.setBeanClassName("com.gaoyuzhe.pojo.Dog");
beanDefinition.setScope(BeanDefinition.SCOPE_PROTOTYPE);
//判断容器中是否注册Cat对象,如果有则注册Dog
if(registry.containsBeanDefinition("com.gaoyuzhe.pojo.Cat")){
//beanName为在容器中的id
registry.registerBeanDefinition("Dog",beanDefinition);
}
}
}
配置类注解
@Import({Animal.class, MyImportSelecttor.class, MyImportBeanDefinitionRegistrar.class})
运行结果,测试方法同4.1
更多推荐
已为社区贡献2条内容
所有评论(0)