AOP總結

面向切面编程,把散落在程序中的公共部分提取出来,做成切面类,这样的好处在于,代码的可重用,一旦涉及到该功能的需求发生变化,只要修改该代码就行,否则,你要到处修改,如果只要修改1、2处那还可以接受,万一有1000处呢。
AOP底层的东西就是JDK动态代理和CGLIB代理,说白了就是增强类的功能。
最常用的AOP应用在数据库连接以及事务处理上。如spring的声明式事务。
原理:反射机制
常用模式:代理模式,工厂模式
AOP通知的类型有:前通知,后通知,环绕通知,异常通知。
触法点,也就是我们对应相应的业务写的方法,这些方法需要开启和关闭事务,我们把需要处理的方法叫做触法点。
代理有很多,据说是5中,但常用的只是jdk 的动态代理和CGLIB代理
jdk的代理分为静态代理和动态代理,静态代理用的很少,一般都是动态代理,

CGLIB代理是生成的目标类的子类,所以类和方法不能声明为final的,要不然就会有问题
jdk的代理是必须要实现接口的,而CGLIB不是,但必须要引入jar包,spring中默认使用jdk 的动态代理(实现接口了),除强制设置CGLIB的代理

常用两种代理模式:
JDK动态Proxy用于对接口的代理,是动态产生一个实现指定接口的类。被代理的类必须实现制定的接口。
CGLIB用于对类的代理,是动态产生一个继承被代理类的类。对于没有继承接口的类,通过继承运用其子类来实现。
### 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..."); } } ``` 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值