手写JDK动态代理实现AOP

AOP底层?

AOP(Aspect Oriented Programming,面向切面编程)在 Java 中的实现有多种方式,其中使用 JDK 动态代理和 CGLIB 代理较为常见。

当你的应用程序遵循面向接口编程的原则时,JDK 动态代理是一个自然的选择。如果你的目标对象实现了一个或多个接口,并且你希望在不修改目标对象代码的情况下为其添加额外的功能,如日志记录、性能监测、安全检查等,那么可以使用 JDK 动态代理。

对象如果实现了接口就是用jdk动态代理,否则使用cglib

使用JDK动态代理实现环绕通知

1.Proxy.newProxyInstance()

这个方法的作用就是创建一个类的动态代理对象

三个参数:

复制代码
ClassLoader loader:一个ClassLoader对象,用于定义代理对象的类加载器。通常可以使用目标对象的类加载器,以便代理对象能够访问目标对象所在的类路径。简称类加载器。
复制代码
Class<?>[] interfaces:一个Class对象的数组,表示代理对象要实现的接口列表。通过指定这些接口,确保代理对象可以像实现了这些接口的真实对象一样被使用。
复制代码
InvocationHandler h:一个InvocationHandler对象,它是代理对象的调用处理程序。当在代理对象上调用方法时,这个处理程序会被调用。

重点:InvocationHandler这个对象就是调用代理对象的方法时会执行里面的**invoke()**方法

2.InvocationHandler

因为调用代理对象的方法时会执行里面的invoke方法

因此我们需要实现这个接口去重写里面的方法去实现环绕通知。

这里我们使用OrderHandler实现InvocationHandler重写invoke方法实现环绕通知

java 复制代码
public class OrderHandler implements InvocationHandler {

    private Object object;

    public OrderHandler(Object object){
        this.object = object;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("============环绕通知前:执行一些前置操作==========");
        Object invoke = method.invoke(object, args);
        System.out.println("============环绕通知后:执行一些后置操作==========");
        return invoke;
    }
}
复制代码
method.invoke(object, args):这个方法的作用是在代理对象的方法被调用时,通过反射机制调用被代理对象的相应方法。

3.所有代码

------接口以及实现类

java 复制代码
public interface OrderService{
    void add();
    void get();
    void del();
    void update();
}
java 复制代码
public class OrderServiceImpl implements OrderService{
    @Override
    public void add() {
        System.out.println("添加商品方法add()");
    }

    @Override
    public void get() {
        System.out.println("获取商品方法get()");
    }

    @Override
    public void del() {
        System.out.println("删除商品方法del()");
    }

    @Override
    public void update() {
        System.out.println("更新商品方法update()");
    }
}

------OrderHandler

java 复制代码
public class OrderHandler implements InvocationHandler {

    private Object object;

    public OrderHandler(Object object){
        this.object = object;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("============环绕通知前:执行一些前置操作==========");
        Object invoke = method.invoke(object, args);
        System.out.println("============环绕通知后:执行一些后置操作==========");
        return invoke;
    }
}

------main方法

使用newProxyInstance()方法创建OrderService的动态代理类,参数:类加载器、接口列表、InvocationHandler

java 复制代码
public class main {
    public static void main(String[] args) {
        OrderService orderService = new OrderServiceImpl();
        OrderService proxyInstance =
                (OrderService)Proxy.newProxyInstance(
                orderService.getClass().getClassLoader(),
                orderService.getClass().getInterfaces(),
                new OrderHandler(orderService));
        System.out.println("使用动态代理:");
        proxyInstance.add();
        proxyInstance.del();
    }
}

结果

相关推荐
weixin_3077791313 分钟前
PySpark实现ABC_manage_channel逻辑
开发语言·python·spark
lybugproducer1 小时前
创建型设计模式之:简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式
java·设计模式·建造者模式·简单工厂模式·工厂方法模式·抽象工厂模式·面向对象
??? Meggie1 小时前
【Python】保持Selenium稳定爬取的方法(防检测策略)
开发语言·python·selenium
南客先生1 小时前
马架构的Netty、MQTT、CoAP面试之旅
java·mqtt·面试·netty·coap
Minyy111 小时前
SpringBoot程序的创建以及特点,配置文件,LogBack记录日志,配置过滤器、拦截器、全局异常
xml·java·spring boot·后端·spring·mybatis·logback
百锦再1 小时前
Java与Kotlin在Android开发中的全面对比分析
android·java·google·kotlin·app·效率·趋势
武昌库里写JAVA2 小时前
39.剖析无处不在的数据结构
java·vue.js·spring boot·课程设计·宠物管理
酷爱码3 小时前
如何通过python连接hive,并对里面的表进行增删改查操作
开发语言·hive·python
画个大饼3 小时前
Go语言实战:快速搭建完整的用户认证系统
开发语言·后端·golang
喵先生!4 小时前
C++中的vector和list的区别与适用场景
开发语言·c++