Spring之AOP理解与应用

1. AOP的认识    

 面向切面编程:基于OOP基础之上新的编程思想,OOP面向的主要对象是类,而AOP面向的主要对象是切面,在处理日志、安全管理、事务管理等方面有非常重要的作用。AOP是Spring中重要的核心点,AOP提供了非常强大的功能,用来对IOC做补充。通俗点说的话就是在程序运行期间,在不修改原有代码的情况下 增强跟主要业务没有关系的公共功能代码到 之前写好的方法中的指定位置 这种编程的方式叫AOP。

        AOP在Spring框架中被用于:

  1. 提供声明式的企业服务。最重要的此类服务是 声明式事务管理。
  2. 让用户实现自定义切面,用AOP补充他们对OOP的使用。 

2. AOP核心概念和术语 

2.1 切面(Aspect)

        指关注点模块化,这个关注点可能会横切多个对象。事务管理是企业级Java应用中有关横切关注点的例子。 在Spring AOP中,切面可以使用通用类基于模式的方式(schema­based approach)或者在普通类中以@Aspect注解(@AspectJ 注解方式)来实现。

2.2  连接点(Join point)

         在程序执行过程中某个特定的点,例如某个方法调用的时间点或者处理异常的时间点。在Spring AOP中,一个连接点总是代表一个方法的执行。

2.3  通知(Advice)

         在切面的某个特定的连接点上执行的动作。通知有多种类型,包括“around”, “before” and “after”等等。通知的类型将在后面的章节进行讨论。 许多AOP框架,包括Spring在内,都是以拦截器做通知模型的,并维护着一个以连接点为中心的拦截器链。

前置通知(Before advice): 在连接点之前运行但无法阻止执行流程进入连接点的通知(除非它引发异常)。

后置返回通知(After returning advice):在连接点正常完成后执行的

通知(例如,当方法没有抛出任何异常并正常返回时)。

后置异常通知(After throwing advice): 在方法抛出异常退出时执行的通知。

后置通知(总会执行)(After (finally) advice): 当连接点退出的时候执行的通知(无论是正常返回还是异常退出)。

环绕通知(Around Advice):环绕连接点的通知,例如方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它可以选择是否继续执行连接点或直接返回自定义的返回值又或抛出异常将执行结束。

2.4 切点(Pointcut)

        匹配连接点的断言。通知和切点表达式相关联,并在满足这个切点的连接点上运行(例如,当执行某个特定名称的方法时)。切点表达式如何和连接点匹配是AOP的核心:Spring默认使用
AspectJ切点语义。

2.5 引入(Introduction)

         声明额外的方法或者某个类型的字段。Spring允许引入新的接口(以及一个对应的实现)到任何被通知的对象上。例如,可以使用引入来使bean实现 IsModified接口, 以便简化缓存机制(在AspectJ社区,引入也被称为内部类型声明(inter))。

2.6 目标对象(Target object)

         被一个或者多个切面所通知的对象。也被称作被通知(advised)对象。既然Spring AOP是通过运行时代理实现的,那么这个对象永远是一个被代理(proxied)的对象。

2.7 AOP代理(AOP proxy)

        AOP框架创建的对象,用来实现切面契约aspect contract)(包括通知方法执行等功能)。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。

2.8 织入(Weaving)

        把切面连接到其它的应用程序类型或者对象上,并创建一个被被通知的对象的过程。这个过程可以在编译时(例如使用AspectJ编译器)、类加载时或运行时中完成。 Spring和其他纯Java AOP框架一样,是在运行时完成织入的。

3. 一图理解AOP核心概念

        本节是个人对照业务需求对AOP的一些概念的解读。

        我们通过一个场景和一张图通俗的理解一下AOP的切面、通知、连接点和切入点这几个概念;

        场景: 我们有一个日志类,有before()、after()、AfterException()、afterReturn()这几个方法,我们需要记录我们的方法的日志,如果不适用AOP,那么我们就得在每个方法的前面、后面、异常调用这个日志类的方法。如果使用AOP呢? 我们如何理解呢?

        理解:

        切面指的是关注点模块化,那么我们抽出来的日志类是不是就可以理解为一个切面呢?

        切面和我们的业务方法连接的点就是连接点

        通知是运行在连接点上的动作,那么抽出来的这个日志类的方法是不是就可以理解为通知呢?

        切点是匹配连接点的断言,那就是说我们指定哪些需要增强的搭连接点就是切点

        

4. AOP的应用场景

  • 日志管理
  • 权限认证
  • 安全检查
  • 事务控制

5. 如何使用AOP

        本节会通过AOP实现日志记录的需求进行演示如何使用AOP;本案例使用的是基于注解使用AOP;

第一步: 配置AOP的依赖

     <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.5</version>
        </dependency>

