Spring源码之 @Import

做用

先看下这个注解都有什么属性spring

public @interface Import {

	/**
	 * {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
	 * or regular component classes to import.
	 */
	Class<?>[] value();
}
复制代码

看value属性上面的注解 value能够放两种重要的类 ImportSelector和ImportBeanDefinitionRegistrar,固然也能够放普通类,就是不继承这两种类,因此若是想了解@Import有什么做用就要了解ImportBeanDefinitionRegistrar和 ImportSelector有什么用数组

ImportSelector

public interface ImportSelector {
	String[] selectImports(AnnotationMetadata importingClassMetadata);
}
复制代码

ImportSelector 是一个接口,通常咱们都是实现这个接口的selectImports方法,这个方法有什么做用?这个方法主要是会spring执行,返回值是咱们想让spring管理的bean全类名。 好比我想让spring帮我管理A对象和B对象,这个方法就会返回一个数组{com.xx.a,cong.xx.b},spring收到返回值以后就会将这两个bean进行处理,入参AnnotationMetadata有什么做用?可让selectImports这个方法拿到注解的内容,而后进行所须要的处理,好比说须要让bena管理的是从注解中获取到springboot

应用

典型的应用就是springboot自动装配用到的 AutoConfigurationImportSelector 这个类继承了ImportSelector,作了什么呢? 能够参考 juejin.im/post/5efd98… 有对这个类进行解释bash

ImportBeanDefinitionRegistrar

public interface ImportBeanDefinitionRegistrar {
	public void registerBeanDefinitions(
			AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);
}
复制代码

ImportBeanDefinitionRegistrar 一样也是一个接口,通常咱们也是实现ImportBeanDefinitionRegistrar#registerBeanDefinitions。这个方法顾名思义,就是能够注册beanDefinition。一样这个方法也是spring帮咱们调用的,调用的过程会传入registry,beanDefinition注册器,经过这个咱们能够本身实现注册想要注册的beanmybatis

应用

在mybatis和spring整合过程当中,MapperScannerRegistrar起到了关键的做用。MapperScannerRegistrar实现了ImportBeanDefinitionRegistrar#registerBeanDef 在这个方法中,对包进行扫描,而后将mapper注册到spring容器中,详情见 juejin.im/editor/draf…app

总结

因此@import 顾名思义就是导入,做用其实就是这两个类的做用,一个是返回须要spirng帮忙管理的bean名称字符串,一个是直接拿注册器,直接注册本身想要注册的类post

@import 更多应用

能够看到不少@Enablexxx的注解里面其实都至关于继承了@Import好比:spa

@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {

}
复制代码

通常咱们用这个注解表示开启aop开关,其实就是扫描@Import 而后调用AspectJAutoProxyRegistrar#registerBeanDefinitions方法,往spring容器中 注册 AnnotationAwareAspectJAutoProxyCreator 这个后置处理器去进行aop代理的处理代理

相关文章
相关标签/搜索