写在前面:
接着记录自己的Spring学习之旅,若看不懂则建议先看前几篇博文,详细代码可在我的Gitee仓库ssm-learning克隆下载学习使用!
为Aspect Oriented Programming首字母缩写,即切面编程,是一种通过预编译方式和运行期动态代理实现程序功能的统一维护技术!是OOP(Object Oriented Programming)的延续,也是函数式编程的一种衍生范型。
1.9.1.2 目的利用AOP可以隔离业务逻辑的各个部分,从而降低业务逻辑各部分之间的耦合度,提高程序的可重用性,同时也大大提高了开发的效率!
1.9.1.3 优势与作用 1.9.1.4 底层实现Spring提供的动态代理实现!运行期间,Spring通过动态代理动态生成代理对象,其执行时进行功能增强介入,再去调用目标对象方法从而实现目标!
1.9.1.5 动态代理技术 1.9.1.5.1 JDK代理(基于接口)目标对象必须要有接口才能使用,生成的代理对象是基于接口的,代理对象拥有目标对象的方法,如图!
目标对象相当于父对象,代理对象相当于子对象,注意不是继承,是动态生成对象!
根据[[#1 2 2 Spring项目搭建 IntelliJ IDEA 2020 1 Ultimate Edition]]搭建一个简单的项目并配置好所缺目录,如图
1.9.2.2 JDK动态代理- 在jdk目录下新建Tearget接口与其实现类并重写方法,如图
- 同样目录下新建类,里面写入前后增强执行方法,如图
- 在pom文件中加入Spring-context资源依赖,此资源依赖中包含其cglib资源包,如图
- 复制JDK包下执行加强类,并新建目标对象target类,如图
在test目录下新建测试类进行测试,代码如下:
public class test {
@Test
public void testJDKProxy()
{
final TargetInterfaceImpl target = new TargetInterfaceImpl();
// 获取增强对象
final EnhanceRunning enhanceRunning = new EnhanceRunning();
// 返回值为动态代理生成的代理对象
TargetInterface targetInterface = (TargetInterface) Proxy.newProxyInstance(
// 目标对象类加载器
target.getClass().getClassLoader(),
// 目标对象相同的接口字节码对象数组
target.getClass().getInterfaces(),
new InvocationHandler() {
// 执行代理对象方法默认都会执行invoke方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 执行前增加
enhanceRunning.before();
// 执行目标方法
method.invoke(target, args);
// 执行后增强
enhanceRunning.after();
return null; }
}
);
// 调用代理对象方法
targetInterface.testMessage();
}
}
结果如图显示则成功!
1.9.2.5 测试Cglib代理代码和测试JDK动态代理相似,但不要求掌握,了解即可如下:
@Test
public void testCglib()
{
// 目标对象
final Target target = new Target();
// 增强对象
final EnhanceRunning enhanceRunning = new EnhanceRunning();
// 创建增强器
Enhancer enhancer = new Enhancer();
// 设置父类(目标)
enhancer.setSuperclass(Target.class);
// 设置回调
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object proxy, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
// 执行前增强
enhanceRunning.before();
// 执行目标方法
Object object = method.invoke(target,objects);
// 执行后增强
enhanceRunning.after();
return object;
}
});
// 生成代理对象
Target proxy = (Target) enhancer.create();
proxy.testMessage();
}
结果如图显示则成功!



