Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Spring AOP的最佳实践

Spring AOP的最佳实践

作者头像
三哥
发布于 2018-06-15 07:09:55
发布于 2018-06-15 07:09:55
1.2K0
举报
文章被收录于专栏:java工会java工会

本文为《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 來源:简书

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java工会 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【JAVA篇】------ spring aop
AOP(面向切面编程)是一种通过分离横切关注点(如日志、事务、安全等)来增强程序模块化的编程范式。在Java中,AOP通常通过Spring等框架实现,通过切面将附加功能插入到业务逻辑中,减少代码冗余,提高可维护性。 本文我们主要来介绍AOP:
意疏
2024/12/26
1030
Spring AOP
Spring 提供了两种方式来生成代理对象: JDKProxy 和 Cglib,具体使用哪种方式生成由AopProxyFactory 根据 AdvisedSupport 对象的配置来决定。默认的策略是如果目标类是接口,则使用 JDK 动态代理技术,否则使用 Cglib 来生成代理。
红目香薰
2022/11/29
3030
spring思维导图,让spring更加简单易懂
一:《spring简介》 关于Spring Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE
美的让人心动
2018/06/14
7260
Spring AOP初级——入门及简单应用
  在上一篇《关于日志打印的几点建议以及非最佳实践》的末尾提到了日志打印更为高级的一种方式——利用Spring AOP。在打印日志时,通常都会在业务逻辑代码中插入日志打印的语句,这实际上是和业务无关的代码,这就带来了较强的侵入性编码。较为理想的编码方式,日志和业务代码应该是分离的。   利用Spring AOP就能很好的实现这种业务分离。AOP并不是Spring所特有的,它的全称是Aspect-Oriented Programming(面向切面编程),切面是一种新的模块化机制,用来描述分散在对象、类或函数中
用户1148394
2018/01/09
7140
Spring AOP初级——入门及简单应用
Spring繁华的AOP王国---第五讲之应用案例和扩展
Spring繁华的AOP王国---第五讲之应用案例和扩展 AOP应用案例 异常处理 java中的异常处理 Fault Barrier 安全检查 缓存 小结 扩展篇 嵌套方法拦截失效引出公开代理对象的话题 原因 解决方案 ---- Spring繁华的AOP王国—第一讲 Spring繁华的AOP王国—第二讲 Spring繁华的AOP王国—第三讲 Spring繁华的AOP王国----第四讲 ---- AOP应用案例 异常处理 ---- java中的异常处理 ---- Fault Barrier
大忽悠爱学习
2022/05/10
2090
Spring繁华的AOP王国---第五讲之应用案例和扩展
【spring】AOP简介
AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
全栈程序员站长
2022/08/10
2800
Java异常总结和Spring事务处理异常机制浅析
Thorwable类所有异常和错误的超类,有两个子类Error和Exception,分别表示错误和异常。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常,这两种异常有很大的区别,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。
IT大咖说
2020/02/25
1.3K0
spring框架(2)— 面相切面编程AOP
spring框架(2)— 面相切面编程AOP   AOP(Aspect Oriented Programming),即面向切面编程。   可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理
Mister24
2018/05/14
1.1K0
深入浅出Spring AOP:让你的代码更优雅
在现代Java开发中,Spring框架几乎是无处不在的。作为Spring框架的一部分,Spring AOP(面向切面编程)提供了一种强大且灵活的方式来处理横切关注点,比如日志记录、安全检查、事务管理等。如果你还没有完全掌握Spring AOP,那么这篇文章将带你深入了解它的工作原理和应用场景。
AI码师
2024/05/27
1.2K0
深入浅出Spring AOP:让你的代码更优雅
【SSH快速进阶】——Spring AOP原理及其实现
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/52046439
DannyHoo
2018/09/13
8570
【SSH快速进阶】——Spring AOP原理及其实现
捕获AOP级别的异常并将其传递到Controller层
欢迎来到本篇技术博客,今天我们将讨论如何在一个现代的Java应用中,捕获AOP(面向切面编程)级别的异常,并将这些异常传递到Controller层进行合适的处理。异常处理在构建可靠的应用程序中起着关键作用,而AOP则可以帮助我们更好地管理和组织代码。在这篇文章中,我们将深入研究如何结合AOP和异常处理来构建健壮的应用。
疯狂的KK
2023/09/27
1.1K0
捕获AOP级别的异常并将其传递到Controller层
快速学习-Spring(AOP概述)
横切关注点在程序代码中的具体体现,对应程序执行的某个特定位置。例如:类某个方法调用前、调用后、方法捕获到异常后等。 在应用程序中可以使用横纵两个坐标来定位一个具体的连接点:
cwl_java
2020/02/12
4070
Spring3:AOP
AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代
二十三年蝉
2018/02/28
6290
2019年Spring核心知识点整理,看看你掌握了多少?
如今做Java尤其是web几乎是避免不了和Spring打交道了,但是Spring是这样的大而全,新鲜名词不断产生,学起来给人一种凌乱的感觉,在这里总结一下,理顺头绪。
程序员追风
2019/11/07
7360
2019年Spring核心知识点整理,看看你掌握了多少?
Spring AOP
Spring AOP 面向切面编程,就是剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为“Aspect”,也就是切面。简单来说就是与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少代码量,降低模块间的耦合度,并有利于可操作性和可维护性。
故里
2020/11/25
3620
Java 的 Checked 和 Unchecked Exception
本文作者:王蒙(Matt) http://matt33.com/2016/12/13/java-exception/
大数据真好玩
2019/08/21
6K0
Java 的 Checked 和 Unchecked Exception
什么是AOP面向切面编程?怎么简单理解?
面向切面编程(AOP)通过将横切关注点(cross-cutting concerns)分离出来,提供了一种增强代码模块化和可维护性的方法。
张飞的猪
2024/11/06
1260
什么是AOP面向切面编程?怎么简单理解?
农银一面:Filter、Interceptor、Spring AOP 的执行顺序
在我们的日常开发工作中,Filter(过滤器)、Interceptor(拦截器)和 AOP(面向切面编程)是非常常用的 3 种请求处理技术。在不同的应用场景中,使用它们都可以在不影响主业务逻辑的前提下为系统增加额外的功能。面试官去问这个问题的时候,一般是想考察求职者的技术深度和对框架机制的理解。本篇我们从 3 者的基本概念及使用来分析解答下这道面试题。
程序员皮皮林
2025/02/08
1190
厕读:每日一题,面试无忧
2. 下面关于java.lang.Exception类的说法正确的是() A 继承自Throwable B Serialable CD 不记得,反正不正确 答案:A 解析:Java异常的基类为java.lang.Throwable,java.lang.Error和java.lang.Exception继承 Throwable,RuntimeException和其它的Exception等继承Exception,具体的RuntimeException继承RuntimeException。
ImportSource
2018/04/03
7790
Spring AOP 实践指南
Spring AOP(面向切面编程)是Spring框架的一个关键特性之一。它提供了一种在应用程序中实现横切关注点的方法,这些关注点通常会散布在应用程序的多个模块中,并且与核心业务逻辑存在交叉。
訾博ZiBo
2025/01/06
1180
Spring AOP 实践指南
相关推荐
【JAVA篇】------ spring aop
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档