1.引言
面向方面的编程的主要目标是将跨领域的关注点分离。 当我们谈论跨领域的关注时,我们指的是在我们的系统或应用程序中的多个地方使用的通用功能。 这些概念包括:
- 记录中
- 交易管理
- 错误处理
- 监控方式
- 安全
实现这种分离的方法是将这些概念模块化。 这将使我们保持业务逻辑类整洁,仅包含设计该类的代码。 如果我们不对这些问题进行模块化,则将导致代码纠结(该类包含不同的问题)和代码分散(相同的问题将散布在整个系统中)。
在此示例中,我们有一个Spring MVC应用程序,该应用程序访问所请求的数据(客户和订单)并显示一个包含其信息的页面。 我们可以看一下不同的层:
在上图中,我们可以理解,功能分散在不同的类中(在每个服务中实现监视),并且某些类包含不同的关注点(例如,ClientController类包含日志记录和异常处理)。 为了解决这个问题,我们将写一些方面来实现我们的跨领域关注点。 目标是实现以下模型:
每个类仅包含与业务逻辑相关的代码,而各方面将负责拦截代码,以注入跨领域的关注点。
让我们看一个例子。
- 源代码可以在github上找到。
2.检查控制器代码
ClientController:
@Controller
public class ClientController {
@Autowired
private ClientService clientService;
private static Logger mainLogger = LoggerFactory.getLogger("generic");
private static Logger errorLogger = LoggerFactory.getLogger("errors");
@RequestMapping("/getClients")
public String getClients(Model model, @RequestParam("id") int id) {
mainLogger.debug("Executing getClients request");
try {
Client client = clientService.getClient(id);
model.addAttri