AOP底层原理——Spring框架

什么是AOP

1、什么是 AOP
(1)面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
(2)通俗描述:不通过修改源代码方式,在主干功能里面添加新功能
(3)使用登录例子说明 AOP
在这里插入图片描述

AOP底层原理

有两种情况动态代理

  • 有接口的情况使用JDK动态代理
  • 没有接口的情况,使用CGLIB

(1)有接口的情况使用JDK动态代理

创建接口实现类代理对象,增强类的方法
在这里插入图片描述

(2)没有接口情况,使用 CGLIB 动态代理

创建子类的代理对象,增强类的方法
在这里插入图片描述

JDK动态代理的实现

  • Module java.base
  • Package java.lang.reflect
  • Class Proxy 详情请看

在这里插入图片描述

方法有三个参数:
第一参数,类加载器 
第二参数,增强方法所在的类,这个类实现的接口,支持多个接口 
第三参数,实现这个接口 InvocationHandler,创建代理对象,写增强的部分

步骤

(1)创建接口,定义方法
在这里插入图片描述
在这里插入图片描述

(2)创建接口实现类,实现方法
在这里插入图片描述
(3)使用 Proxy 类创建接口代理对象

  • 有参构造方式传入被增强的对象
  • invoke对象增强
    在这里插入图片描述
  • 代码
package com.LinXiaoDe.spring5;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class JDKProxy {
    
    
    public static void main(String[] args) {
    
    
        Class[] interfaces={
    
    UserDao.class};
        //1.类加载器
        //2.增强方法所在的类,这个类实现的接口,支持多个接口
        //3.实现这个接口 InvocationHandler,创建代理对象,写增强的部分
        /*匿名内部类,可以写在内部
        Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                return null;
            }
        });*/
        UserDaoImpl userDao=new UserDaoImpl();
        UserDao dao= (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces,new UserDaoProxy(userDao));
        int res=dao.add(1,2);
        System.out.println("result: "+res);
    }
}
//创建代理对象,实现InvocationHandler,用于增强
class UserDaoProxy implements InvocationHandler {
    
    

    //1.把创建是谁的代理对象,那么把谁传进来
    //有参构造方式传入
    private Object obj;
    public UserDaoProxy(Object obj)
    {
    
    
        this.obj=obj;
    }
    //2.只要对象被创建,那么方法将会被调用
    @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;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44307065/article/details/107320443