SpringAOP(1)-spring源码详解(六)
上篇文章说了spring监听器,监听event,先把事件全部存储在多播器,通过publicEvent来触发多播器发送事件,他可以通过代码注解,或者实现接口的方式来实现事件监听,达到解耦和异步的效果。
Aop要实现的是在我们原来的代码基础上进行一些包装,比如在方法执行前,方法抛出异常之后进行拦截处理,又叫增强处理。与前面ioc的一些后置处理器构造方法不同,aop主要是动态代理来实现的。
SpringAop是基于动态代理,当使用接口的时候是jdk动态代理实现,不是则是用cglib来实现。(cglb是通过asm开源框架动态修改底层字节码,修改需要被增强的.class)
Spring主要用到aspect切点解析,注解。
除了上面的@aspct来增强外,还可以通过实现interceptor的方式来做一些增强。
@Aspect,@Before,@after
拿到所有bean定义,是不是标记了@aspect,每个通知都会生成一个advisor。里面有advise
和pointcut。
那倒是所有advisors之后,pointcut然后matches创建动态proxy。
通过@EnableAspectJAutoProxy可以注册一个bean定义。
解析切面的第一步就是在postProcessorBeforeInstiation里。
创建动态代理AbstractAutoProxyCreator里的后置处理器。
判断是否直接跳过,跳过的规则是,判断是不是切面类,通知类,切点类,advice,pointcut,advisor等,如果是,则返回true。
当findCandidateAdvisors找不到的时候,会调用buildAspectJAdvisors方法解析所有的切面。
在这里会循环Object的bean定义,也就是拿到所有beanName,判断是不是aspect切面。
主要通过判断findAnnotation 是否标记aspect注解。
这里有个回调钩子方法,会把pointCut注解的忽略掉,没有则加到methods里面去。
这里会有一个sort排序,为什么排序呢,因为后面会根据责任链调用。
Around,before,after,afterReturning,afterTrowing。
相关文章
- Spring学习笔记(三)——Spring注解开发&spring与Junit整合测试
- Spring Framework 源码学习笔记(三)
- spring cloud eurake server「建议收藏」
- Spring 最常用的 7 大类注解
- Spring | 手把手带你快速上手Spring
- 【04】Spring源码-手写篇-手写AOP实现(下)
- 【07】Spring源码-分析篇-refresh方法
- spring boot整合shiro_Spring框架介绍及使用
- Spring IOC 容器源码分析
- Spring Boot源码学习:自动配置与自定义注解详解
- 一文讲述Spring MVC的执行流程
- Spring监听器-spring源码详解(五)
- Spring - 事件监听机制 源码解析
- Spring源码学习:一篇搞懂@Autowire和@Resource注解的区别
- 【Spring源码】- 02 Spring IoC容器启动之refresh方法
- Spring Boot Actuator集成demo
- rocketmq-spring : 实战与源码解析一网打尽
- Spring Boot 实现扫码登录,这种方式太香了!!
- Spring配置文件的加载工具类详解编程语言
- Spring Aop 源码实现原理分析详解编程语言
- Spring IOC/BeanFactory/ApplicationContext的工作流程/实现原理/初始化/依赖注入源码详解编程语言
- Spring里的aop实现方式和源码分析详解编程语言
- Spring Boot(二十):使用spring-boot-admin对spring-boot服务进行监控详解编程语言
- Spring Boot(十四):spring boot整合shiro-登录认证和权限管理详解编程语言
- Spring Boot(十三):spring boot小技巧详解编程语言
- Spring Boot(十二):spring boot如何测试打包部署详解编程语言
- Spring Boot(五):spring data jpa的使用详解编程语言