Spring AOP的最佳实践

本文为《Spring揭秘》第11章的阅读笔记,该书对Spring的基本原理进行了深度剖析,是我目前看过的最好的Spring中文资料。

一、异常处理

1、Java异常处理

Java中的异常层次体系如下图所示:

我们通常将Java中的异常类型分为以下两种类型:

  • 通常将java.lang.Errorjava.lang.RuntimeException及其子类称之为unchecked exception。之所以这么称呼,是因为编译器不会对这些类型的异常进行编译期检查。因为一般关心不到java.lang.Error,狭义上来说,将java.lang.RuntimeException暂且称为unchecked exception也可以;
  • java.lang.Exception及其子类,并除去java.lang.RuntimeException分支,统称为checked exception。一旦在方法签名中声明了将会抛出“checked exception”,调用者就必须对这些异常进行处理。

抛开业界对checked exceptionunchecked exception的论战不谈,重点看着两类异常的应用场景:

  • unchecked exception:对应系统中的严重异常情况,这些情况应用程序一般无法恢复,比如数据库挂掉、网络连接中断、服务器崩溃等。所以,unchecked exception异常所提供的信息一般不是为应用程序准备的,而是为系统维护人员准备的。
  • checked exception:通常用于表明系统中的某些罕见的非正常状态。对于一个业务方法来说,使用错误码(Error Code)的时代是通过返回-1之类的数字表明一些非正常状态,并要求调用方对这些非正常状态进行处理,而编译器对checked exception的检查可以进一步加强这种契约关系;通常checked exception是可恢复的,也是意料之中的,它提供的信息是面向应用程序的。

技术文章Effective Java Exception中,作者将unchecked exception对应的情况称之为Fault,而将checked exception对应的情况称之为Contingency,而Fault Barrier要处理的就是unchecked exception。

2、Fault Barrier

对于unchecked exception来说,不管应用抛出何种类型的unchecked exception,最终都需要人进行干预,只要unchecked exception能够提供足够的信息,相应人员就可以进行处理。

当系统中有多个地方可能抛出unchecked exception的时候,在引入Fault Barrier概念之前,我们可能会在每个调用的最顶层,分别添加异常处理逻辑对其进行处理;不过,unchecked exception可做的事情很少,通常就是记录日志、通知相应人员。所以,这些相同的逻辑实现可以归并到一起进行统一处理,对于系统的Fault来说,它实际上就是一种横切关注点(cross-cutting concern)。

因此,我们完全可以实现一个对应Fault处理的Aspect,让其对系统中所有可能的Fault情况进行统一处理,这个Aspect就称之为Fault Barrier。基本的处理模式如下图所示:

对于Spring MVC框架,可以通过继承SimpleMappingExceptionResolver处理RuntimeException及其子类来构建fault barrier。通过覆写resolveException()方法,在使用默认方法路由请求到一个通用的错误页面之前,你可以添加自定义的异常处理;对于3.x之后的版本,可以直接使用@ExceptionHandler注解,完成全局异常处理功能。具体细节可以参考Spring MVC Exception Handling Example这篇文章。

二、安全检查

javax.servlet.Filter是Servlet规范为我们提供的一种AOP支持,通过它,我们可以为基于Servlet的Web应用添加对应的资源访问控制。基于Filter的Web应用的资源访问控制,仅仅是特定领域的安全检查需求,而通过AOP,我们可以为任何类型的应用添加安全支持。

安全检查属于系统的一种横切关注点,按照原先的方法进行系统开发,势必让这些安全检查逻辑散落到系统各处,处理安全检查的最好方法就是AOP。在Spring社区,已经有成熟的安全框架供开发者使用,那就是Spring Security。

Spring Security是一套框架,专注于为Java应用提供验证和授权功能。跟大多数Spring项目类似,Spring Security的威力在于它具备良好的可拓展性,用于满足各种定制的需求。Spring Security具备如下特性:

  • 针对验证(Authentication)和授权(Authentication)的全面和扩展支持;
  • 防止session fixation、点击劫持(clickjacking)和交叉站点请求伪装(cross site request forgery)等各种攻击;
  • 集成Servlet API;
  • 可以与Spring Web MVC集成

三、缓存

AOP应用的另一个主要业务场景是为系统透明地增加缓存支持。缓存可以在很大程度上提升系统的性能,但它不是业务需求,而是系统需求

为了避免需要添加的缓存实现逻辑影响业务逻辑的实现,我们可以让缓存的实现独立于业务对象的实现之外,将系统中的缓存需求通过AOP的Aspect封装。

官网上的这篇文章:Caching Data with Spring,讲述了Spring Boot中提供的对Cache操作的支持,非常简单!

作者:杜琪 链接:https://www.jianshu.com/p/fe611f09c070 來源:简书

原文发布于微信公众号 - java工会(javagonghui)

原文发表时间:2018-05-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏LeoXu的博客

Tapestry 教程(一) 原

这篇教程帮助人们来创建基于 Tapestry 的 web 应用程序。你是否有过使用 Tapestry 早期版本或者其它 web 框架的经历,这一点并不重要。事实...

1613
来自专栏ThoughtWorks

Keycloak单点登录平台|技术雷达

Keycloak首次在ThoughtWorks技术雷达第16期中以“评估”的状态出现。 技术雷达15期正式提出“安全是每一个人的问题”,同时也对Docker和微...

6833
来自专栏一个会写诗的程序员的博客

第1章 Spring Boot史前简述小结参考资料

大约20年前,程序员们使用“企业级Java Bean”(EJB)开发企业应用,需要配置复杂的XML。

1274
来自专栏纯洁的微笑

springcloud(二):注册中心Eureka

Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。也是sp...

4137
来自专栏乐沙弥的世界

配置Linux 11G R2 RAC NTP服务

    安装Oracle 11g RAC时,我们需要配置ntp服务。在使用虚拟机的情况下对于时钟同步方式的配置有很多种方式,可以使用vmware自带的时钟同步功...

1456
来自专栏张善友的专栏

REST 入门介绍

dudu的 HttpClient + ASP.NET Web API, WCF之外的另一个选择 讨论的人很多,说明RESTful API也开始在.NET 社区中...

2278
来自专栏我就是马云飞

Gradle 提速:每天为你省下一杯喝咖啡的时间

作为一名 Android 开发同学,当你的工程和代码达到一定规模的时候,相信你一定遇到过编译速度过慢的问题。比如:

1363
来自专栏Java面试笔试题

选择使用Spring框架的原因(Spring框架为企业级开发带来的好处有哪些)?

2393
来自专栏IT笔记

Grafana+Prometheus系统监控之webhook

概述 Webhook是一个API概念,并且变得越来越流行。我们能用事件描述的事物越多,webhook的作用范围也就越大。Webhook作为一个轻量的事件处理应用...

7163
来自专栏AndroidTv

Gradle 系列博客梳理系列博客博客概要后记

1954

扫码关注云+社区

领取腾讯云代金券