作为spring框架的另外的重点AOP的介绍(详细篇)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 作为spring框架的另外的重点AOP的介绍(详细篇)

一.Aop介绍,以及作用范围,和其专业名词的解释

1.什么是Aop?

Java Spring中的AOP(面向切面编程)是一种编程范式,用于通过将与核心业务逻辑无关的横切关注点(如日志记录、性能统计、安全控制等)与核心业务逻辑进行分离,从而提高代码的可维护性和可重用性。

在Java Spring中,AOP通过切面(Aspect)来定义和管理横切关注点。一个切面是由切点(Pointcut)和通知(Advice)组成的。切点定义了在哪些连接点(Joinpoint)上进行横切,通知定义了在连接点上实际执行的逻辑。

切点定义了在连接点上选择哪些具体的执行点进行横切。它可以通过表达式或注解等方式指定。例如,可以使用表达式语言来选择所有的Service层方法作为切点。

通知定义了在连接点上执行的具体逻辑。在Java Spring中,常见的通知类型包括前置通知(Before)、后置通知(After)、返回通知(After-returning)和异常通知(After-throwing)等。

通过使用AOP,我们可以将与核心业务逻辑无关的横切关注点抽离出来,集中进行管理和维护。这样可以使核心业务逻辑更加清晰,避免代码重复,提高代码的可维护性和可重用性。

在Java Spring框架中,AOP的实现使用了动态代理和元数据两种方式。动态代理可以在运行时动态地生成代理对象,实现对连接点的拦截和处理。元数据则是通过配置文件或注解等方式来定义切面和切点的规则和行为。

其关系图如下

2.Aop中的作用范围,以及实际在企业中的开发背景

2.1作用范围

应用于各种类型的应用程序和业务领域

在实际的企业开发中,AOP常用于大型应用程序和分布式系统中。它可以提供跨模块和跨层的横切功能,帮助解决模块之间的耦合性和复杂性问题。通过将横切关注点的代码抽离到切面中,可以提高代码的可维护性和可重用性,减少重复代码的编写,提高开发效率

2.2在企业开发的作用

1. 事务管理:AOP可以通过在方法调用前后进行事务的开启和提交/回滚,简化了事务管理的代码和配置。它可以将事务管理关注点从业务逻辑中抽离出来,使开发者能够专注于业务逻辑的实现,提高了事务管理的灵活性和可维护性。

2. 安全控制:AOP可以在方法调用前进行权限校验和身份认证,实现安全控制的功能。通过将安全控制的逻辑与业务逻辑分离,可以确保安全控制的一致性和可扩展性。

3. 日志记录:AOP可以在方法调用前后进行日志记录,帮助开发者追踪和调试代码。它可以通过在切面中插入日志记录的逻辑,实现日志记录的统一管理,避免了在多个方法中重复编写日志记录代码的问题。

4. 性能统计:AOP可以监控方法的执行时间和资源消耗,实现性能统计的功能。通过将性能统计的逻辑与业务逻辑分离,可以更好地了解和优化系统的性能。

5. 异常处理:AOP可以在方法调用发生异常时进行异常处理,例如记录日志、发送警报等。它可以集中管理异常处理的逻辑,提高系统的健壮性和可靠性。

企业开发中,AOP通常与其他技术和框架一起使用,例如Spring框架、Hibernate框架、Spring MVC框架等。它可以与这些框架无缝集成,共同实现业务逻辑和非功能性需求的开发

3.Aop 在使用中必有名词

连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或者异常的抛出.

目标(Target):被通知(被代理)的对象

通知(Advice):在某个特定的连接点上执行的动作,同时Advice也是程序代码的具体实现,例如一个实现日志记录的代码(通知有些书上也称为处理)

代理(Proxy):将通知应用到目标对象后创建的对象(代理=目标+通知),请注意:只有代理对象才有AOP功能,而AOP的代码是写在通知的方法里面的

切入点(Pointcut):多个连接点的集合,定义了通知应该应用到那些连接点。

(也将Pointcut理解成一个条件 ,此条件决定了容器在什么情况下将通知和目标组合成代理返回给外部程序)

适配器(Advisor):适配器=通知(Advice)+切入点(Pointcut)

4.spring中Aop的特点

 


二.实际使用场景5大通知(这里小编以书籍管理系统为例)

实例展示

解决的问题:解决了需求的改变,造成了原有没必要改变的代码,需要去改变它;

比如:书籍的增删改,本身只需要完成增删改的功能即可,这是如果需要添加日志功能,那么需要在原有的代码基础上,去修改添加日志功能,受牵连的方法就三个(add/edit/del)了;

实在不能够理解小编举这样一个例子:比如说明星和经纪人! 明星就是目标,给明星找电影拍,经纪人就是通知。经纪人有了安排,明星和经纪人一起就是代理!

1.前置通知

定义:

用于在目标方法执行前执行一些额外的逻辑。具体来说,前置通知会在目标方法执行之前被触发,它可以用来进行一些准备工作、参数校验、日志记录等操作

