小马哥讲 Spring AOP 编程思想
小马哥
《Spring Boot 编程思想》作者、Spring Cloud Alibaba 项目架构师
11271 人已学习
新⼈⾸单¥68
课程目录
已完结/共 114 讲
第一章:Spring AOP总览 (21讲)
时长 04:08
时长 10:58
第三章:Spring AOP API设计与实现 (49讲)
小马哥讲 Spring AOP 编程思想
登录|注册
留言
4
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 36 | @AspectJ后置动作 - 三种After Advice之间的关系?
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 课程介绍
02 | 内容综述
03 | 知识储备:基础、基础,还是基础!
04 | AOP引入:OOP存在哪些局限性?
05 | AOP常见使用场景
06 | AOP概念:Aspect、Join Point和Advice等术语应该如何理解?
07 | Java AOP设计模式:代理、判断和拦截器模式
08 | Java AOP代理模式(Proxy):Java静态代理和动态代理的区别是什么?
09 | Java AOP判断模式(Predicate):如何筛选Join Point?
10 | Java AOP拦截器模式(Interceptor):拦截执行分别代表什么?
11 | Spring AOP 功能概述:核心特性、编程模型和使用限制
12 | Spring AOP编程模型:注解驱动、XML配置驱动和底层API
13 | Spring AOP设计目标:Spring AOP与 AOP框架之间的关系是竞争还是互补?
14 | Spring AOP Advice类型:Spring AOP丰富了哪些AOP Advice呢?
15 | Spring AOP代理实现:为什么Spring Framework选择三种不同AOP实现?
16 | JDK动态代理:为什么Proxy.newProxyInstance会生成新的字节码?
17 | CGLIB动态代理:为什么Java动态代理无法满足AOP的需要?
18 | AspectJ代理代理:为什么Spring推荐AspectJ注解?
19 | AspectJ基础:Aspect、Join Points、Pointcuts和Advice语法和特性
20 | AspectJ注解驱动:注解能完全替代AspectJ语言吗?
21 | 面试题精选
22 | Spring核心基础:《小马哥讲Spring核心编程思想》还记得多少?
23 | @AspectJ注解驱动
24 | 编程方式创建 @AspectJ代理
25 | XML配置驱动 - 创建AOP代理
26 | 标准代理工厂API - ProxyFactory
27 | @AspectJ Pointcut指令与表达式:为什么Spring只能有限支持?
28 | XML配置Pointcut
29 | API实现Pointcut
30 | @AspectJ拦截动作:@Around与@Pointcut有区别吗?
31 | XML配置Around Advice
32 | API实现Around Advice
33 | @AspectJ前置动作:@Before与@Around谁优先级执行?
34 | XML配置Before Advice
35 | API实现Before Advice
36 | @AspectJ后置动作 - 三种After Advice之间的关系?
37 | XML配置三种After Advice
38 | API实现三种After Advice
39 | 自动动态代理
40 | 替换TargetSource
41 | 面试题精选
42 | Spring AOP API整体设计
43 | 接入点接口 - Joinpoint
44 | Joinpoint条件接口 - Pointcut
45 | Pointcut操作 - ComposablePointcut
46 | Pointcut便利实现
47 | Pointcut AspectJ实现 - AspectJExpressionPointcut
48 | Joinpoint执行动作接口 - Advice
49 | Joinpoint Before Advice标准实现
50 | Joinpoint Before Advice AspectJ实现
51 | Joinpoint After Advice标准实现
52 | Joinpoint After Advice AspectJ实现
53 | Advice容器接口 - Advisor
54 | Pointcut与Advice连接器 - PointcutAdvisor
55 | Introduction与Advice连接器 - IntroductionAdvisor
56 | Advisor的Interceptor适配器 - AdvisorAdapter
57 | AdvisorAdapter实现
58 | AOP代理接口 - AopProxy
59 | AopProxy工厂接口与实现
60 | JDK AopProxy实现 - JdkDynamicAopProxy
61 | CGLIB AopProxy实现 - CglibAopProxy
62 | AopProxyFactory配置管理器 - AdvisedSupport
63 | Advisor链工厂接口与实现 - AdvisorChainFactory
64 | 目标对象来源接口与实现 - TargetSource
65 | 代理对象创建基础类 - ProxyCreatorSupport
66 | AdvisedSupport事件监听器 - AdvisedSupportListener
67 | ProxyCreatorSupport标准实现 - ProxyFactory
68 | ProxyCreatorSupport IoC容器实现 - ProxyFactoryBean
69 | ProxyCreatorSupport AspectJ实现 - AspectJProxyFactory
70 | IoC容器自动代理抽象 - AbstractAutoProxyCreator
71 | IoC容器自动代理标准实现
72 | IoC容器自动代理 AspectJ 实现 - AspectJAwareAdvisorAutoProxyCreator
73 | AOP Infrastructure Bean接口 - AopInfrastructureBean
74 | AOP上下文辅助类 - AopContext
75 | 代理工厂工具类 - AopProxyUtils
76 | AOP工具类 - AopUtils
77 | AspectJ Enable模块驱动实现 - @EnableAspectJAutoProxy
78 | AspectJ XML配置驱动实现 - <aop:aspectj-autoproxy/>
79 | AOP配置Schema-based 实现 - <aop:config/>
80 | Aspect Schema-based实现 - <aop:aspect/>
81 | Pointcut Schema-based实现 - <aop:pointcut/>
82 | Around Advice Schema-based实现 - <aop:around/>
83 | Before Advice Schema-based实现 - <aop:before/>
84 | After Advice Schema-based实现 - <aop:after/>
85 | After Returning Advice Schema-based实现 - <aop:after-returning/>
86 | After Throwing Advice Schema-based实现 - <aop:after-throwing/>
87 | Adviser Schema-based实现 - <aop:advisor/>
88 | Introduction Schema-based实现 - <aop:declare-parents/>
89 | 作用域代理Schema-based实现 - <aop:scoped-proxy/>
90 | 面试题精选
91 | 抽象工厂模式(Abstract factory)实现
92 | 构建器模式(Builder)实现
93 | 工厂方法模式(Factory method)实现
94 | 原型模式(Prototype)实现
95 | 单例模式(Singleton)实现
96 | 适配器模式(Adapter)实现
97 | 组合模式(Composite)实现
98 | 装饰器模式(Decorator)实现
99 | 享元模式(Flyweight)实现
100 | 代理模式(Proxy)实现
101 | 模板方法模式(Template Method)实现
102 | 责任链模式(Chain of Responsibility)实现
103 | 观察者模式(Observer)实现
104 | 策略模式(Strategy)实现
105 | 命令模式(Command)实现
106 | 状态模式(State)实现
107 | 面试题精选
108 | Spring AOP在 Spring 事件(Events)
109 | Spring AOP在Spring 事务(Transactions)理论基础
110 | Spring AOP在Spring 事务(Transactions)源码分析
111 | Spring AOP在Spring 缓存(Caching)
112 | Spring AOP在Spring本地调度(Scheduling)
113 | 面试题精选
114 | 结束语
本节摘要
登录 后留言

