Spring高级特性之三:@Enable*注解的工作原理
Spring Boot中阐述热插拔技术的时候,简单地提及@Enable*注解。随着多种框架的应用及深入了解,@Enable*这个注解在各种框架中应用相当普及。
那么@Enable*注解工作原理是怎么样的呢?实际通过spring家族的框架分析观察所有的@Enable*注解都有一个@Import注解。@Import注解用于导入配置类,这也就意味着这些自动开启的实现其实是导入一些自动配置的Bean。这些导入配置的方式可以分为三类,故@Enable*可以分为三类。
首先我们查看下@Import注解的功能:

通过上述@Import的功能注解,可以知具体三类为:
一、直接导入配置类(导入@Configuration)
二、依据条件选择配置类(导入与ImportSelector相关)
三、动态注册Bean(导入与ImportBeanDefinitionRegistrar相关)
Dubbo框架中的@EnableDubboConfig就属于这一类,就以这个注解为例分析:


对于方法registerBeanDefinitions,顾名思义注册Bean定义。DubboConfigconfigurationRegistrar实现了ImportBeanDefinitionRegistrar接口,接口的作用就是在运行时自动添加Bean到已有的配置类,通过红框中的方法重写。
其中,AnnotationMetadata参数用来获得当期配置类上的注解;BeanDefinitionRegistry参数为待注册Bean。源码如下:



通过上述列图,使用@EnableDubboConfig会自动加载与dubbo相关的配置类。当配置文件中有prefix为上述图中的关键字时,将自动将相关参数通过配置类注入到容器中。
那么具体如何执行的呢?解析配置类时动态获取@Imports属性内容识别待处理的配置类:


自定义配置ProviderConfiguration中解析出@Imports中value值,此过程均由ConfigurationClassParser解析类完成。完成后就开始进行beandefinition的注册,其中就涉及到上面两个Registrar的调用,如下:

以上解析,调用是一个循环过程,即Spring单例注册一个核心的思想:层次依赖——由外到里依次解析暴露出所有的beandefinition。具体代码为:

dubbo配置文件就在上述过程中完成保存其内容的数据结构的beandefinition的处理(最多是十一个):

Spring高级特性之三:@Enable*注解的工作原理的更多相关文章
- Spring高级话题-@Enable***注解的工作原理
出自:http://blog.csdn.net/qq_26525215 @EnableAspectJAutoProxy @EnableAspectJAutoProxy注解 激活Aspect自动代理 & ...
- Spring的@Enable*注解的工作原理
转自:https://blog.csdn.net/chengqiuming/article/details/81586948 一 列举几个@Enable*注解的功能 @EnableAspectJAut ...
- springBoot @Enable*注解的工作原理
使用注解实现异步 RunnableDemo类 package com.boot.enable.bootenable; import org.springframework.scheduling.ann ...
- @Enable*注解的工作原理
@EnableAspectJAutoProxy @EnableAsync @EnableScheduling @EnableWebMv @EnableConfigurationProperties @ ...
- EnableAutoConfiguration注解的工作原理(org.springframework.boot.autoconfigure.EnableAutoConfiguration=core.bean.MyConfig)
EnableAutoConfiguration注解的工作原理(org.springframework.boot.autoconfigure.EnableAutoConfiguration=core.b ...
- Spring高级特性之四:FactoryBean和BeanFactory
FactoryBean和BeanFactory两只是两个单词顺序不同但是内容大不相同.落脚点在后面一个单词,前面一个单词是其功能描述:FactoryBean--工厂bean,一个建工厂的bean?Be ...
- Spring Boot实战笔记(九)-- Spring高级话题(组合注解与元注解)
一.组合注解与元注解 从Spring 2开始,为了响应JDK 1.5推出的注解功能,Spring开始大量加入注解来替代xml配置.Spring的注解主要用来配置注入Bean,切面相关配置(@Trans ...
- Spring Boot实战笔记(八)-- Spring高级话题(条件注解@Conditional)
一.条件注解@Conditional 在之前的学习中,通过活动的profile,我们可以获得不同的Bean.Spring4提供了一个更通用的基于条件的Bean的创建,即使用@Conditional注解 ...
- Spring高级特性之一: Aware之ApplicationContextAware
关于Spring Aware之前似乎涉及过,但是未写过单独的小作文.这里为它专门写个小作文吧,关于它在自定义注解中的应用. 首先,概要介绍下Aware. Spring的依赖注入的最大亮点就是你所有的B ...
随机推荐
- vue3.0+vite+ts项目搭建--初始化项目(一)
vite 初始化项目 使用npm npm init vite@latest 使用yarn yarn create vite 使用pnpm pnpx create-vite 根据提示输入项目名称,选择v ...
- javascript中什么时候要用\来转义
1.定义字符串的单引号或双引号里的同符号或字符串内回车换行,比如A: a = "<a href=\"...\">a</a>"; B: a ...
- Linux防火墙--IPtables企业级配置策略思路
一.防火墙简介 防火墙定义:是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内.外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术. 防火墙发展应用:最早 ...
- Typora 图片上传
Typora 图片上传 本文借鉴源于:https://zhuanlan.zhihu.com/p/137426939 感谢博主分享 引: 不知道你们平时都在哪里做笔记,本人都是在CSDN Java慈祥 ...
- 《剑指offer》面试题67. 把字符串转换成整数
问题描述 写一个函数 StrToInt,实现把字符串转换成整数这个功能.不能使用 atoi 或者其他类似的库函数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. ...
- Sentry 开发者贡献指南 - 测试技巧
作为 CI 流程的一部分,我们在 Sentry 运行了多种测试. 本节旨在记录一些 sentry 特定的帮助程序, 并提供有关在构建新功能时应考虑包括哪些类型的测试的指南. 获取设置 验收和 pyth ...
- Mybatis 学习记录 续
项目结构如下: 1.数据库建表 表名:user 结构: 内容: 2.pom.xml文件更新如下: 注:其中build部分尤其需要重视 <?xml version="1.0" ...
- 探索新冠肺炎(COVID-19)对全球航班的影响
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 随着今天从欧洲到美国的旅行限制生效,以及为了减缓新冠病毒的传播更 ...
- VueRouter学习01-基本使用
## 基本使用: 1. 创建一个`VueRouter`对象:`new VueRouter()`. 2. 在`VueRouter`中,需要传递一个`routes`参数.这个参数是一个数组类型,数组中存储 ...
- gin初识
Gin 是一个用 Go (Golang) 编写的 web 框架. 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httprouter,速度提高了近 40 倍. 如果你是性能和 ...