深圳推广公司网站建设书模板,使用的电脑做网站的服务器,全网拓客app,有没有做网站的教程第一章 AOP前奏
1.1 代理模式 代理模式#xff1a;我们需要做一件事情#xff0c;又不期望自己亲力亲为#xff0c;此时#xff0c;可以找一个代理【中介】 我们【目标对象】与中介【代理对象】不能相互转换#xff0c;因为是“兄弟”关系
1.2 为什么需要代理【程序中…第一章 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()实现动态织入效果Overridepublic 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{
// }}Testpublic 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);}