海洋做网站,国外订房网站怎么和做,家具网站建设目的及功能定位,石家庄市城乡建设局网站这篇文章我想和你聊一聊 spring的Enable模块驱动的实现原理。
在我们平时使用spring的过程中#xff0c;如果想要加个定时任务的功能#xff0c;那么就需要加注解EnableScheduling#xff0c;如果想使用异步的功能#xff0c;那就要加EnableScheduling注解#xff0c;其实…这篇文章我想和你聊一聊 spring的Enable模块驱动的实现原理。
在我们平时使用spring的过程中如果想要加个定时任务的功能那么就需要加注解EnableScheduling如果想使用异步的功能那就要加EnableScheduling注解其实这类注解就是属于Enable模块。
那么Enable模块到底有什么功能
模块是指具备相同领域的功能组件集合组合所形成一个独立的单元。比如Web MVC模块、AspectJ代理模块Caching缓存模块JMX(Java管理扩展)、Async异步处理模块等。所谓模块装配简而言之就是通过EnableXXX注解实现一个开关这个开关决定是否开启某个功能模块的所有组件的自动化配置。
那么EnableXXX注解是如何生效的
其实EnableXXX只是一个名字通过这个名字让人知道实现了什么功能其实这个注解叫什么名字其实是无所谓的就算不叫EnableXXX都行只不过spring内部都叫EnableXXX我们就习惯叫Enable模块所以核心不是这个注解而是注解实现的套路。
接下来我们来说说这个注解功能实现的套路
一般EnableXXX注解是通过Import实现具体的功能EnableXXX注解上加个Import注解Import才是EnableXXX起效果的核心功能。Import大家都知道就是往容器里面注入一个配置类但是这个配置类可是有讲究的。
这里我直接上源码带你看看Import注解功能是如何实现的。 Import注解的功能是在org.springframework.context.annotation.ConfigurationClassParser类processImports方法处理的。接下来我们就来解读一下实现的核心部分。 首先判断Import注解导入的是配置类有没有实现ImportSelector接口实现的话就就调用ImportSelector的selectImports方法这个方法返回的是一批配置类的全限定名然后继续解析这些配置类。 ImportSelector接口的作用其实就是往spring容器中再次注入一批配置类。
如果没有实现ImportSelector接口那么再判断有没有实现ImportBeanDefinitionRegistrar有的话就会调用ImportBeanDefinitionRegistrar的registerBeanDefinitions方法通过名字也可以判断出其实就是往spring容器注入一些BeanDefinition。 ImportBeanDefinitionRegistrar的作用其实很简单就是往spring容器注入一些BeanDefinition。如果不是很清楚BeanDefinition是什么欢迎查看Spring bean到底是如何创建的上这篇文章有讲解。
如果这两个接口都没有实现那么就当时一个普通的配置类进行解析。
读完Import实现的源码我们再来总结回顾Import的作用。
Import注解就是导入一个配置类但是这个配置类分为不同的情况。如果这个配置类实现了ImportSelector接口那么就会调用selectImports方法的实现获取一批配置类的全限定名然后再解析配置类如果实现了Import注解导入的配置类实现类ImportBeanDefinitionRegistrar那么就会调用registerBeanDefinitions方法的实现这个方法可以往容器中注入BeanDefinition最后如果都没实现那么就按照一个普通的配置类来解析。
所以基于这么一套配置类解析的规则就可以实现往容器中注入一些bean通过这些bean来完成某块功能的实现。
懂了Enbale模块驱动的基本原理接下来我们举个例子来看看EnbaleAsync注解是如何实现的。 EnbaleAsync注解上通过Import注解导入了AsyncConfigurationSelector类
接下来我们进入这个类 一看源码就发现继承了AdviceModeImportSelector其实这个类实现了ImportSelector接口附上源码 其实这个对于ImportSelector接口的实现就是解析注解的属性然后拿到一个AdviceMode再调用一个模板方法selectImports这个方法主要子类来实现所以我们来看看AsyncConfigurationSelector的实现。 这个adviceMode是注解EnableAaync注解中的属性mode()你可以自己翻一下默认是PROXY所以这个方法其实就是返回ProxyAsyncConfiguration类的全限定名其实就是往容器中添加了ProxyAsyncConfiguration配置类。
我们进入这个配置类看一下 其实就是往容器中注入一个AsyncAnnotationBeanPostProcessor通过名字可以看出这是一个BeanPostProcessor也就是在bean的生命周期的某个节点来处理Aysnc注解如果有不懂BeanPostProcessor的同学可以看看Spring bean到底是如何创建的上和 Spring bean到底是如何创建的下这两篇文章里面有详细的说明。至于AsyncAnnotationBeanPostProcessor的实现我们就不再继续深究了有兴趣的同学可以自行点进去看看。
所以说白了EnbaleAsync注解的主要作用就是往容器中添加一个可以住了Async注解的AsyncAnnotationBeanPostProcessor在bean创建的某个阶段起到作用。
看完EnableAsync注解的实现你也可以仿照这个注解的实现来自己实现一个Enable来实现某个特定的功能。
本文到这里也就结束了。