AOP的总结

AOP(面向切面编程)是对OOP的补充,通过‘横切’技术封装公共行为,降低模块间的耦合度,提高可维护性。主要应用于日志记录、事务管理、权限控制等场景。AOP包括切入点(pointcut)、通知(advice)等概念,通知分为前置、后置、返回后和异常后四种类型。在Java中,AOP可通过JDK动态代理或CGlib实现,前者要求目标类实现接口,后者则通过字节码技术创建子类。

AOPAspect Oriented Programming),即面向切面编程,可以说是OOPObject Oriented Programming,面向对象编程)的补充和完善。它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块。

 

 

AOP的作用是把那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。将重复的代码抽取出来(不同的模块),在需要时统一调用,可以不同的模块按不同的顺序调用,解耦。

 

 

 

 

AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理、缓存、对象池管理以及日志记录

AOP术语

pointcut:切入点

advice:通知,是要执行的逻辑,要实现对应的接口并重写其中的方法。分为

beforeadvice

afteradvice,不管切入点流程正常还是异常结束都执行

 

after returning advice,切入点流程正常结束执行

after throwing advice,切入点流程异常结束执行

 

arround advice

 

advisor(通知器):把advicepointcut结合起来,可以定义应该使用哪个advice并在哪个pointcut使用。

 

 

AOPjava上的实现原理?

jdk动态代理,目标类实现了接口

横切前置增强和后置增强在InvocationHandler的实现类中,但是不能把增强直接显式的写入Handler中,不具有可变性。而是把前置增强接口,后置增强接口,被代理对象封装在ProxyFactory中,也叫织入器,把生成ClassLoaderInterfaceInvocationHandler的代码以及Proxy.newProxyInstance的代码都放入织入器中。这样就能在外部创建不同的增强实现类,然后根据不同被代理对象生成不同的ProxyFactory,进而实现既能产生代理效果,也能在代理效果实现前后动态地插入不同的执行逻辑。

CGlib动态字节码增强,目标类没有实现接口

创建Enhencer作为子类

### AOP切面编程总结与最佳实践 #### 1. **AOP的核心概念** AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,用于将横切关注点(Cross-Cutting Concerns),如日志记录、事务管理和安全控制等,从业务逻辑中分离出来。这种设计提高了代码的模块化程度和可维护性[^2]。 以下是AOP的关键术语及其作用: - **Joinpoint(连接点)**: 类中的方法或字段,表示可以在哪些地方插入额外的行为。 - **Pointcut(切入点)**: 定义了一组匹配的连接点集合,通常通过表达式指定。 - **Advice(通知/增强处理)**: 描述在某个特定的连接点处应该采取的动作,分为前置通知(`@Before`)、后置返回通知(`@AfterReturning`)、最终通知(`@After`)、环绕通知(`@Around`)以及异常抛出通知(`@AfterThrowing`)[^3]。 - **Aspect(切面)**: 将切入点和通知结合起来形成的一个实体,代表了一个具体的横切功能。 - **Target Object(目标对象)**: 被代理的对象,也就是需要增强的目标类实例。 #### 2. **AOP的技术实现原理** AOP主要依赖于动态代理机制来完成其功能。Spring框架提供了两种类型的代理支持:基于JDK动态代理和CGLIB字节码生成技术。当目标类实现了接口时,默认会采用JDK动态代理;如果没有实现任何接口,则使用CGLIB代理[^4]。 #### 3. **AOP的应用场景** AOP广泛应用于各种业务需求中,常见的应用场景包括但不限于以下几个方面: - 日志记录:自动捕获操作前后的状态变化并记录下来以便后续分析。 - 性能监控:测量函数运行耗时或者资源占用情况。 - 权限验证:确保只有授权用户才能调用某些敏感服务。 - 缓存管理:减少重复计算开销提升响应速度。 - 统一异常处理:集中定义错误处理器简化开发流程[^1]。 #### 4. **AOP的最佳实践建议** ##### (1)合理选择切入点 为了保持系统的清晰性和扩展性,在定义切入点时应尽可能精确地描述所需的拦截范围,而不是盲目扩大覆盖面积。这不仅有助于降低不必要的性能损耗,还能让未来的维护工作更加轻松高效[^5]。 ##### (2)优先考虑声明式配置而非侵入式编码 利用XML文件或者Java注解的方式来设置切面规则相比直接修改源代码更为灵活便捷。例如,可以通过简单的标签调整就改变行为模式而不必重新编译整个项目结构[^5]。 ##### (3)注意线程安全性问题 由于多个请求可能会共享同一个代理实例,因此编写的通知逻辑必须具备良好的线程隔离特性以防数据污染风险发生。特别是涉及到全局变量存储临时信息的情况下更需谨慎对待。 ##### (4)避免过度滥用AOP 虽然AOP能够很好地解决许多跨领域的问题,但它并不是万能药方。对于那些非常简单直白的任务而言,可能传统的顺序执行方式反而更加直观易懂且效率更高一些。所以应当权衡利弊后再决定是否引入这一层抽象层次[^1]。 ```java // 示例代码展示如何定义一个基本的日志记录切面 import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore() { System.out.println("Method is about to execute..."); } } ``` 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值