看Spring源码不得不会的@Enable模块驱动实现原理讲解(一)

pivoteic
发布于 2022-6-15 17:15
浏览
0收藏

 

这篇文章我想和你聊一聊 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注解功能是如何实现的。

看Spring源码不得不会的@Enable模块驱动实现原理讲解(一)-鸿蒙开发者社区

@Import注解的功能是在org.springframework.context.annotation.ConfigurationClassParser类processImports方法处理的。接下来我们就来解读一下实现的核心部分。

看Spring源码不得不会的@Enable模块驱动实现原理讲解(一)-鸿蒙开发者社区

首先判断@Import注解导入的是配置类有没有实现ImportSelector接口,实现的话就就调用ImportSelector的selectImports方法,这个方法返回的是一批配置类的全限定名,然后继续解析这些配置类。

看Spring源码不得不会的@Enable模块驱动实现原理讲解(一)-鸿蒙开发者社区

ImportSelector接口的作用其实就是往spring容器中再次注入一批配置类。

 

如果没有实现ImportSelector接口,那么再判断有没有实现ImportBeanDefinitionRegistrar,有的话就会调用ImportBeanDefinitionRegistrar的registerBeanDefinitions方法,通过名字也可以判断出,其实就是往spring容器注入一些BeanDefinition。

看Spring源码不得不会的@Enable模块驱动实现原理讲解(一)-鸿蒙开发者社区

ImportBeanDefinitionRegistrar的作用其实很简单,就是往spring容器注入一些BeanDefinition。如果不是很清楚BeanDefinition是什么,欢迎查看Spring bean到底是如何创建的?(上)这篇文章,有讲解。

 

文章转自公众号:三友的java日记

标签
已于2022-6-15 17:15:20修改
收藏
回复
举报
回复
    相关推荐