spring专题系列之AOP的理解和分析

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 我将从以下几个角度进行分析和理解。(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也主要就是做嵌入这件事的。看下面这张图。

v2-0798aa542331e5ac86a2539f1aa199f1_1440w.jpg新增订单编辑订单取消订单推送订单日志事务


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


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


1.2 名词解释


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


  1. 通知 (Advice)
    定义了在收作业前后需要做的事。常见的通知类型有:before、after、after-returning、around等。
  2. 连接点 (JoinPoint)
    连接点指程序运行时允许插入切面的一个点,可以是一个函数、一个包路径、一个类、或者抛出的异常。有点类似于可以收作业的时间点。
  3. 切点(PointCut)
    切点用于定义切面的位置,也就是捕获哪些连接点的调用然后执行"通知"的操作(什么地点)。
  4. 切面(Aspect)
    切面是切点和通知的聚合,定义了在哪一个切点做什么通知。
  5. 目标对象( Target )
    指被切面织入的对象。
  6. 引入(Introduction)
    引入允许我们向现有的类添加新方法或属性。
  7. 织入(Weaving)
    织入是把切面应用到切点对应的连接点的过程。切面在指定连接点被织入到目标对象中。


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

v2-dceabb97c3704bc27e3aebd20d8ca39a_1440w.jpg

2 为什么要引入AOP?


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


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


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

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


3 如何简单的实现AOP?


3.1 AOP编程思路


本图是一个简单的思路。

v2-9983d3e0361a95355a98d111f9b0d547_1440w.png

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


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


3.2 案例实现AOP


3.2.1 明确需求


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


3.2.2 基本接口和实现


public interface ElephentToRe{
  public void toRe();
}

实现类如下:

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

3.2.3 定义切面和通知

public class ElephentToReHelper{
    public void beforeElephentToRe(){
        System.out.println("把冰箱门打开");
    }
    public void afterElephentToRe(){
        System.out.println("把冰箱门关上");
    }
}

配置就好了

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  http://www.springframework.org/schema/aop
  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
  <!-- 定义通知内容,也就是切入点执行前后需要做的事情 -->
  <bean id="elephentToReHelper" class="com.fdd.bean.ElephentToReHelper"></bean>
  <!-- 定义被代理者 -->
  <bean id="elephentToReImpl" class="com.fdd.bean.ElephentToReImpl"></bean>
  <aop:config>
    <aop:aspect ref="elephentToReHelper">
      <aop:before method="beforeElephentToRe" pointcut="execution(* *.toRe(..))" />
      <aop:after method="afterElephentToRe" pointcut="execution(* *.toRe(..))" />
    </aop:aspect>
  </aop:config>
</beans>

3.2.4 测试看效果

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

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


4 我对AOP思想的看法


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

我的看法是


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


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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
19天前
|
XML Java 数据格式
Spring Core核心类库的功能与应用实践分析
【12月更文挑战第1天】大家好,今天我们来聊聊Spring Core这个强大的核心类库。Spring Core作为Spring框架的基础,提供了控制反转(IOC)和依赖注入(DI)等核心功能,以及企业级功能,如JNDI和定时任务等。通过本文,我们将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring Core,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
43 14
|
1月前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
21天前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
46 5
|
26天前
|
Java 开发者 Spring
深入解析:Spring AOP的底层实现机制
在现代软件开发中,Spring框架的AOP(面向切面编程)功能因其能够有效分离横切关注点(如日志记录、事务管理等)而备受青睐。本文将深入探讨Spring AOP的底层原理,揭示其如何通过动态代理技术实现方法的增强。
53 8
|
26天前
|
Java 开发者 Spring
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
|
26天前
|
XML 监控 安全
深入调查研究Spring AOP
【11月更文挑战第15天】
36 5
|
26天前
|
Java 开发者 Spring
Spring AOP深度解析:探秘动态代理与增强逻辑
Spring框架中的AOP(Aspect-Oriented Programming,面向切面编程)功能为开发者提供了一种强大的工具,用以将横切关注点(如日志、事务管理等)与业务逻辑分离。本文将深入探讨Spring AOP的底层原理,包括动态代理机制和增强逻辑的实现。
39 4
|
2月前
|
存储 缓存 Java
Spring高手之路23——AOP触发机制与代理逻辑的执行
本篇文章深入解析了Spring AOP代理的触发机制和执行流程,从源码角度详细讲解了Bean如何被AOP代理,包括代理对象的创建、配置与执行逻辑,帮助读者全面掌握Spring AOP的核心技术。
48 3
Spring高手之路23——AOP触发机制与代理逻辑的执行
|
1月前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
37 1
|
1月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
39 0
下一篇
DataWorks