前言:
在本文中,我们将介绍AOP的基本概念、原理和核心组件。我们将探讨AOP的作用、优势以及如何在实际应用中使用AOP来提升软件开发的效率和质量。无论是新手还是资深开发人员,都将受益于对AOP的理解和应用。
希望本文能够帮助读者对AOP有一个全面的认识,并鼓励他们在日常的软件开发中积极运用AOP的思想和技术,为构建高质量的软件系统做出贡献。
目录
前言:
什么是AOP:
AOP案例演示:
AOP应用场景:
AOP的优势:
AOP常见名词概念:
总结:
什么是AOP:
AOP全称为面向切面编程(Aspect-Oriented Programming),是一种软件开发技术和编程范式。它旨在解决横切关注点(Cross-cutting Concerns)的问题,即解决那些散布在应用程序中的通用功能或行为,与核心业务逻辑无关,却影响到多个模块的代码。
在传统的面向对象编程(OOP)中,程序的功能被组织为一个个类,而横切关注点则被分散地插入到这些类的方法中。这样一来,关注点的逻辑散布在整个代码库中,导致代码的可读性、可维护性和复用性下降。
AOP的核心概念是切面(Aspect),切面是对横切关注点的抽象。它包含了影响多个模块的共同行为逻辑,例如日志记录、事务管理、安全性检查等。通过AOP,我们可以将这些横切关注点抽取出来,形成独立的切面,并将其与核心业务逻辑相分离。
假设我们有多个方法,我们要对多个方法进行统计耗时,那么按照我们以前的思路来讲:就是统计时间,最繁琐的方法就是给每一个方法都进行前后时间统计。而我们选择抽象出来一个模板类,使得整体的结构变为:
------------------ 获取方法开启时间 ------------------ 运行原始方法(需要统计耗时的方法) ------------------ 获取方法运行结束时间
我们把获取方法开启时间和获取方法结束时间抽取出来,成为一个模板方法
而面向这样一个或者多个方法,开发针对其内部的通用功能或者行为,就叫做面向切面编程
其实AOP这项技术,和我们之前在JAVASE中学习的动态代理技术非常相似 ,如果大家还是没有理解透彻AOP的核心逻辑,可以看一看动态代理的相关文章,这会对我们理解AOP技术起到很大的帮助。
【从零开始学习JAVA | 第四十五篇】动态代理_我是一盘牛肉的博客-CSDN博客
而动态代理也是面向切面编程最主流的方式 ,而SpringAOP是Spring框架中的高级技术,旨在管理bean对象的过程中,主要通过底层的动态代理机制,对特定的方法进行编程。
AOP案例演示:
我们演示一下在spring boot框架中如何利用AOP完成统计方法用时:
1.引入依赖项 aop:
<!--spring AOP依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.编写代码:
@Slf4j
@Component//交给IOC容器进行管理,成为一个bean对象
@Aspect//表明当前类是一个AOP类
public class TimeAspect {
@Around("execution(* com.example.mybatistest03.service.*.*(..))")//切入点表达式
public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
//1.记录开始时间
long start = System.currentTimeMillis();
//2,调用原始方法运行
Object result = joinPoint.proceed();
//3.记录结束时间,计算方法执行时间
long end = System.currentTimeMillis();
log.info(joinPoint.getSignature() +"方法耗时{}ms",end-start);
return result;
}
}
结果展示:
AOP应用场景:
-
日志记录:日志是在应用程序中记录关键操作和事件的重要方式。使用AOP,您可以在方法执行前后或异常发生时,自动插入日志记录的逻辑,从而获得更详细的应用程序执行日志。这可以帮助跟踪应用程序的执行流程、排查问题和进行性能分析。
-
安全控制:安全是任何应用程序都应该考虑的一个关键方面。通过AOP,可以在敏感操作前插入安全检查的逻辑,例如身份验证、权限验证和数据加密等。这样可以确保只有经过授权的用户才能执行某些操作,提高系统的安全性。
-
事务管理:在需要处理数据库事务的应用程序中,使用AOP可以将事务处理逻辑与核心业务逻辑分离。通过在方法执行前后插入事务管理的逻辑,可以确保数据的一致性和完整性,以及在发生异常时进行数据回滚。
-
缓存管理:在处理频繁读取的数据时,可以使用AOP将缓存管理逻辑与业务逻辑分离。通过在方法执行前检查缓存中是否存在数据,并在缓存中读取数据时绕过实际的业务逻辑,可以提高系统的性能和响应速度。
-
异常处理:异常处理是应用程序开发中重要的一环。使用AOP,可以集中管理异常处理逻辑,而不需要将异常处理代码分散在多个方法中。这样可以提高代码的可读性、可维护性,并降低在处理异常时的代码冗余。
-
性能监控:通过AOP,您可以在方法执行前后或者固定时间间隔内,插入性能监控的逻辑。这可以用来收集方法的执行时间、资源使用情况和其他指标,以帮助分析和优化系统的性能。
这些只是AOP应用场景的一些例子,实际应用中的可能性还很多。AOP的主要目标是通过将横切关注点从核心业务逻辑中提取出来,提高代码的重用性、简洁性和可维护性。具体应用的选择取决于您的需求和系统架构。
AOP的优势:
-
横切关注点的分离:AOP通过将与核心业务逻辑无关的横切关注点(如日志、事务、安全等)从业务代码中分离出来,提高了代码的可读性和可维护性。横切关注点可以独立于核心业务处理,易于理解和修改。
-
代码重用和模块化:AOP允许将横切关注点的代码逻辑封装为可重用的模块。这些模块可以在不同的应用程序和模块中共享,提高了代码的复用性和可维护性。通过简化重复代码的编写,AOP有助于减少开发时间和减少代码冗余。
-
横向功能扩展:AOP使得在应用程序中添加新的功能变得更加容易。通过在不修改现有核心逻辑的情况下,将新的横切关注点插入到代码中,可以灵活地扩展应用的功能。这样可以提高系统的扩展性和灵活性。
-
集中化管理:AOP将横切关注点的逻辑集中到一个地方,可以更好地管理和维护这些关注点。例如,可以使用一个切面来管理日志记录,而不需要将日志记录的代码分散在整个应用程序中。这简化了代码维护和修改的复杂性。
-
提高系统性能:AOP可以帮助优化系统性能。通过将横切关注点独立出来,可以避免在核心业务逻辑中重复执行耗时的操作。例如,将缓存管理逻辑应用于频繁读取的数据,可以提高系统的响应速度和吞吐量。
-
降低耦合性:AOP通过解耦横切关注点和核心业务逻辑,减少了模块间的依赖和耦合性。这使得系统更容易进行单元测试、集成测试和模块替换,提高了代码的可测试性和灵活性。
总的来说,AOP提供了一种有效的方式来管理和处理与核心业务逻辑无关的横切关注点。它通过分离关注点、提高代码的重用性和可维护性、扩展应用功能和提高性能等方面的优点,为软件开发带来了许多好处。
AOP常见名词概念:
1.连接点:
在AOP中,连接点(Join Point)是指在程序执行过程中,能够被插入横切关注点的特定位置。换句话说,连接点是程序执行过程中的一个具体的点或事件。
连接点可以是方法的调用、方法的执行、异常的抛出、字段的访问、对象的创建等。它们代表了在应用程序执行期间可被AOP框架拦截和处理的特定位置。
连接点就是可以被AOP控制的方法
2.通知:
在AOP中,通知(Advice)是指切面在特定的连接点上执行的代码。通知定义了在横切关注点处执行的逻辑,它是AOP中实际操作的部分。(其实就是共性逻辑)
通知就是被抽取出来的重复功能,在示例中就表现为统计方法的耗时
3.切入点:
AOP中,切入点(Pointcut)是指在应用程序中选择特定连接点的表达式。切入点定义了在哪些连接点上将会触发横切关注点的执行。
切入点使用特定的表达式语法来描述需要匹配的连接点。通过定义切入点,我们可以精确地指定在哪些位置或事件上触发切面的逻辑。
切入点表达式可以基于连接点的类型、方法的签名、方法的访问修饰符,甚至是方法的参数等。
切入点就是实际被AOP控制的方法
4.目标对象:
在AOP中,目标对象(Target Object)是指在应用程序中被真正执行和被增强的对象。它是被切面所影响的对象,也是横切关注点所应用的对象。
目标对象通常是应用程序中的一个普通对象,它负责执行核心业务逻辑。切面可以通过拦截目标对象的方法调用,在执行前、执行后或异常抛出时插入额外的逻辑。
目标对象就是此时通知所应用在哪一个对象上,哪一个对象就是目标对象
切入点表达式 + 通知 = 切面
总结:
当谈到AOP(面向切面编程)时,它是一种强大且实用的编程范式,具有许多优点。通过AOP,我们可以将与核心业务逻辑无关的横切关注点(如日志、事务、安全等)从业务代码中分离出来,提高了代码的可读性、可维护性和重用性。
AOP的优点包括横切关注点的分离,使其易于理解和修改。它通过提供代码重用和模块化的机制,减少了开发时间和代码冗余。通过将新的功能作为横切关注点添加到应用程序中,AOP提供了一种灵活扩展应用功能的方式。
如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!