文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring系列之AOP的理解和分析

2024-12-03 05:09

关注

今天是五一收假以来的第一天,距离下一周一共还有四天,这周主要是对Spring的重学习。这四天内我将从以下几个角度进行分析和理解。

(1)AOP的理解和分析

(2)IOC的理解和分析

(3)对bean的理解和分析

(4)spring配置文件的理解和分析

首先今天对AOP的理解和分析,对aop的理解也分开阐述,对一个技术的思考,基本上都是从上学时候课本阐述一个新知识的顺序进行的。第一:什么是AOP?

第二:为什么要引入AOP?或者是AOP解决了什么问题?

第三:如何简单的实现AOP?

第四:AOP对我们写代码时候的思考和帮助是什么?

现在,开始对AOP进行阐述,

1 什么是AOP?

1.1 概念介绍

Spring的使命是简化Java代码开发,aop作为Spring的一个子模块,也不例外。

AOP 是 Aspect Oriented Programming(面向切面编程) 的简称,和OOP(面向对象编程)一样是一种编程思想,是对OOP的一种补充。

如何理解什么是AOP呢?以日志为例,在很多管理系统,比如订单系统、推送系统等等都需要把日志记录下来。如果每个业务逻辑里面都写日志的相关代码,那就重复太多了。

干脆把日志的相关逻辑代码,统一封装起来。然后在需要的地方嵌入即可。AOP也主要就是做嵌入这件事的。看下面这张图。

新增订单编辑订单取消订单推送订单日志事务

AOP旨在将横切关注点(crosscutting concern)从业务主体逻辑中进行剥离,实现关注点分离,以提高程序的模块化程度(及业务模块只需关注业务逻辑,无需关注日志、安全、事务等通用逻辑)

上面提到了一些名词,比如说,切面、关注点、横切等,下面对这些名词进行解释。

1.2 名词解释

AOP有自己的一套术语,我们必须了解一下这些行话,才能更好地理解AOP。为了方便大家理解,下面将用课代表收作业作为例子。

通知 (Advice)

定义了在收作业前后需要做的事。常见的通知类型有:before、after、after-returning、around等。

连接点 (JoinPoint)

连接点指程序运行时允许插入切面的一个点,可以是一个函数、一个包路径、一个类、或者抛出的异常。有点类似于可以收作业的时间点。

切点(PointCut)

切点用于定义切面的位置,也就是捕获哪些连接点的调用然后执行"通知"的操作(什么地点)。

切面(Aspect)

切面是切点和通知的聚合,定义了在哪一个切点做什么通知。

目标对象( Target )

指被切面织入的对象。

引入(Introduction)

引入允许我们向现有的类添加新方法或属性。

织入(Weaving)

织入是把切面应用到切点对应的连接点的过程。切面在指定连接点被织入到目标对象中。

具体关系使用图形化表示是:

2 为什么要引入AOP?

上面是定义,引入AOP的原因肯定是可以解决目前开发中存在的某些痛点:

(1)目前的开发当中,相互之间都是模块化开发,使用AOP可以有效的实现模块化的思路。

(2)将辅助逻辑(日志、安全、监控等)从业务主体逻辑中进行剥离,同步进行开发。

AOP是一种思想,这种思想是把一些业务逻辑剥离开,然后按照主业务逻辑进行组合,最后达到想要的功能逻辑。

3 如何简单的实现AOP?

3.1 AOP编程思路

本图是一个简单的思路。

明确需求创建切面类定义切点定义通知思考:要在哪个方法的什么时候做什么事(方法前?方法后?还是around ?)即选择哪个连接点进行执行通知在切点附近(before?after?) 做什么操作

下面定义一个日志的简单案例,实现AOP。使用的是原始的注解方式:

3.2 案例实现AOP

3.2.1 明确需求

在某个方法上加上@FddLog,就会在执行这个方法的前后,自动输出相应的信息。下面以把大象放进冰箱为例子进行演示:

3.2.2 基本接口和实现

  1. public interface ElephentToRe{ 
  2.   public void toRe(); 

实现类如下:

  1. public class ElephentToReImpl implements ElephentToRe{ 
  2.   public void toRe() { 
  3.     System.out.println("把大象放冰箱"); 
  4.   } 

3.2.3 定义切面和通知

  1. public class ElephentToReHelper{ 
  2.     public void beforeElephentToRe(){ 
  3.         System.out.println("把冰箱门打开"); 
  4.     } 
  5.     public void afterElephentToRe(){ 
  6.         System.out.println("把冰箱门关上"); 
  7.     } 

配置就好了

  1. "1.0" encoding="UTF-8"?> 
  2. "http://www.springframework.org/schema/beans" 
  3.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 
  4.   xsi:schemaLocation="http://www.springframework.org/schema/beans 
  5.   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
  6.   http://www.springframework.org/schema/aop 
  7.   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd "> 
  8.   -- 定义通知内容,也就是切入点执行前后需要做的事情 --> 
  9.   "elephentToReHelper" class="com.fdd.bean.ElephentToReHelper"
  10.   -- 定义被代理者 --> 
  11.   "elephentToReImpl" class="com.fdd.bean.ElephentToReImpl"
  12.    
  13.     "elephentToReHelper"
  14.       "beforeElephentToRe" pointcut="execution(* *.toRe(..))" /> 
  15.       after method="afterElephentToRe" pointcut="execution(* *.toRe(..))" /> 
  16.      
  17.    
  18.  

3.2.4 测试看效果

  1. public class Test { 
  2.   public static void main(String[] args){ 
  3.     @SuppressWarnings("resource"
  4.     ApplicationContext appCtx = new FileSystemXmlApplicationContext("application.xml"); 
  5.     ElephentToRe elephentToReImpl = (ElephentToRe)appCtx.getBean("elephentToReImpl"); 
  6.     elephentToReImpl.toRe(); 
  7.   } 

上面的这种方法是通过纯粹的POJO切面来完成的。实现方式也比较简单。

4 我对AOP思想的看法

任何新技术的出现都是为了解决目前开发中存在的某些痛点。对于aop来说,其主要是把一些功能代码进行抽象封装,和主业务逻辑代码进行剥离。在需要的地方进行织入即可。

我的看法是

(1)在平时开发代码的时候,完全可以把一些常见的,常用的功能代码进行封装,尽量做到动态配置。不同的功能模块只需要进行织入即可。

(2)定义业务逻辑的模板,比如说如果要解决某一个业务功能,如果页面类似,可以按照基本的框架进行组合,然后使用配置平台进行可控化配置即可。

本文转载自微信公众号「愚公要移山」,可以通过以下二维码关注。转载本文请联系愚公要移山公众号。

 

来源:愚公要移山内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