@Import注解的详细介绍--三种使用方式-史上最全
1.@Import注解的定义
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
Class<?>[] value();
}
简单来说就是导入需要类的字节码,他会默认调用该类的无参构造方法
2.导入的类必须存在无参的构造方法
3.@Import导入的组件命名是类的全限定名
4.通过@Bean导入的就是方法名
@Import({People.class})
@Configuration(proxyBeanMethods = false)//告诉SpringBoot这是一个配置类 == 配置文件
public class MyConfig
@Bean//给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例
public People people() {
return new People(1, "迁承", dog());
}
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(QianchengApplication.class, args);
// testConfiguration(context);
testImport(context);
}
private static void testImport(ApplicationContext context) {
/**
* com.qiancheng.pojo.People @Import导入进来的bean的默认名字是:全类名;
* people 自己定义的bean
*/
String[] names = context.getBeanNamesForType(People.class);
for (String name : names) {
System.out.println(name);
}
}
5.Import的第二种用法ImportSelector
@Import(MyImportSelector.class)
其中MyImportSelector实现了ImportSelector接口
public class MyImportSelector implements ImportSelector {
/**
* importingClassMetadata:参数会拿到 被Import注解修饰的所有注解信息
* 只需要将导入的类的全限定名称放入数组中返回即可
*
* @param importingClassMetadata
* @return
*/
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.qiancheng.pojo.People", "com.qiancheng.pojo.Dog"};
}
}
6.Import的第三种用法ImportBeanDefinitionRegistrar接口
@Import(MyImportDefintionRegistrar.class)
MyImportDefintionRegistrar实现了ImportDefintionRegistrar接口 实现这个接口的有点是,可以拿到Bean的注册器,可以自己根据条件进行注册,删除,查找bean 等等操作
public class MyImportDefintionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* importingClassMetadata 导入类的所有注解信息
* registry : 可以对未定义的Bean进行注册
*
* @param importingClassMetadata
* @param registry
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
RootBeanDefinition beanDefinition = new RootBeanDefinition(People.class);
registry.registerBeanDefinition("people",beanDefinition);
}
}
努力奔跑,是为了追上曾经被寄予厚望的自己。