在软件开发领域,基于面向对象编程(Object Oriented Programming,OOP)的思想和实践,应用程序被划分为多个类和模块。我们通过引入接口来实现松散耦合的设计,而封装和继承使得我们可以隐藏对象数据并扩展功能。但反过来讲,随着系统的演进,OOP的这些特点也增加了系统的复杂性。为了解决这个问题,我们开始遵循将应用程序划分为不同逻辑层和模块的设计原则,常见的如Web服务层、业务服务层和数据访问层。
但是,即使将功能划分为不同的层,所有层中也可能需要某些通用的功能,例如安全性、日志记录、缓存和性能监视,这些功能被称为横切关注点(Crosscutting Concern)。在OOP中,这些横切关注点的代码与业务逻辑处理代码往往是混合在一起的,图3-1所示就是一个典型的场景。
图3-1 业务代码与横切关注点代码混合示意图
图3-1展示了在业务服务层组件的实现过程中,事务处理和安全控制代码与业务逻辑代码混合在了一起。这样的实现降低了代码的可重用性,增加了维护成本,并且违反了单一责任原则。
那么,如何有效实现这些横切关注点?这就需要引入面向切面编程(Aspect Oriented Programming,AOP)的设计理念。在本章中,我们将讨论Spring容器中AOP的概念以及实现这些概念的方法和实践。