Bläddra i källkod

新增spring aop学习第二章:Spring AOP 基础

seamew 2 år sedan
förälder
incheckning
58401684b2

+ 2 - 1
后端/Spring/SpringFramework/spring.md

@@ -1264,12 +1264,13 @@ AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编
 提供声明式事务;允许用户自定义切面
 
 - 横切关注点:跨越应用程序多个模块的方法或功能。即是,与我们业务逻辑无关的,但是我们需要关注的部分,就是横切关注点。如日志,安全,缓存,事务等等…
-- 切面(ASPECT):横切关注点被模块化的特殊对象。即,它是一个类。
+- 切面(aspect):横切关注点被模块化的特殊对象。即,它是一个类。
 - 通知(Advice):切面必须要完成的工作。即,它是类中的一个方法。
 - 目标(Target):被通知对象。
 - 代理(Proxy):向目标对象应用通知之后创建的对象。
 - 切入点(PointCut):切面通知执行的“地点”的定义。
 - 连接点(JointPoint):与切入点匹配的执行点。
+- 适配器(Advisor):保存 AOP`通知`(Advice)和`决定相对应的通知的过滤器(PointCut)` 
 
  ![image-20220326153800124](assets/image-20220326153800124.png)
 

+ 142 - 0
后端/Spring/spring源码学习/spring aop编程思想/1、spring aop总览.md

@@ -0,0 +1,142 @@
+## 环境信息
+
+### Maven 依赖
+
+```xml
+<dependency>
+    <groupId>org.springframework</groupId>
+    <artifactId>spring-aop</artifactId>
+    <version>5.2.2.RELEASE</version>
+</dependency>
+
+<dependency>
+    <groupId>org.aspectj</groupId>
+    <artifactId>aspectjweaver</artifactId>
+    <version>1.9.6</version>
+</dependency>
+```
+
+## 思维导图
+
+![img](assets/o_210930100537Spring AOP 核心类.png)
+
+## Spring AOP 总览
+
+### AOP 引入
+
+Java OOP 存在哪些局限性?
+
+- 静态化语言:类结构一旦定义,不容易被修改
+- 侵入性扩展:通过继承和组合组织新的类结构
+
+### AOP 常见使用场景
+
+- 日志场景
+- 诊断上下文,如:Log4j 或 Logback 中的 _x0008_MDC
+- 辅助信息,如:方法执行时间
+- 统计场景
+  - 方法调用次数
+  - 执行异常次数
+  - 数据抽样
+  - 数值累加
+- 统计场景
+  - 方法调用次数
+  - 执行异常次数
+  - 数据抽样
+  - 数值累加
+- 性能场景
+  - 缓存,如 Spring Cache
+  - 超时控制
+
+### Java AOP 设计模式
+
+- 代理模式:静态和动态代理
+- 判断模式:类、方法、注解、参数、异常...
+- 拦截模式:前置、后置、返回、异常
+
+#### Java AOP 代理模式(Proxy)
+
+- Java 静态代理
+  - 常用 OOP 继承和组合相结合
+- Java 动态代理
+  - JDK 动态代理
+  - 字节码提升,如 CGLIB
+
+#### Java AOP 判断模式(Predicate)
+
+判断来源
+
+- 类型(Class)
+- 方法(Method)
+- 注解(Annotation)
+- 参数(Parameter)
+- 异常(Exception)
+
+#### Java AOP 拦截器模式(Interceptor)
+
+拦截类型:
+
+- 前置拦截(Before)
+- 后置拦截(After)
+- 异常拦截(Exception)
+
+### Spring AOP 功能概述
+
+核心特性:
+
+- 纯 Java 实现、无编译时特殊处理、不修改和控制 ClassLoader
+- **仅支持方法级别的 Join Points**
+- **非完整 AOP 实现框架**
+- **Spring IoC 容器整合**
+- AspectJ 注解驱动整合(非竞争关系)
+
+### Spring AOP 编程模型
+
+#### 注解驱动
+
+- 实现:Enable 模块驱动,`@EnableAspectJAutoProxy`
+- 注解:
+  - 激活 AspectJ 自动代理:`@EnableAspectJAutoProxy`
+  - Aspect : `@Aspect`
+  - Pointcut :`@Pointcut`
+  - Advice :`@Before` 、`@AfterReturning` 、`@AfterThrowing` 、`@After` 、`@Around`
+  - Introduction :`@DeclareParents`
+
+#### XML 配置驱动
+
+- 实现:Spring Extendable XML Authoring
+- XML 元素
+  - 激活 AspectJ 自动代理:`<aop:aspectj-autoproxy/>`
+  - 配置:`<aop:config/>`
+  - Aspect : `<aop:aspect/>`
+  - Pointcut :`<aop:pointcut/>`
+  - Advice :`<aop:around/>` 、`<aop:before/>` 、`<aop:after-returning/>` 、`<aop:after-throwing/>` 和 `<aop:after/>`
+  - Introduction :`<aop:declare-parents/>`
+  - 代理 Scope : `<aop:scoped-proxy/>`
+
+#### 底层 API
+
+- 实现:JDK 动态代理、CGLIB 以及 AspectJ
+- API:
+  - 代理:`AopProxy`
+  - 配置:`ProxyConfig`
+  - Join Point:`Joinpoint`
+  - Pointcut :`Pointcut`
+  - Advice :`Advice`、`BeforeAdvice`、`AfterAdvice`、`AfterReturningAdvice`、`ThrowsAdvice`
+
+### Spring AOP Advice 类型
+
+Advice 类型:
+
+- 环绕(Around)
+- 前置(Before)
+- 后置(After)
+  - 方法执行
+  - finally 执行
+- 异常(Exception)
+
+### Spring AOP 代理实现
+
+- JDK 动态代理实现 - 基于接口代理
+- CGLIB 动态代理实现 - 基于类代理(字节码提升)
+- AspectJ 适配实现

