2)SpringAOP代理 实战笔记

AOP

AOP思想的实现一般都是基于 代理模式 ,在JAVA中一般采用JDK动态代理模式,但是我们都知道,JDK动态代理模式只能代理接口而不能代理类。因此,Spring AOP 会这样子来进行切换,因为Spring AOP 同时支持 CGLIB、ASPECTJ、JDK动态代理。

如果目标对象的实现类实现了接口,Spring AOP 将会采用 JDK 动态代理来生成 AOP 代理类;

※静态代理、JDK动态代理、CGLIB动态代理讲解

静态代理

接口类:

真实实体类:

2)SpringAOP代理 实战笔记_第1张图片

代理类:


2)SpringAOP代理 实战笔记_第2张图片

测试方法:


2)SpringAOP代理 实战笔记_第3张图片

结果:

2)SpringAOP代理 实战笔记_第4张图片

动态代理

在讲JDK的动态代理方法之前,不妨先想想如果让你来实现一个可以任意类的任意方法的代理类,该怎么实现?有个很naive的做法,通过反射获得Class和Method,再调用该方法,并且实现一些代理的方法。我尝试了一下,很快就发现问题所在了。于是乎,还是使用JDK的动态代理接口吧。

JDK自带方法

首先介绍一下最核心的一个接口和一个方法:

首先是java.lang.reflect包里的InvocationHandler接口:


我们对于被代理的类的操作都会由该接口中的invoke方法实现,其中的参数的含义分别是:

proxy:被代理的类的实例

method:调用被代理的类的方法

args:该方法需要的参数

使用方法首先是需要实现该接口,并且我们可以在invoke方法中调用被代理类的方法并获得返回值,自然也可以在调用该方法的前后去做一些额外的事情,从而实现动态代理,下面的例子会详细写到。

另外一个很重要的静态方法是java.lang.reflect包中的Proxy类的newProxyInstance方法:


其中的参数含义如下:

loader:被代理的类的类加载器

interfaces:被代理类的接口数组

invocationHandler:就是刚刚介绍的调用处理器类的对象实例

该方法会返回一个被修改过的类的实例,从而可以自由的调用该实例的方法。下面是一个实际例子。

Fruit接口:

Apple实现Fruit接口:


2)SpringAOP代理 实战笔记_第5张图片

代理类Agent.java:


2)SpringAOP代理 实战笔记_第6张图片

测试类:

2)SpringAOP代理 实战笔记_第7张图片

结果:

2)SpringAOP代理 实战笔记_第8张图片

可以看到对于不同的实现类来说,可以用同一个动态代理类来进行代理,实现了“一次编写到处代理”的效果。但是这种方法有个缺点,就是被代理的类一定要是实现了某个接口的,这很大程度限制了本方法的使用场景。下面还有另外一个使用了CGlib增强库的方法。

http://www.cnblogs.com/puyangsky/p/6218925.html

你可能感兴趣的:(2)SpringAOP代理 实战笔记)