曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享
曹工说Spring Boot源码(2)-- Bean Definition到底是什么,咱们对着接口,逐个方法讲解
曹工说Spring Boot源码(3)-- 手动注册Bean Definition不比游戏好玩吗,我们来试一下
曹工说Spring Boot源码(4)-- 我是怎么自定义ApplicationContext,从json文件读取bean definition的?
曹工说Spring Boot源码(5)-- 怎么从properties文件读取bean
曹工说Spring Boot源码(6)-- Spring怎么从xml文件里解析bean的
曹工说Spring Boot源码(7)-- Spring解析xml文件,到底从中得到了什么(上)
曹工说Spring Boot源码(8)-- Spring解析xml文件,到底从中得到了什么(util命名空间)
曹工说Spring Boot源码(9)-- Spring解析xml文件,到底从中得到了什么(context命名空间上)
曹工说Spring Boot源码(10)-- Spring解析xml文件,到底从中得到了什么(context:annotation-config 解析)
曹工说Spring Boot源码(11)-- context:component-scan,你真的会用吗(这次来说说它的奇技淫巧)
曹工说Spring Boot源码(12)-- Spring解析xml文件,到底从中得到了什么(context:component-scan完整解析)
曹工说Spring Boot源码(13)-- AspectJ的运行时织入(Load-Time-Weaving),基本内容是讲清楚了(附源码)
曹工说Spring Boot源码(14)-- AspectJ的Load-Time-Weaving的两种实现方式细细讲解,以及怎么和Spring Instrumentation集成
曹工说Spring Boot源码(15)-- Spring从xml文件里到底得到了什么(context:load-time-weaver 完整解析)
曹工说Spring Boot源码(16)-- Spring从xml文件里到底得到了什么(aop:config完整解析【上】)
曹工说Spring Boot源码(17)-- Spring从xml文件里到底得到了什么(aop:config完整解析【中】)
曹工说Spring Boot源码(18)-- Spring AOP源码分析三部曲,终于快讲完了 (aop:config完整解析【下】)
曹工说Spring Boot源码(19)-- Spring 带给我们的工具利器,创建代理不用愁(ProxyFactory)
曹工说Spring Boot源码(20)-- 码网恢恢,疏而不漏,如何记录Spring RedisTemplate每次操作日志
曹工说Spring Boot源码(21)-- 为了让大家理解Spring Aop利器ProxyFactory,我已经拼了
曹工说Spring Boot源码(22)-- 你说我Spring Aop依赖AspectJ,我依赖它什么了
工程代码地址 思维导图地址
工程结构图:
概要spring boot源码系列,离上一篇,快有2周时间了,这两周,本来是打算继续写这个系列的;结果中间脑热,就去实践了一把动态代理,实现了一个mini-dubbo这样一个rpc框架,扩展性还是相当好的,今天看了下spring mvc的设计,思路差不多,都是框架提供默认的组件(比如handlermapping),然后程序里自定义了的话,就覆盖默认组件。
然后,因为mini-dubbo实现过程中的一些其他问题,以及工作上的需要,写了netty实现的http 连接池,这个系列还没讲完,留着后边再补,不然我们的源码系列就耽搁太久了,今天我们还是接着回来弄源码系列。
今天这讲,主题是:给你一个class,怎么读取其上的注解,需要考虑注解的元注解(可以理解注解上的注解)
读取class上的注解 常规做法我们的Class类,就有很多获取annotation的方法,如下:
但是,这个有一个问题是,无法递归获取。
比如,大家使用spring的,都知道,controller这个注解上,是注解了component的。
如果你在一个标注了@controller注解的类的class上,去获取注解,是拿不到Component这一层的。
为啥要拿Component这一层呢?你可以想一下,最开始写spring的作者,是只定义了Component这个注解的,业务逻辑也只能处理Component这个注解;后来呢,又多定义了@controller,@service这几个,但是,难道要把所有业务逻辑的地方都去改一改?很明显,你不会,大佬更不会,直接解析@controller注解,看看它的元注解有没有@component就行了,有的话,直接复用之前的逻辑。
那么,如何进行递归解析呢?
递归解析类上注解--方法1我们要获取的class,长这样:
package org.springframework.test; @CustomController public class TestController { } @Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Controller public @interface CustomController { }