5.aop jdk动态代理
Posted 一拳超人的逆袭
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5.aop jdk动态代理相关的知识,希望对你有一定的参考价值。
/** * @author wuyimin * @create 2021-05-06-8:56 * @description AOP面向方面/切面编程:在不通过修改源代码的方式添加新的功能 * 权限判断模块配置到副本模块中 * AOP底层原理:动态代理 * 两种代理情况 * 第一种有接口:使用jdk动态代理----proxy类有newProxyInstance方法参数(类加载器,增强方法所在的类,实现接口invocationHandler,创建代理对象,写增强的方法) * 创建接口实现类的代理对象 * 无接口:使用CGLIB动态代理 * 创建当前类子类的代理对象 * * AOP术语: * 1.连接点:所有可以被增强的方法 * 2.切入点:实际中被增强的方法 * 3.通知(增强):实际增强的逻辑部分,通知有多种类型: * 前置 连接点之前执行 * 后置 之后 * 环绕 之前之后 * 异常 异常的时候执行 * 最终 finally不管有没有都执行 * 4.切面:把通知应用到切入点的过程就叫做切面(是一个动作) * * AOP操作:Spring框架一般都是基于AspectJ实现AOP操作 * AspectJ不是Spring组成部分,对立AOP框架,一般把Aspect和Spring一起使用 * AspectJ实现AOP: * 1.xml--》了解 * 2.注解 * * 切入点表达式:知道对哪个类里面的哪个方法进行增强 * 语法结构:execution([权限修饰符][返回类型][类全路径][方法名称]([参数列表])) * 举例一:对com.atguigu.dao.BookDao类里的add进行增强 *表示任意修饰符 返回类型可以省略 * execution(* com.atguigu.dao.BookDao.add(..))参数列表用..来表示 * 对包里所有的方法进行增强 * execution(* com.atguigu.dao.BookDao.*(..)) * 对包里所有类所有方法进行增强 * execution(* com.atguigu.dao.*.*(..)) */
peopledao peopledaoimple
public class PeopleDaoImpl implements PeopleDao { @Override public int add(int a, int b) { return a+b; } @Override public String update(String id) { return id; } }
jdkProxy
public class JDKProxy { public static void main(String[] args) { Class[] interfaces = {PeopleDao.class}; PeopleDaoImpl peopleDao=new PeopleDaoImpl(); //该方法返回指定接口的代理类实例(类加载器,增强方法使用的类的接口,增强的逻辑代码) PeopleDao dao = (PeopleDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new PeopleDaoProxy(peopleDao)); int add=dao.add(1,2); System.out.println(add); } } //创建代理对象代码 class PeopleDaoProxy implements InvocationHandler { Object obj; //有参构造传递 public PeopleDaoProxy(Object obj){ this.obj=obj; } //添加增强的代码,把创建的是谁的代理对象,需要把谁给传递进来 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //方法之前的处理 System.out.println("方法执行之前"+method.getName()+"传递的参数"+ Arrays.toString(args)); //被增强的方法执行 Object res=method.invoke(obj,args); //方法之后的处理 System.out.println("方法执行之后"+obj); return res; } }
结果
方法执行之前add传递的参数[1, 2]
方法执行之后day506AOP.PeopleDaoImpl@5197848c
3
以上是关于5.aop jdk动态代理的主要内容,如果未能解决你的问题,请参考以下文章
Spring 5 AOP 默认改用 CGLIB 了?从现象到源码的深度分析