11# Spring AOP
22
3+ "横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块, 并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共 同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未 来的可操作性和可维护性。
34
5+ 使用"横切"技术,AOP 把软件系统分为两个部分:** 核心关注点** 和** 横切关注点** 。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。
46
7+ AOP 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
58
9+ AOP 主要应用场景有:
610
11+ - Authentication 权限
12+ - Caching 缓存
13+ - Context passing 内容传递
14+ - Error handling 错误处理
15+ - Lazy loading 懒加载
16+ - Debugging 调试
17+ - logging, tracing, profiling and monitoring 记录跟踪 优化 校准
18+ - Performance optimization 性能优化
19+ - Persistence 持久化
20+ - Resource pooling 资源池
21+ - Synchronization 同步
22+ - Transactions 事务
723
824
925
26+ ## AOP 核心概念
1027
28+ 切面(aspect):类是对物体特征的抽象,切面就是对横切关注点的抽象
1129
30+ 横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
1231
13- ## 两种代理的使用
32+ 连接点(joinpoint):被拦截到的点,因为 Spring 只支持方法类型的连接点,所以在 Spring 中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
1433
15- ** 1.JDK动态代理** ** 2.cglib代理**
34+ 切入点(pointcut):对连接点进行拦截的定义
35+
36+ 通知(advice):所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、 异常、最终、环绕通知五类
37+
38+ 目标对象:代理的目标对象
39+
40+ 织入(weave):将切面应用到目标对象并导致代理对象创建的过程
41+
42+ 引入(introduction):在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法 或字段。
1643
17- 1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
18- 2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
19- 3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
2044
21- 注:JDK动态代理要比cglib代理执行速度快,但性能不如cglib好。所以在选择用哪种代理还是要看具体情况,一般单例模式用cglib比较好,具体原因请自行百度。
2245
23- ### 一 JDK动态代理实现(原理是使用反射机制)
46+
47+
48+ ## AOP 两种代理方式
49+
50+ Spring 提供了两种方式来生成代理对象: ** JDKProxy** 和 ** Cglib** ,具体使用哪种方式生成由 AopProxyFactory 根据 AdvisedSupport 对象的配置来决定。默认的策略是如果目标类是接口, 则使用 JDK 动态代理技术,否则使用 Cglib 来生成代理。
51+
52+ ### JDK 动态接口代理
53+
54+ JDK 动态代理主要涉及到 ` java.lang.reflect ` 包中的两个类:Proxy 和 InvocationHandler。 InvocationHandler 是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编制在一起。Proxy 利用 InvocationHandler 动态创建 一个符合某一接口的实例,生成目标类的代理对象。
55+
56+ 原理是使用反射机制
2457
2558** 首先定义接口,并实现**
2659
@@ -109,11 +142,15 @@ public static void main(String[] args) {
109142
110143
111144
112- ### 二 CGLIB代理
145+ ### CGLib 动态代理
146+
147+ CGLib 全称为 Code Generation Library,是一个强大的高性能,高质量的代码生成类库, 可以在运行期扩展 Java 类与实现 Java 接口,CGLib 封装了 asm,可以再运行期动态生成新 的 class。和 JDK 动态代理相比较:JDK 创建代理有一个限制,就是只能为接口创建代理实例, 而对于没有通过接口定义业务方法的类,则可以通过 CGLib 创建动态代理。
113148
114- 需要导入 cglib-nodep-2.1_3.jar
115149
116- 先说下cglib,CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
150+
151+ 需要导入 cglib-nodep-2.1_3.jar
152+
153+ 先说下cglib,CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
117154
118155** 先定义一个实现类(注意并没有实现接口)**
119156
@@ -128,7 +165,7 @@ public class TestCGLIBServiceImpl {
128165```
129166
130167** 定义cglib代理类,此时导入的包应该是import net.sf.cglib.proxy.\* **
131-
168+
132169
133170``` java
134171import java.lang.reflect.Method ;
@@ -198,6 +235,18 @@ import java.lang.reflect.Method;
198235
199236结果图:
200237
201- ![ img] ( https://images2015.cnblogs.com/blog/825618/201510/825618-20151023134432505-1808034718.png )
238+ ![ ] ( https://images2015.cnblogs.com/blog/825618/201510/825618-20151023134432505-1808034718.png )
239+
240+
241+
242+ ### 写在代理模式之后
243+
244+ 1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
245+ 2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
246+ 3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
247+
248+ 注:JDK 动态代理要比 cglib 代理执行速度快,但性能不如 cglib 好。所以在选择用哪种代理还是要看具体情况,一般单例模式用 cglib 比较好。
249+
250+
202251
203252** 写在后面:spring AOP的两种代理实现代码就写到这,这里只是实现了,如果你要想真正明白,还得熟悉其中原理机制,比如反射机制,newProxyInstance(...),Enhancer()原理,invoke()原理等等。**
0 commit comments