方式1:@Import({XXX.class,XXX.class})
配置类:
package com.jarvis.config;
@Import({com.jarvis.pojo.User.class}) //这里将User类注册到容器
@Configuration
public class JarvisConfig {
}
要import的类
注意,这个类没有加@Component,正常情况下无法被注册到容器中
package com.jarvis.pojo;
public class User {
}
测试类
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(JarvisConfig.class);
System.out.println(context.getBean(User.class));
}
======output:
com.jarvis.pojo.User@33cb5951
方式2:@Import(XXXImportSelector.class)
- 这种方式的前提就是一个类要实现ImportSelector接口
- selectImports的返回值就是我们实际上要导入到容器中的组件全类名
- AnnotationMetadata表示当前被@Import注解给标注的所有注解信息
- selectImports方法可以返回空数组但是不能返回null,否则会报空指针异常!
编写ImportSelector
public class JarvisImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
System.out.println("被@Import标注的类的注解:"+importingClassMetadata.getAnnotationTypes());
return new String[]{"com.jarvis.pojo.User"};
}
}
配置类:
@Import(JarvisImportSelector.class)
@Configuration
public class JarvisConfig {
}
测试类
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(JarvisConfig.class);
System.out.println(context.getBean(User.class));
}
======output:
被@Import标注的类的注解:[org.springframework.context.annotation.Import, org.springframework.context.annotation.Configuration]
com.jarvis.pojo.User@31206beb
方式3:@Import(XXXRegistrar.class)
- 需要一个类实现ImportBeanDefinitionRegistrar接口
- registerBeanDefinitions方法其实是将要注册类的BeanDefinition注册进入到beanFactory中,然后通过spring的生命周期流程生成一个bean
编写ImportBeanDefinitionRegistrar
public class JarvisRegistrar implements ImportBeanDefinitionRegistrar {
/**
* 将要注册类的BeanDefinition注册进入到beanFactory中,然后通过spring的生命周期流程生成一个bean
* importingClassMetadata--表示当前被@Import注解给标注的所有注解信息
* registry--表示用于注册定义一个bean
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
System.out.println(importingClassMetadata.getAnnotationTypes());
//生成一个BeanDefinition
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(User.class);
//注册这个BeanDefinition 名字为user123
registry.registerBeanDefinition("user123", rootBeanDefinition);
}
}
配置类
@Import(JarvisRegistrar.class)
@Configuration
@ComponentScan("com.jarvis")
public class JarvisConfig {
}
通过BeanFactory后置处理器查看是否已经将User类的BeanDefinition注册
@Component
public class JarvisBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
boolean user123 = beanFactory.containsBean("user123");
System.out.println(user123);
}
}
测试程序
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(JarvisConfig.class);
System.out.println(context.getBean("user123",User.class));
}
======output:
[org.springframework.context.annotation.Import, org.springframework.context.annotation.Configuration, org.springframework.context.annotation.ComponentScan]
true //表示已经将User注册到BeanDefinition中了
com.jarvis.pojo.User@146044d7
@Import注解的三种使用方式总结
第一种用法:@Import({ 要导入的容器中的组件 } ):容器会自动注册这个组件,id默认是全类名
第二种用法:ImportSelector:返回需要导入的组件的全类名数组,springboot底层用的特别多【重点 】
第三种用法:ImportBeanDefinitionRegistrar:手动注册bean到容器