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 条评论
登录 后参与评论

相关文章

来自专栏Android-JessYan

解决Retrofit多BaseUrl及运行时动态改变BaseUrl?

原文地址: http://www.jianshu.com/p/2919bdb8d09a

1053
来自专栏java学习

javaEE面试题题集

1. 简述 Java Server Page 和 Servlet 的联系和区别? 2. jsp有哪些内置对象?作用分别是什么? 3. jsp有哪些动作?作用...

3497
来自专栏Java帮帮-微信公众号-技术文章全总结

Java企业面试——电商项目

dubbo服务开发流程,运行流程?zookeeper注册中心的作用? 使用流程: 第一步:要在系统中使用dubbo应该先搭建一个注册中心,一般推荐使用zooke...

3636
来自专栏子勰随笔

SDK设计心得之接口设计

5619
来自专栏阿杜的世界

Spring AOP的最佳实践一、异常处理二、安全检查三、缓存

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

723
来自专栏web前端教室

前几天有个同学问我,“什么是响应式编程”?另,它和函数式编程有啥区别?

前几天有个同学问我,啥叫响应式编程?当时我正在讲课没顾得上回他。今天晚上仔细写个文章回复他,顺便我自己也学习一下。 响应式编程的英文名,Reactive Pro...

1906
来自专栏瓜大三哥

FSMC与FPGA通信

STM32是ST(意法半导体)公司推出的基于ARM内核Cortex-M3的32位微控制器系列。Cortex-M3内核是为低功耗和价格敏感的应用而专门设计的,具有...

723
来自专栏屈定‘s Blog

设计模式--策略模式的思考

策略模式是一种简单的设计模式,但是其在业务开发中是一种非常有用的设计模式.举个例子,当你的业务需要针对不同的场景(可以简单理解为枚举类),执行不同的策略时那么使...

915
来自专栏IT派

用 Python 实现每秒处理 120 万次 HTTP 请求

用 Python 做到每秒处理上百万次 HTTP 请求,可能吗?也许不能,但直到最近,这已成为现实。

1073
来自专栏架构师之路

1分钟实现“延迟消息”功能

一、缘起 很多时候,业务有“在一段时间之后,完成一个工作任务”的需求。 例如:滴滴打车订单完成后,如果用户一直不评价,48小时后会将自动评价为5星。 一般来说怎...

4636

扫码关注云+社区