主页 > 软件开发  > 

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC)-Spring的AOP

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC)-Spring的AOP
第一章 AOP前奏 1.1 代理模式

代理模式:我们需要做一件事情,又不期望自己亲力亲为,此时,可以找一个代理【中介】

我们【目标对象】与中介【代理对象】不能相互转换,因为是“兄弟”关系

1.2 为什么需要代理【程序中】

需求:实现【加减乘除】计算器类

在加减乘除方法中,添加日志功能【在计算之前,记录日志。在计算之后,显示结果。】

实现后发现问题如下

日志代码比较分散,可以提取日志类日志代码比较混乱,日志代码【非核心业务代码】与加减乘除方法【核心业务代码】书写一处

总结:在核心业务代码中,需要添加日志功能,但不期望在核心业务代码中书写日志代码。

此时:使用代理模式解决问题【先将日志代码横向提取到日志类中,再动态织入回到业务代码中】 1.3 手动实现动态代理环境搭建

实现方式

基于接口实现动态代理: JDK动态代理基于继承实现动态代理: Cglib、Javassist动态代理

实现动态代理关键步骤

一个类:Proxy 概述:Proxy代理类的基类【类似Object】作用:newProxyInstance():创建代理对象 一个接口:InvocationHandler 概述:实现【动态织入效果】关键接口作用:invoke(),执行invoke()实现动态织入效果 1.4 手动实现动态代理关键步骤

注意:代理对象与实现类【目标对象】是“兄弟”关系,不能相互转换

创建类【为了实现创建代理对象工具类】提供属性【目标对象:实现类】提供方法【创建代理对象】提供有参构造器【避免目标对为空】 package com.atguigu.beforeaop; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * @author Chunsheng Zhang 尚硅谷 * @create 2022/3/28 16:22 */ public class MyProxy { /** * 目标对象【目标客户】 */ private Object target; public MyProxy(Object target){ this.target = target; } /** * 获取目标对象的,代理对象 * @return */ public Object getProxyObject(){ Object proxyObj = null; /** 类加载器【ClassLoader loader】,目标对象类加载器 目标对象实现接口:Class<?>[] interfaces,目标对象实现所有接口 InvocationHandler h */ ClassLoader classLoader = target.getClass().getClassLoader(); Class<?>[] interfaces = target.getClass().getInterfaces(); //创建代理对象 proxyObj = Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() { //执行invoke()实现动态织入效果 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //获取方法名【目标对象】 String methodName = method.getName(); //执行目标方法之前,添加日志 MyLogging.beforeMethod(methodName,args); //触发目标对象目标方法 Object rs = method.invoke(target, args); //执行目标方法之后,添加日志 MyLogging.afterMethod(methodName,rs); return rs; } }); return proxyObj; } // class invocationImpl implements InvocationHandler{ // } } @Test public void testBeforeAop(){ // int add = calc.add(1, 2); // System.out.println("add = " + add); //目标对象 Calc calc = new CalcImpl(); //代理工具类 MyProxy myProxy = new MyProxy(calc); //获取代理对象 Calc calcProxy = (Calc)myProxy.getProxyObject(); //测试 // int add = calcProxy.add(1, 2); int div = calcProxy.div(2, 1); }
标签:

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC)-Spring的AOP由讯客互联软件开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC)-Spring的AOP