Spring Boot学习笔记(十)AOP底层原理(JDK动态代理)以及术语、以及应用(Aspect)

本文详细介绍了Spring Boot中的AOP底层原理,利用JDK动态代理实现,并探讨了AOP的相关术语,包括连接点、切点、通知等。通过具体的代码示例展示了如何使用Aspect注解进行切面编程,包括不同类型的通知(前置、后置、返回、异常、环绕)以及切入点表达式的使用方法。最后,通过一个完整的例子展示了AOP在实际应用中的工作流程。
摘要由CSDN通过智能技术生成

一、底层实现原理(JDK动态代理)

AOP的底层实践是使用了java.lang.reflect.ProxynewProxyInstance方法
在这里插入图片描述
有三个参数:

  • loader:class 加载器,你在某个类下使用Proxy.newProxyInstance,就使用该类的class加载器。
  • interfaces:接口数组
  • h :invocationHandler 即增强方法的处理方式

根据这几个参数,我们开始编写我们的代码。首先是接口,代码如下

public interface UserDao {
   
    public int add(int a, int b);
}

下面是接口的实现类

public class UserDaoImpl implements UserDao {
   
    @Override
    public int add(int a, int b) {
   
        System.out.println("add 方法执行了");
        return a+b;
    }
}

接下来编写我们的主函数。主函数中,我们所调用的类,是由Proxy.newProxyInstance转换而来的的UserDao接口类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class Main {
   
    public static void main(String[] args) {
   
        Class[] interfaces = {
   UserDao.class};
        UserDaoImpl userDaoImpl = new UserDaoImpl();

        //创建接口实现类代理对象
        //此处用UserDao作为返回值的类型,是因为我们传入的interfaces就是UserDao.class
        UserDao dao = (UserDao) Proxy.newProxyInstance(Main.class.getClassLoader(), interfaces, new InvocationHandler() {
   
            //把想要代理的对象传递进来
            private Object object = userDaoImpl;

            //增强的逻辑
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
   

                //方法之前
                System.out.println("方法之前执行 : " + method.getName() + "; 传递的参数:" + Arrays.toString(args) + "; object:" + object);

                //被增强的方法执行,填写要增强的对象、参数
                Object res = method.invoke(object, args);

                //方法之后
                System.out.println("方法之后执行 : " + method.getName() + "; 传递的参数:" + Arrays.toString(args) + "; object:" + object);

                return res;
            }
        });


        int res = dao.add(1, 2);
        System.out.println("这个是res: " + res)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值