先看下这个注解都有什么属性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有什么用数组
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
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
能够看到不少@Enablexxx的注解里面其实都至关于继承了@Import好比:spa
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
}
复制代码
通常咱们用这个注解表示开启aop开关,其实就是扫描@Import 而后调用AspectJAutoProxyRegistrar#registerBeanDefinitions方法,往spring容器中 注册 AnnotationAwareAspectJAutoProxyCreator 这个后置处理器去进行aop代理的处理代理