作用
先看下这个注解都有什么属性
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自动装配用到的 AutoConfigurationImportSelector 这个类继承了ImportSelector,做了什么呢? 可以参考 tech.souyunku.com5efd98… 有对这个类进行解释
ImportBeanDefinitionRegistrar
public interface ImportBeanDefinitionRegistrar {
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry);
}
ImportBeanDefinitionRegistrar 同样也是一个接口,一般我们也是实现ImportBeanDefinitionRegistrar#registerBeanDefinitions。这个方法顾名思义,就是可以注册beanDefinition。同样这个方法也是spring帮我们调用的,调用的过程会传入registry,beanDefinition注册器,通过这个我们可以自己实现注册想要注册的bean
应用
在mybatis和spring整合过程中,MapperScannerRegistrar起到了关键的作用。MapperScannerRegistrar实现了ImportBeanDefinitionRegistrar#registerBeanDef 在这个方法中,对包进行扫描,然后将mapper注册到spring容器中,详情见 juejin.im/editor/draf…
总结
所以@import 顾名思义就是导入,作用其实就是这两个类的作用,一个是返回需要spirng帮忙管理的bean名称字符串,一个是直接拿注册器,直接注册自己想要注册的类
@import 更多应用
可以看到很多@Enablexxx的注解里面其实都相当于继承了@Import比如:
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
}
一般我们用这个注解表示开启aop开关,其实就是扫描@Import 然后调用AspectJAutoProxyRegistrar#registerBeanDefinitions方法,往spring容器中 注册 AnnotationAwareAspectJAutoProxyCreator 这个后置处理器去进行aop代理的处理