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. iOS二进制方案真实落地经验(30分钟降低到10分钟以内)

    iOS二进制方案真实落地经验(30分钟降低到10分钟以内) 我们做iOS二进制化断断续续尝试了一年多了,来来回回换了三个架构师去尝试落地,今日完全落地,在此做个总结 背景 工程基于cocoapod的组 ...

  2. h5跳转高德地图

    <a href="https://uri.amap.com/marker?position=经度,纬度&name=所在的位置名称">高德地图</a>

  3. JAVA-JDK1.7-ConCurrentHashMap-测试和验证

    概述 上次记录了关于ConCurrentHashMap的原理以及源码,现在我对其进行有关功能的测试,下面就讲解一下我测试的内容和代码.这些测试主要针对JDK1.7版本. GET安全测试 上一篇写过ge ...

  4. 【Java】IO

    文章目录 IO 说明 流的分类 关于相对路径 节点流 FileRead 对read()操作升级:使用read的重载方法 总结 FileWriter 复制操作 总结 FileInput(Output)S ...

  5. 《剑指offer》面试题57 - II. 和为s的连续正数序列

    问题描述 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数). 序列内的数字由小到大排列,不同序列按照首个数字从小到大排列. 示例 1: 输入:target ...

  6. 【初体验】valgrind分析程序性能

    wget https://fossies.org/linux/misc/valgrind-3.15.0.tar.bz2 tar -jxvf valgrind-3.15.0.tar.bz2 cd val ...

  7. 使用ajax登录验证,第一次点击登录按钮无反应,第二次点击才能正常运行。

    问题描述: 使用ajax进行登录验证时,第一次点击登录按钮无反应,第二次点击才能进去. 解决方法: 原来的代码 <form action="" method="po ...

  8. Luogu P1314 [NOIP2011 提高组] 聪明的质监员

    P1314 [NOIP2011 提高组] 聪明的质监员 题意 题目描述 给定\(n\)个物品,给定每个物品的 重量 \(w_i\) 和 价值 \(v_i\) 给定一个标准值 \(s\) 以及一个参数 ...

  9. PyTorch 介绍 | BUILD THE NEURAL NETWORK

    神经网络由对数据进行操作的layers/modules组成.torch.nn 命名空间提供了所有你需要的构建块,用于构建你自己的神经网络.PyTorch的每一个module都继承自nn.Module. ...

  10. 「SHOI2006」有色图

    首先发现这题虽然是边的置换,但是是由点的置换所造成的,并且发现点置换对应的所有边置换和置换操作构成置换群. 由于颜色可以全选,那么根据 Polya 定理,答案为: \[|X / G| = \frac{ ...