什么是 AOP?应用场景
@[toc]
---
## 什么是 AOP?
**AOP (Aspect-Oriented Programming,面向切面编程)** 能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
Spring AOP 是基于动态代理的,如果要代理的对象,实现了某个接口,那么 Spring AOP 会使用 **JDK Proxy**,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用 **Cglib** 生成一个被代理对象的子类来作为代理(JDK 和 CGLIB 两种动态代理技术在 Spring 中进行了封装,封装出来的类叫做 `ProxyFactory`,表示是创建代理对象的一个工厂),如下图所示:

简单来说,Spring AOP 在运行时通过动态代理技术对要代理的对象(的方法)进行增强。
## AOP 的应用场景
1. **日志记录**:通过 AOP 可以在方法执行前后或异常抛出时自动记录日志,避免在每个方法中手动编写日志记录代码。可以用于系统的审计、调试和性能监测等。
2. **事务管理**:AOP 可以在方法执行前开启事务,在方法执行后根据执行结果提交或回滚事务。通过 AOP 可以将事务管理逻辑与业务逻辑解耦,提高代码的可维护性和重用性。
3. **安全控制**:AOP 可以在方法执行前进行权限检查,验证用户是否具有执行该方法的权限。通过 AOP 可以集中管理系统的安全控制,减少重复代码的编写。
4. **性能监测**:AOP 可以在方法执行前后计算方法的执行时间,统计方法的调用次数等,用于性能监测和优化。
5. **缓存管理**:AOP 可以在方法执行前检查缓存中是否存在所需数据,如果存在则直接返回缓存数据,避免重复查询数据库。通过 AOP 可以将缓存管理逻辑与业务逻辑解耦,提高系统性能。
6. **异常处理**:AOP 可以统一处理方法中抛出的异常,进行异常日志记录、异常转换或重试等操作。通过 AOP 可以集中处理系统中的异常,减少代码的冗余。