全部留言(4)

  • 最新
  • 精选
zhs
spring-5.2.7开始,执行顺序有了变化。https://docs.spring.io/spring-framework/docs/5.2.7.RELEASE/spring-framework-reference/core.html#aop-ataspectj-advice-ordering

作者回复: 感谢补充~

2021-04-20
sljoai
老师,请问一下: @AfterReturing与@AfterThrowing不能同时执行嘛?

作者回复: 对于同一个 JoinPoint 方法而言,两者不会同时出现

2021-03-16
J.Smile
马哥,为啥我这里的执行结果是@AfterReturing先于@After呢?😂 @Aspect public class AspectConfiguration { //这里只是个是否匹配的判断,不会有任何的执行动作,所以方法里的打印根本就不会被执行 @Pointcut("execution(public * *(..))") private void anypublicMethod() { System.out.println("@Pointcut at any public method"); } //Join Pint的拦截动作 @Before("anypublicMethod()") private void beforeAnyPublicMethod() { System.out.println("@Before any public method."); } //Join Pint的拦截动作 @Around("anypublicMethod()") private Object aroundAnyPublicMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { System.out.println("@Around any public method."); return proceedingJoinPoint.proceed(); } /** * After注解对应Finally阶段 * * @throws Throwable */ @After("anypublicMethod()") private void finalizedAnyPublicMethod() throws Throwable { System.out.println("@After any public method."); } /** * AfterReturning注解对应方法返回后阶段 * * @throws Throwable */ //Join Pint的拦截动作 @AfterReturning("anypublicMethod()") private void afterReturingAnyPublicMethod() throws Throwable { System.out.println("@AfterReturing any public method."); } /** * AfterThrowing对应异常抛出阶段 * * @throws Throwable */ @AfterThrowing("anypublicMethod()") private void afterThrowingAnyPublicMethod() throws Throwable { System.out.println("@AfterThrowing any public method."); } }

作者回复: 这个可能是由于反射方法数据返回时,不稳定造成的,参考一下 Class#getMethods() 方法的注释

2021-01-16
HashMap
小马哥,为什么我在 @Before 和 @Around 里抛出异常都不会触发@AfterThrowing @Aspect @Order public class AspectConfiguration { @Pointcut("execution(public * *(..))") private void anyPublicMethod() { System.out.println("@Pointcut any public method."); } @Around("anyPublicMethod()") public Object aroundAnyPublicMethod(ProceedingJoinPoint pjp) throws Throwable { System.out.println("@Around any public method"); return pjp.proceed(); } @Before("anyPublicMethod()") public void beforeAnyPublicMethod() throws Throwable { Random random = new Random(); if (random.nextBoolean() || random.nextBoolean()) { throw new RuntimeException("For purpose"); } System.out.println("@Before any public method"); } @After("anyPublicMethod()") public void finalizeAnyPublicMethod() { System.out.println("@After any public method"); } @AfterReturning("anyPublicMethod()") public void afterAnyPublicMethod() { System.out.println("@AfterReturning any public method"); } @AfterThrowing("anyPublicMethod()") public void afterThrowingAnyPublicMethod() { System.out.println("@AfterThrowing any public method"); } }
2021-01-25
1
收起评论