AOP详细介绍

简介: AOP(Aspect-Oriented Programming)是一种编程范式,旨在通过将横切逻辑(cross-cutting concerns)从核心业务逻辑中分离出来,以提高代码的可维护性和可重用性。在Java中,AOP可以通过动态代理来实现。

下面我们来深度解析AOP的底层原理,并且带有源码示例。

  1. JDK动态代理实现AOP:JDK动态代理基于接口,要求目标对象实现一个接口。它使用Java的反射机制在运行时动态创建代理对象。JDK动态代理主要涉及以下几个类和接口:
  • InvocationHandler(接口):定义了一个invoke方法,它是实际代理逻辑的入口。
  • Proxy(类):提供了创建代理对象的静态方法,它会生成一个代理类的字节码,并通过反射机制创建代理对象。

下面是一个使用JDK动态代理实现AOP的示例代码:

// 定义一个接口
public interface UserService {
    void save();
}
// 实现接口的目标对象
public class UserServiceImpl implements UserService {
    @Override
    public void save() {
        System.out.println("保存用户信息");
    }
}
// 自定义InvocationHandler
public class MyInvocationHandler implements InvocationHandler {
    private Object target;
    public MyInvocationHandler(Object target) {
        this.target = target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("开始事务");
        Object result = method.invoke(target, args);
        System.out.println("提交事务");
        return result;
    }
}
// 使用JDK动态代理
public class Main {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        MyInvocationHandler invocationHandler = new MyInvocationHandler(userService);
        UserService proxy = (UserService) Proxy.newProxyInstance(
                userService.getClass().getClassLoader(),
                userService.getClass().getInterfaces(),
                invocationHandler);
        proxy.save();
    }
}

在上面的示例中,我们定义了一个UserService接口和一个UserServiceImpl类作为目标对象,然后通过自定义MyInvocationHandler类来实现代理逻辑。在invoke方法中,我们可以添加额外的横切逻辑,比如开始事务和提交事务。

  1. CGLIB动态代理实现AOP:CGLIB(Code Generation Library)是一个基于字节码生成的库,可以代理没有实现接口的类。CGLIB动态代理通过继承的方式来创建代理对象,并重写目标对象的方法。CGLIB动态代理主要涉及以下几个类:
  • MethodInterceptor(接口):定义了一个intercept方法,它是实际代理逻辑的入口。
  • Enhancer(类):提供了创建代理对象的静态方法,它会生成一个代理类的字节码,并通过字节码增强技术创建代理对象。

下面是一个使用CGLIB动态代理实现AOP的示例代码:

// 目标对象
public class UserService {
    public void save() {
        System.out.println("保存用户信息");
    }
}
// 自定义MethodInterceptor
public class MyMethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("开始事务");
        Object result = proxy.invokeSuper(obj, args);
        System.out.println("提交事务");
        return result;
    }
}
// 使用CGLIB动态代理
public class Main {
    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(UserService.class);
        enhancer.setCallback(new MyMethodInterceptor());
        UserService proxy = (UserService) enhancer.create();
        proxy.save();
    }
}

在上面的示例中,我们创建了一个UserService类作为目标对象,然后通过自定义MyMethodInterceptor类来实现代理逻辑。在intercept方法中,我们可以添加额外的横切逻辑,比如开始事务和提交事务。

总结:JDK动态代理和CGLIB动态代理是两种常见的实现AOP的方式。选择使用哪种方式应根据具体需求和场景来决定。如果目标对象实现了接口,可以使用JDK动态代理;如果目标对象没有实现接口,可以使用CGLIB动态代理。

目录
相关文章
|
数据采集 SQL 存储
一种基于Hive的数据质量检核方法
本发明提出了一种数据质量检核方法、装置、设备及可读存储介质,所述方法包括如下步骤:1)根据质量检核需求,对多业务系统数据进行关联建模,生成关联建模结果;2)根据所述关联建模结果,配置数据质量检核规则,获取数据配置结果;3)将所述数据配置结果导入规则解析器,生成检核脚本;4)将所述检核脚本导入脚本执行器,生成检核明细表;5)对所述检核明细表进行汇总统计,生成检核结果报告。本发明通过针对不同的检核要求,将多业务系统数据进行临时关联汇总,初步对待检核数据进行筛选,限定数据范围,可以大大提升质量检核结果的准确性和有效性,以及降低使用和维护成本。
1375 0
一种基于Hive的数据质量检核方法
|
编解码 算法 安全
【总结整理】【路径规划】- 浅谈路径规划算法
# 0 序 本文将从两个大块浅谈一下路径规划算法,第一部分是规划算法本身,第二部分是地图。 ---- howe # 1 前言   移动一个简单的物体(object)看起来很容易,而路径搜索却比较复杂。那为什么涉及到路径搜索就产生麻烦了呢?考虑以下情况: ![image.png](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/
20736 4
【总结整理】【路径规划】- 浅谈路径规划算法
|
SQL 分布式计算 DataWorks
MaxCompute最佳实践:SQL实现一行变多行&多行变一行
本文对Dataworks里一行变多行&多行变一行进行实践,其中多行变一行是对现有实践的一个引用,方便大家查找
|
6月前
|
编解码 JSON 物联网
腾讯开源HunyuanVideo-I2V图生视频模型+LoRA训练脚本,社区部署、推理实战教程来啦!
继阿里的通义万相wan2.1模型之后,腾讯混元又出大招,重磅发布HunyuanVideo-I2V图生视频模型。
753 9
|
8月前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
562 8
|
设计模式 运维 监控
运维一体化平台的能力要素
【6月更文挑战第7天】一体化运维平台的重要性,旨在建立覆盖运维全生命周期的统一平台,提升效率,保障业务连续性,实现数字化运维管理。
|
人工智能 Java Spring
使用 Spring Cloud Alibaba AI 构建 RAG 应用
本文介绍了RAG(Retrieval Augmented Generation)技术,它结合了检索和生成模型以提供更准确的AI响应。示例中,数据集(包含啤酒信息)被加载到Redis矢量数据库,Spring Cloud Alibaba AI Starter用于构建一个Spring项目,演示如何在接收到用户查询时检索相关文档并生成回答。代码示例展示了数据加载到Redis以及RAG应用的工作流程,用户可以通过Web API接口进行交互。
53114 158
|
11月前
|
机器学习/深度学习 数据采集 传感器
使用Python实现深度学习模型:智能极端天气事件预测
使用Python实现深度学习模型:智能极端天气事件预测
799 3
|
机器学习/深度学习 人工智能 TensorFlow
人工智能平台PAI产品使用合集之如何设置DCluster参数
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
SQL 存储 数据库
对象关系映射(Object-Relational Mapping)
【8月更文挑战第17天】
307 2