Spring源码之 @Import

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

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,做了什么呢?
可以参考 juejin.im/post/5efd98…
有对这个类进行解释

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代理的处理

原文 

https://juejin.im/post/5f001f0e5188252e8a081929

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Spring源码之 @Import

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址