第二步:开启扫面注解

   <!--扫描包:扫描类中所有注解,不扫描注解不是生效-->
    <context:component-scan base-package="cn.learn.aop" >
    </context:component-scan>

    <!--因为我们使用的是注解方式的AOP,所以要开启注解AOP功能-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

第三步: 编写切面类

@Aspect    // 标记为切面
@Component // 标记Bean组件, 才能切入到ioc当中的bean
public class LogAspect {

    // 可以采用 声明切点的方式 让其他通知引用, 更重用性
    @Pointcut("execution(* cn.myLearnAop.service.impl.*.*(..))")
    public void pointcut(){

    }

    // 前置通知
    @Before("pointcut()")
    public void before(JoinPoint joinPoint, Logger logger){
        // 获取方法名
        String methodName = joinPoint.getSignature().getName();
        // 所有的参数
        Object[] args = joinPoint.getArgs();

        System.out.println(logger.name()+"方法运行,参数是:"+ Arrays.asList(args)+"注解的值是:");
    }

    // 后置通知
    @After("pointcut()")
    public void after(JoinPoint joinPoint){
        // 获取方法名
        String methodName = joinPoint.getSignature().getName();
        // 所有的参数
        Object[] args = joinPoint.getArgs();
        System.out.println(methodName+"方法运行,参数是:"+ Arrays.asList(args));
    }
    // 后置异常通知
    @AfterThrowing(value="pointcut()",
                   throwing="ex")
    public void afterThrowing(Exception ex){
        StringWriter sw = new StringWriter();
        ex.printStackTrace(new PrintWriter(sw, true));
        System.out.println("后置异常通知"+sw.getBuffer().toString());
    }
    // 后置返回通知
    @AfterReturning(value="pointcut()",
                    returning = "returnValue")
    public void afterReturning(Object returnValue){
        System.out.println("返回值:"+returnValue);
    }