通过建立一个接口来模拟方法

package com.zking.aop.biz;
public interface IBookBiz {
  // 购书
  public boolean buy(String userName, String bookName, Double price);
  // 发表书评
  public void comment(String userName, String comments);
}

建立接口后实现方法

通过控制台的输出方式模拟购书,

通过控制台的输出方式模拟发表书评

package com.zking.aop.biz.impl;
import com.zking.aop.biz.IBookBiz;
import com.zking.aop.exception.PriceException;
public class BookBizImpl implements IBookBiz {
  public BookBizImpl() {
    super();
  }
  public boolean buy(String userName, String bookName, Double price) {
    // 通过控制台的输出方式模拟购书
    if (null == price || price <= 0) {
      throw new PriceException("book price exception");
    }
    System.out.println(userName + " buy " + bookName + ", spend " + price);
    return true;
  }
  public void comment(String userName, String comments) {
    // 通过控制台的输出方式模拟发表书评
    System.out.println(userName + " say:" + comments);
  }
}

实现前置通知方法

在这里,可以获取到目标类的全路径及方法及方法参数,然后就可以将他们写到日志表里去


package com.zking.aop.advice;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
import java.util.Arrays;
/**
 * 买书、评论前加系统日志
 * @author Administrator
 *
 */
public class MyMethodBeforeAdvice implements MethodBeforeAdvice {
  @Override
  public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
    //在这里,可以获取到目标类的全路径及方法及方法参数,然后就可以将他们写到日志表里去
    String target = arg2.getClass().getName();
    String methodName = arg0.getName();
    String args = Arrays.toString(arg1);
    System.out.println("【前置通知:系统日志】:"+target+"."+methodName+"("+args+")被调用了");
  }
}

打印结果

2.后置通知

定义:

后置通知(After Advice):在一个连接点完成之后(例如,一个方法执行之后)执行的通知。无论连接点是否成功完成,后置通知都会执行。

实现后置通知方法

package com.zking.aop.advice;
import org.springframework.aop.AfterReturningAdvice;
import java.lang.reflect.Method;
import java.util.Arrays;
/**
 * 买书返利
 * @author Administrator
 *
 */
public class MyAfterReturningAdvice implements AfterReturningAdvice {
  @Override
  public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
    String target = arg3.getClass().getName();
    String methodName = arg1.getName();
    String args = Arrays.toString(arg2);
    System.out.println("【后置通知:买书返利】:"+target+"."+methodName+"("+args+")被调用了,"+"该方法被调用后的返回值为:"+arg0);
  }
}

打印结果

3. 环绕通知

定义:

环绕通知(Around Advice):环绕通知围绕在一个连接点的整个调用过程中执行。可以理解h

实现环绕通知方法

package com.zking.aop.advice;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import java.util.Arrays;
/**
 * 环绕通知
 *  包含了前置和后置通知
 * 
 * @author Administrator
 *
 */
public class MyMethodInterceptor implements MethodInterceptor {
  @Override
  public Object invoke(MethodInvocation arg0) throws Throwable {
    String target = arg0.getThis().getClass().getName();
    String methodName = arg0.getMethod().getName();
    String args = Arrays.toString(arg0.getArguments());
    System.out.println("【环绕通知调用前:】:"+target+"."+methodName+"("+args+")被调用了");
//    arg0.proceed()就是目标对象的方法
    Object proceed = arg0.proceed();
    System.out.println("【环绕通知调用后:】:该方法被调用后的返回值为:"+proceed);
    return proceed;
  }
}

打印结果

4.异常通知

定义:

异常通知(After Throwing Advice):在方法抛出异常后执行的通知。可以用于捕获方法抛出的特定异常,并采取相应的处理措施。

 

5.过滤通知

定义:

过滤通知(Before Advice):在一个连接点之前执行的通知。可以在方法执行前做一些准备工作,如参数检查、权限验证等。

 

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
28天前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
48 4
|
1月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
158 1
|
1月前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
38 0
|
17天前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
Spring Aop该如何使用
|
1月前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
50 1
Spring 框架:Java 开发者的春天
|
1月前
|
存储 缓存 Java
Spring高手之路23——AOP触发机制与代理逻辑的执行
本篇文章深入解析了Spring AOP代理的触发机制和执行流程,从源码角度详细讲解了Bean如何被AOP代理,包括代理对象的创建、配置与执行逻辑,帮助读者全面掌握Spring AOP的核心技术。
40 3
Spring高手之路23——AOP触发机制与代理逻辑的执行
|
22天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
30 1
|
24天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
44 2
|
23天前
|
消息中间件 NoSQL Java
springboot整合常用中间件框架案例
该项目是Spring Boot集成整合案例,涵盖多种中间件的使用示例,每个案例项目使用最小依赖,便于直接应用到自己的项目中。包括MyBatis、Redis、MongoDB、MQ、ES等的整合示例。
81 1
下一篇
无影云桌面