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

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

一、异常处理

1、Java异常处理

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

java exceptions class hierarchy

我们通常将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。基本的处理模式如下图所示:

exception barrier pattern.jpg

对于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操作的支持,非常简单!

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CSDN技术头条

Spring 框架和 Tomcat 容器扩展接口揭秘

在 Spring 框架中,每个应用程序上下文(ApplicationContext)管理着一个 BeanFactory,BeanFactory 主要负责 Bea...

11040
来自专栏Java架构

Java进阶之路——如何从程序员到架构师,从码农到专家Java进阶技术方面

怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作三五年之...

15220
来自专栏Java技术栈

Spring Boot 2.x 新特性总结及迁移指南

这一篇文章主要讲解 Spring Boot 2.x 与 1.5.x 的区别,2.x 主要更新了什么东西,以便对 Spring Boot 2.x 有一个详细的了解...

16720
来自专栏Java架构

2018年7月份,Spring经典面试题和答案

Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标...

13530
来自专栏james大数据架构

spring-boot-starter-actuator /info获取空信息

  用了spring-boot-starter-actuator,在监控页面对应服务中显示空值,下面是正常情况下有的值

19720
来自专栏机器学习人工学weekly

机器学习人工学weekly-2018/6/10

1. MIT脑科学课程视频,虽然跟工程不太一样,但是cognitive science也是很重要

14360
来自专栏pangguoming

SpringMVC工作原理

2、  DispatcherServlet收到请求调用HandlerMapping处理器映射器。

13650
来自专栏IT技术精选文摘

Spring核心——Stereotype组件与Bean扫描

在注解自动装载中介绍了通过注解(Annotation)自动向Bean中注入其他Bean的方法,本篇将介绍通过注解(Annotation)向容器添加Bean的方法...

15740
来自专栏Java技术栈

Spring 获取 request 的几种方法及其线程安全性分析

本文将介绍在Spring MVC开发的Web系统中,获取request对象的几种方法,并讨论其线程安全性。

12340
来自专栏IT技术精选文摘

高性能配置中心 duic - 设计&实现

配置(Configuration)对于技术人员来说应该都不陌生,通常配置都是以 key-value 的形式存在于配置文件当中。例如线程池大小、数据库连接、逻辑开...

16730

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励