    // 环绕
    @Around("pointcut()")
    public  Object arround(ProceedingJoinPoint joinPoint){
        // 获取方法名
        String methodName = joinPoint.getSignature().getName();
        // 所有的参数
        Object[] args = joinPoint.getArgs();

        Object returnValue="";
        try {
            System.out.println("环绕:前置通知:"+methodName+"方法执行,参数:"+Arrays.asList(args));
            returnValue=joinPoint.proceed();
            System.out.println("环绕:后置通知:"+methodName+"方法执行,参数:"+Arrays.asList(args));
        } catch (Throwable throwable) {
            System.out.println("环绕:异常通知:"+throwable);
        }
        finally {
            System.out.println("环绕:返回通知:"+returnValue);
        }

        return returnValue;
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/217062.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云服务器租赁价格表,预算100元到5000元可选配置

阿里云服务器租用费用&#xff0c;阿里云轻量应用服务器2核2G3M带宽轻量服务器一年87元&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;ECS云服务器e系列2核2G配置3M固定带宽99元一年、2核4G配置365元一年、2核8G配置522元一年&#xff0c;阿里云u1服务器2核4G、…

语义分割 DeepLab V1网络学习笔记 (附代码)

论文地址&#xff1a;https://arxiv.org/abs/1412.7062 代码地址&#xff1a;GitHub - TheLegendAli/DeepLab-Context 1.是什么&#xff1f; DeepLab V1是一种基于VGG模型的语义分割模型&#xff0c;它使用了空洞卷积和全连接条件随机&#xff08;CRF&#xff09;来提高分割…

RPG项目01_技能释放

基于“RPG项目01_新输入输出”&#xff0c; 修改脚本文件夹中的SkillBase脚本&#xff1a; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; //回复技能&#xff0c;魔法技能&#xff0c;物理技能…

分布式搜索引擎elasticsearch(二)

1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,一般测试用。例如:match_all 全文检索(full text)查…

d3dx9_43.dll丢失原因以及5个解决方法详解

在电脑使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“d3dx9_43.dll缺失”。这个错误提示通常表示我们的电脑上缺少了DirectX的一个组件&#xff0c;而DirectX是游戏和多媒体应用所必需的软件。本文将介绍d3dx9_43.dll缺失对电脑的影响以及其原因…

【从零开始学习Redis | 第六篇】爆改Setnx实现分布式锁

前言&#xff1a; 在Java后端业务中&#xff0c; 如果我们开启了均衡负载模式&#xff0c;也就是多台服务器处理前端的请求&#xff0c;就会产生一个问题&#xff1a;多台服务器就会有多个JVM&#xff0c;多个JVM就会导致服务器集群下的并发问题。我们在这里提出的解决思路是把…

PHP项目启动记录

PHP项目启动记录 1. 项目整体目录2. bash_profile3. nginx的conf配置4. vim /etc/hosts5. php -v6.修改nginx后重新加载nginx7. npm run watch-app --moduleattendance --platformmobile8. vim ~/.zshrc 1. 项目整体目录 2. bash_profile ~/.bash_profile是Mac系统中的一个配置…

Vue项目目录结构

项目结构 目录说明.vscodeVSCode工具的配置文件node_modulesVue项目的运行依赖文件public资源文件夹&#xff08;浏览器图标&#xff09;src源码文件夹.gitignore配置git忽略文件index.html入口HTML文件package-lock.json信息描述文件&#xff08;所有模块&#xff09;package…

MySQL实现(高可用方案-MHA安装及配置)

MySQL高可用性解决方案Master High Availability (MHA) 是一种在 MySQL 故障转移环境中实现快速故障转移和数据保护的开源软件。MHA 能在 MySQL 主节点发生故障时&#xff0c;自动将备节点提升为主节点&#xff0c;并且不会中断正在进行的 SQL 操作。 需求&#xff1a;主从配置…

编程应用实例,早点快餐店点餐软件支持零售价和会员价,软件定制开发

编程应用实例&#xff0c;早点快餐店点餐软件支持零售价和会员价&#xff0c;软件定制开发 一、编程应用实例&#xff1a; 软件适用范围&#xff1a; 1、早点 2、快餐店 3、面馆 4、汉堡店 5、奶茶店 6、饭店等 程序说明&#xff1a; 二、程序说明&#xff1a; 1、软件…

人机交互——言语信息表示模型

如何将大量的言语碎片进行统一表示和存储&#xff0c;以便能够提取不同类型言语信息中的重要特征和语义信息&#xff0c;并计算和推理用户的交互意图&#xff0c;是一个极具挑战性的问题。 1.言语信息表示模型概述 2.言语信息表示模型结构 3.言语信息表示模型应用

腾讯云2023年双十二活动整理汇总

腾讯云双十二推出了年末感恩回馈活动&#xff0c;年底最后一次大促活动&#xff0c;大家把握好上云时间&#xff0c;小编给大家整理了2023年腾讯云双十二优惠活动&#xff0c;不要错过这次上云好时机&#xff01; 一、腾讯云双十二活动入口 活动地址&#xff1a;txy.ink/act/ …

迪文串口5使用查询方式发送数据

迪文屏串口5寄存器如下 发送数据我采用的不是中断&#xff0c;而是查询发送标志位实现的。 串口5不像串口2一样&#xff08;串口2可以位寻址&#xff0c;串口5不行&#xff09;&#xff0c;所以如果采用查询模式&#xff0c;需要判断寄存器的数据&#xff0c;我的写法比较简单…

【初阶解法-数据结构】包含min函数的栈(代码+图示)

【数据结构】刷题-包含min函数的栈(代码图示)-初阶解法 文章目录 【数据结构】刷题-包含min函数的栈(代码图示)-初阶解法题目提炼题目要求分析题目总结思路代码时间/空间复杂度进阶版 题目 定义栈的数据结构&#xff0c;请在该类型中实现一个能够得到栈中所含最小元素的 min 函…

关于rocketMQ踩坑的那些事

在最近&#xff0c;我所写的这个项目需要使用到rocketMQ&#xff0c;为了图方便我便使用的是Windows版本的&#xff0c;但是在使用的过程中首先是发现无法发送消息出去&#xff0c;报错信息为 org.apache.rocketmq.client.exception.MQClientException: Send [3] times, still …

水果店怎么做微信小程序_利用微信小程序实现业绩逆袭

标题&#xff1a;水果店如何利用微信小程序实现业绩逆袭&#xff1f; 随着移动支付的普及&#xff0c;微信小程序已经成为商业领域的一个重要工具。对于水果店来说&#xff0c;利用微信小程序可以更好地拓展业务、提高客户满意度&#xff0c;进而实现业绩逆袭。本文将为你揭示…

java连接池 理解及解释(DBCP、druid、c3p0、HikariCP)

一、在Java开发中&#xff0c;有许多常见的数据库连接池可供选择。以下是一些常见的Java数据库连接池&#xff1a;不使用数据库连接池的特性&#xff1a; 优点&#xff1a;实现简单 缺点&#xff1a;网络 IO 较多数据库的负载较高响应时间较长及 QPS 较低应用频繁的创建连接和关…

【Linux下如何生成coredump文件】

一&#xff0c;什么是coredump 我们经常听到大家说到程序core掉了&#xff0c;需要定位解决&#xff0c;这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止&#xff0c;并且在满足一定条件下&#xff08;这里为什么说需要满足一定的条件呢&#…

【离散数学】——期末刷题题库(集合)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

成为AI产品经理——模型稳定性评估(PSI)

一、PSI作用 稳定性是指模型性能的稳定程度。 上线前需要进行模型的稳定性评估&#xff0c;是否达到上线标准。 上线后需要进行模型的稳定性的观测&#xff0c;判断模型是否需要迭代。 稳定度指标(population stability index ,PSI)。通过PSI指标&#xff0c;我们可以获得不…