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动态代理的主要内容,如果未能解决你的问题,请参考以下文章

JDK 动态代理(原理 + 代码实现)

Spring-AOP基础概念和操作详解

Spring 5 AOP 默认改用 CGLIB 了?从现象到源码的深度分析

jdk动态代理和cglib动态代理底层实现原理超详细解析(jdk动态代理篇)

JDK动态代理CGLIB动态代理

JDK动态代理CGLIB动态代理