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*注解的工作原理的更多相关文章

  1. Spring高级话题-@Enable***注解的工作原理

    出自:http://blog.csdn.net/qq_26525215 @EnableAspectJAutoProxy @EnableAspectJAutoProxy注解 激活Aspect自动代理 & ...

  2. Spring的@Enable*注解的工作原理

    转自:https://blog.csdn.net/chengqiuming/article/details/81586948 一 列举几个@Enable*注解的功能 @EnableAspectJAut ...

  3. springBoot @Enable*注解的工作原理

    使用注解实现异步 RunnableDemo类 package com.boot.enable.bootenable; import org.springframework.scheduling.ann ...

  4. @Enable*注解的工作原理

    @EnableAspectJAutoProxy @EnableAsync @EnableScheduling @EnableWebMv @EnableConfigurationProperties @ ...

  5. EnableAutoConfiguration注解的工作原理(org.springframework.boot.autoconfigure.EnableAutoConfiguration=core.bean.MyConfig)

    EnableAutoConfiguration注解的工作原理(org.springframework.boot.autoconfigure.EnableAutoConfiguration=core.b ...

  6. Spring高级特性之四:FactoryBean和BeanFactory

    FactoryBean和BeanFactory两只是两个单词顺序不同但是内容大不相同.落脚点在后面一个单词,前面一个单词是其功能描述:FactoryBean--工厂bean,一个建工厂的bean?Be ...

  7. Spring Boot实战笔记(九)-- Spring高级话题(组合注解与元注解)

    一.组合注解与元注解 从Spring 2开始,为了响应JDK 1.5推出的注解功能,Spring开始大量加入注解来替代xml配置.Spring的注解主要用来配置注入Bean,切面相关配置(@Trans ...

  8. Spring Boot实战笔记(八)-- Spring高级话题(条件注解@Conditional)

    一.条件注解@Conditional 在之前的学习中,通过活动的profile,我们可以获得不同的Bean.Spring4提供了一个更通用的基于条件的Bean的创建,即使用@Conditional注解 ...

  9. Spring高级特性之一: Aware之ApplicationContextAware

    关于Spring Aware之前似乎涉及过,但是未写过单独的小作文.这里为它专门写个小作文吧,关于它在自定义注解中的应用. 首先,概要介绍下Aware. Spring的依赖注入的最大亮点就是你所有的B ...

随机推荐

  1. 面试官: Flink双流JOIN了解吗? 简单说说其实现原理

    摘要:今天和大家聊聊Flink双流Join问题.这是一个高频面试点,也是工作中常遇到的一种真实场景. 本文分享自华为云社区<万字直通面试:Flink双流JOIN>,作者:大数据兵工厂 . ...

  2. Docker 安装与常用命令

    目录 Docker 安装 1)安装 2)启动 3)镜像加速器 Docker 常用命令 1)Docker 进程相关命令 2)Docker 镜像相关命令 docker search:查找镜像仓库中的镜像 ...

  3. 我的MySQL学习记录 完结篇DAY05~

    课程已全部学完,Redis\mongoDB 的学习也会提上日程啦~剩下的最大的最大的问题在于练习,大量的练习,后期会发我的学习记录. 小记:也不知道是不是加强针的缘故,老是拉肚子,记录彻底感冒的一天, ...

  4. Android学习笔记2

    4,用intent在activity之间传递数据(两个Activity可能不是在一个应用程序中) (1),从MainActivity向HelloActivity传递参数123 package com. ...

  5. Go 常用函数

    #### Go 常用函数,错误处理这一节我们来学习一下Go 常用的函数,这些函数有些是内置的,有些是官方标准库内的, 熟悉这些函数对程序开发来讲还是很重要的; 1. len("abc&quo ...

  6. HMS Core 6.3.0 版本发布公告

    新增内容风控检测,若用户输入内容不符合国家法律法规要求,风控将会拦截,无法翻译手语动作. 查看详情>> 新增受众同步至HUAWEI Ads功能,实现精准投放高价值用户,提升广告效率: 新增 ...

  7. 【Android】安卓四大组件之内容提供者

    [Android]安卓四大组件之内容提供者 1.关于内容提供者 1.1 什么是内容提供者 内容提供者就是contentProvider,作用有如下: 给多个应用提供数据 类似一个接口 可以和多个应用分 ...

  8. 微服务架构 | 5.1 使用 Netflix Hystrix 断路器

    目录 前言 1. Hystrix 基础知识 1.1 Hystrix 断路器强调调用 1.2 两大类别的 Hystrix 实现 1.3 舱壁策略 1.4 Hystrix 在远程资源调用失败时的决策过程 ...

  9. Redis学习笔记(三)redis 的键管理

    Redis 的键管理 一.Redis 数据库管理 Redis 是一个键值对(key-value pair)的数据库服务器,其数据保存在 src/server.h/redisDb 中(网上很多帖子说在 ...

  10. Lesson1——NumPy NumPy 安装

    NumPy 教程目录 NumPy 安装 Python 官网上的发行版是不包含 NumPy 模块的.(pip list 测试一下) 我们可以使用以下几种方法来安装. 1 使用已有的发行版本 对于许多用户 ...