+ 9 - 0
后端/Spring/spring源码学习/spring aop编程思想/2、spring aop基础.md

@@ -0,0 +1,9 @@
+## Spring AOP 基础
+
+### @AspectJ 注解驱动
+
+- 激活 @AspectJ 模块
+  - 注解激活 - `@EnableAspectJAutoProxy`
+  - XML 配置 - `<aop:aspectj-autoproxy/>`
+- 声明 Aspect
+  - `@Aspect`

BIN
后端/Spring/spring源码学习/spring aop编程思想/assets/o_210930100537Spring AOP 核心类.png


+ 3 - 3
后端/Spring/spring源码学习/spring核心编程思想/20、Spring 应用上下文生命周期.md

@@ -348,16 +348,16 @@
   - session : 每个 HttpSession 内部缓存,生命周期维持在每个用户HTTP会话
   - application : 当前 Servlet 应用内部缓存
 
-#### @Bean 的处理流程是怎样的?
+### @Bean 的处理流程是怎样的?
 
 - 解析范围 - Configuration Class 中的 `@Bean` 方法
 - 方法类型 - 静态 `@Bean` 方法和实例 `@Bean` 方法
 
-#### BeanFactory是如何处理循环依赖的?
+### BeanFactory是如何处理循环依赖的?
 
 - 循环依赖开关(方法)- `AbstractAutowireCapableBeanFactory#setAllowCircularReferences`
 - 单例工程(属性)- `DefaultSingletonBeanRegistry#singletonFactories`
 - 获取早期未处理 Bean (方法)- `AbstractAutowireCapableBeanFactory#getEarlyBeanReference`
 - 早期未处理 Bean (属性)- `DefaultSingletonBeanRegistry#earlySingletonObjects`
 
-#### MyBatis 与 Spring Framework 是如何集成的?
+### MyBatis 与 Spring Framework 是如何集成的?