spring之AOP简单介绍

news2024/11/24 20:56:49

1.AOP的概念

        AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程OOP的升华。OOP是纵向对一个 事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,属 性与属性、方法与方法、对象与对象都可以组成一个切面,而用这种思维去设计编程的方式叫做面向切面编程。

 2.基于xml配置的AOP

- xml方式AOP快速入门 通过配置文件的方式去解决上述问题

  •  配置哪些包、哪些类、哪些方法需要被增强
  •  配置目标方法要被哪些通知方法所增强,在目标方法执行之前还是之后执行增强
  • 配置方式的设计、配置文件(注解)的解析工作,Spring已经帮我们封装好了

 2.1xml方式配置AOP的步骤:

1、导入AOP相关坐标;

<dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.19</version>
            <scope>runtime</scope>
        </dependency>

2、准备目标类、准备增强类,并配置给Spring管理;

public interface UserService {

        void show1();

        void show2();

}

public class UserServiceImpl implements UserService {

        public void show1() {

                System.out.println("show1...");

        }

        public void show2() {

                System.out.println("show2...");        

        }

}

public class MyAdvice {

        public void beforeAdvice(){

                 System.out.println("beforeAdvice");

        }

         public void afterAdvice(){

                System.out.println("afterAdvice");

        }

<!--配置目标类,内部的方法是连接点--> ​​​​​​​  

<bean id="userService" class="com.fly.service.Impl.UserServiceImpl"></bean>

<!--配置通知类,内部的方法是增强方法-->
<bean id="myProxy" class="com.fly.proxy.MyAdvice"></bean>

3、配置切点表达式(哪些方法被增强);

4、配置织入(切点被哪些通知方法增强,是前置增强还是后置增强)

<aop:config>

        <!--配置切点表达式,对哪些方法进行增强-->
        <aop:pointcut id="pointcut01" expression="execution(void com.fly.service.Impl.UserServiceImpl.show1())"/>

        <!--切面=切点+通知-->
        <aop:aspect ref="myProxy">

                <--指定前置通知方法是beforeAdvice-->
            <aop:before method="beforeAdvice" pointcut-ref="pointcut01"/>

               < !--指定后置通知方法是afterAdvice-->
            <aop:after-returning method="afterAdvice" pointcut-ref="pointcut01"></aop:after-returning>
        </aop:aspect>
    </aop:config>

2.2XML方式AOP配置详解

XML方式配置AOP还是比较简单的,下面看一下AOP配置的详细细节

  • 切点表达式的配置方式

  • 切点表达式的配置语法

  • 通知的类型

2.2.1切点表达式的配置方式

切点表达式的配置方式有两种,直接将切点表达式配置在通知上,也可以将切点表达式抽取到外面,在通知上进行引用

2.2.2切点表达式的配置语法

切点表达式是配置要对哪些连接点(哪些类的哪些方法)进行通知的增强,语法如下:

execution([访问修饰符] 返回值类型 包名.类名.方法名(参数))

其中:

  • 访问修饰符可以省略不写;

  • 返回值类型,某一级包名,类名,方法名 可以使用*表示任意;

  • 包名与类名之间使用单点.表示该包下的类,使用双点..表示该包及其子包下的类;

  • 参数列表可以使用两个点..表示任意参数

<aop:pointcut id="pointcut01" expression="execution(void com.fly.service..UserServiceImpl.show1())"/> 

表示service包及其子包下面的show1方法。

参数列表两个点表示任意的参数个数

 <aop:pointcut id="pointcut01" expression="execution(void com.fly.service..UserServiceImpl.show1(..))"/>

切点表达式举几个大家容易理解的例子

//表示访问修饰符为public、无返回值、在com.fly.aop包下的TargetImpl类的无参方法show execution(public void com.fly.aop.TargetImpl.show())
//表述com.fly.aop包下的TargetImpl类的任意方法 
execution(* com.fly.aop.TargetImpl.*(..)) 
//表示com.fly.aop包下的任意类的任意方法 
execution(* com.fly.aop.*.*(..)) 
//表示com.fly.aop包及其子包下的任意类的任意方法 
execution(* com.fly.aop..*.*(..)) 
//表示任意包中的任意类的任意方法 execution(* *..*.*(..)) 

2.2.3:通知的类型

AspectJ的通知由以下五种类型

通知名称配置方式执行时机
前置通知<aop:before>目标方法执行之前执行
后置通知<aop:after-returning>目标方法执行之后,目标方法异常时,不在执行
环绕通知<aop:around>目标方法执行前后执行,目标方法异常时,环绕后方法不在执行
异常通知<aop:after-throwing>目标方法抛出异常时执行
最终通知<aop:after>不管目标方法是否有异常,最终都会执行
<?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.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
">

    <!--1:先将相关的两个对象配置到容器中,常规配置-->
    <bean id="userService" class="com.fly.service.impl.UserServiceImpl"/>
    <bean id="myAdvice" class="com.fly.proxy.MyAdvice"/>

    <aop:config>
        <aop:aspect ref="myAdvice">
            <!--1:方法的参数 用两个.来代替  ..只有方法有参数都是用两个点来替代-->
            <!-- <aop:before method="beforeShow" pointcut="execution(int com.fly.service.impl.UserServiceImpl.show4(..))"></aop:before>-->
            <!--2:包名的省略 使用* 当前包下面或者当前包子包下面查找-->
            <aop:before method="beforeShow" pointcut="execution(int com.fly..show4(..))"/>
            <aop:after-returning method="beforeShow" pointcut="execution(int com.fly..show4(..))"/>
           <!--环绕通知-->
            <aop:around method="aroundShow" pointcut="execution(int com..show4(..))"/>
            <!--目标方法出现错误的时候,执行这个方法-->
            <aop:after-throwing method="executionShow" pointcut="execution(int com..show4(..))"/>
            <!--最终通知-->
            <aop:after method="afterAshow" pointcut="execution(int com..show4(..))"/>
        </aop:aspect>
    </aop:config>

</beans>
package com.fly.proxy;

import org.aspectj.lang.ProceedingJoinPoint;

// 代理类
public class MyAdvice {

    // 1:前置通知,目标方法之前执行这个通知
    public void beforeShow() {
        System.out.println("在show方法之前执行");
    }


    //2: 后置通知,目标方法执行之后执行 (目标方法不能出现错误)出错就不走了
    public void afterShow() {

        System.out.println("在show方法之后执行");
    }


    //3:  环绕通知

    public Object aroundShow(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {


        Object[] args = proceedingJoinPoint.getArgs();
        System.out.println(args.length);


        System.out.println("环绕通知之前");

        //show4()
        Object proceed = proceedingJoinPoint.proceed(args);

        System.out.println("环绕通知之后");

        return proceed;


    }


    //4:在目标方法抛出异常的时候执行

    public void exeptionShow(){
        System.out.println("目标方法抛出异常的时候执行");
    }

    //5.最终通知方法
    public void  afterAshow(){
        System.out.println("Good Good");

    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生之深入解析Redis的原理分析与环境部署

一、Redis 简介 ① 什么是 Redis &#xff1f; REmote DIctionary Server&#xff08;Redis&#xff09;是一个由 Salvatore Sanfilippo 写的 key-value 存储系统&#xff0c;是跨平台的非关系型数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可…

Linux —— 基础I/O(一)

目录 一&#xff0c;背景介绍 二&#xff0c;系统接口函数 open 打开或创建文件 close 关闭文件 read 读取文件 write 写入文件 三&#xff0c;文件描述符 结构体指针files 结构体指针files指向的表files_struct 文件结构体 一&#xff0c;背景介绍 狭义的文件存放在…

爆肝整理,接口测试-Fiddler对Jmeter请求抓包(详细实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 使用Fiddler结合J…

编写html页面让谷歌浏览器不弹出“翻译此页”的问题

文章目录 1.问题2.解决总结 1.问题 2.解决 如下图&#xff0c;将html的lang由en改为zh-CN&#xff08;注意大小写&#xff09; 总结 将html的lang由en改为zh-CN

基于PyTorch的图像识别

前言 图像识别是计算机视觉领域的一个重要方向&#xff0c;具有广泛的应用场景&#xff0c;如医学影像诊断、智能驾驶、安防监控等。在本项目中&#xff0c;我们将使用PyTorch来开发一个基于卷积神经网络的图像识别模型&#xff0c;用来识别图像中的物体。下面是要识别的四种物…

Java作业2

1.递归求解汉诺塔问题 拿三个为例子 先从A设法拿走两个盘子到B上&#xff0c;再拿一个盘子到C上&#xff0c;再从B上挪走一个到A&#xff0c;再挪下面的到C上 如果有N个盘子&#xff0c;我们也一样的步骤&#xff0c;先设法拿N-1个盘子到B&#xff0c;再拿最底部的盘子到C&a…

【算法】逆波兰表达式

文章目录 定义求法代码思想&#xff1a; 定义 逆波兰表达式也称为“后缀表达式”&#xff0c;是将运算符写在操作数之后的运算式。 求法 *如&#xff1a;(ab)c-(ab)/e的转换过程&#xff1a; 先加上所有的括号。 (((ab)*c)-((ab)/e))将所有的运算符移到括号外面 (((ab) c)* …

Unity游戏源码分享-全民飞机大战源码unity2019

Unity游戏源码分享-全民飞机大战源码unity2019 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88204008

67 # 对象的处理

上一节学习了 form 数据的处理&#xff0c;这一节学习 Ajax 的方式提交数据 服务端的代码如下 const http require("http"); const url require("url"); const querystring require("querystring");let server http.createServer();server…

定时器

定时器 定时器是什么 定时器也是软件开发中的一个重要组件. 类似于一个 “闹钟”. 达到一个设定的时间之后, 就执行某个指定好的代码. 定时器是一种实际开发中非常常用的组件. 比如网络通信中, 如果对方 500ms 内没有返回数据, 则断开连接尝试重连. 比如一个 Map, 希望里面的…

elasticsearch简单入门语法

基本操作 创建不同的分词器 ik_smart&#xff1a; 极简分词 &#xff1b; ik_max_word: 最细力再度分词 基本的rest命令 methodurl地址描述PUTlocalhost:9200/索引名称/类型名称/文档id创建文档&#xff08;指定文档id&#xff09;POSTlocalhost:9200/索引名称/类型名称创建文…

Qt应用开发(基础篇)——堆栈窗口 QStackedWidget

一、前言 QStackedWidget继承于QFrame&#xff0c;QFrame继承于QWidget&#xff0c;是Qt常用的堆栈窗口部件。 框架类QFrame介绍 QStackedWidget堆栈窗口&#xff0c;根据下标切换&#xff0c;一次显示一个小部件&#xff0c;常用于应用界面切换、图片轮询播放等场景。 二、QSt…

Linu网络服务NFS

linux网络服务NFS 一.NFS简介二.NFS原理三.NFS优势四.配置文件五.NFS共享存储服务的操作步骤 一.NFS简介 NFS&#xff08;网络文件服务&#xff09; NFS是一种基于tcp/ip传输的网络文件系统协议&#xff0c;最初由sun公司开放通过使用NFS协议&#xff0c;客户机可以像访问本地…

Java课题笔记~ ServletContext

单个Servlet的配置对象 web.xml <servlet><servlet-name>FirstServlet</servlet-name><servlet-class>com.ambow.test.FirstServlet</servlet-class><init-param><param-name>charset</param-name><param-value>utf-8&…

SpringMVC注解配置

1xml配置方式&#xff08;配置文件注解的方式&#xff09; 前提导入相关依赖&#xff1a;pom文件 说明&#xff1a;下方依赖是ssm项目中较为常用的一部分&#xff0c;可能部分依赖对于springmvc配置并未有关系&#xff0c;根据自己需求添加和删除。 <dependencies> &l…

新手如何快速学习单片机?

初步确定学习目标&#xff1a;是学习简单便宜的51呢&#xff0c;还是学习简单但是性价比已经不算太高的&#xff0c;但是功能强大稳定可靠的avr&#xff0c;还是物美价廉的stm32&#xff0c;或者ARM9&#xff08;可以跑系统了&#xff09;&#xff0c;再往上x86什么的如果是学8…

成员变量和局部变量的区别

局部变量成员变量 1、定义的位置不一样 在方法的内部&#xff0c;方法申明上&#xff08;形参&#xff09;。 声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量 在方法的外部&#xff0c;直接写在类当中 &#xff08;类中方法外的变量&#xff09; 2、作用范…

opencv 实现手势跟踪并返回位置信息(封装调用)

OpenCV 是一个基于 Apache2.0 许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 需要提前准备opencv 和 mediapipe库 pip --default-timeout5000 install -i https://pypi.tuna.t…

什么是IMAP协议?

IMAP&#xff08;Internet Message Access Protocol&#xff09;是一个应用层协议&#xff0c;用于访问和管理存储在远程服务器上的电子邮件。相比于POP3&#xff0c;IMAP提供了更加丰富的功能&#xff0c;特别适用于需要在多台设备上访问电子邮件的用户。以下是关于IMAP的详细…

支持多用户协同的思维导图TeamMapper

什么是 TeamMapper &#xff1f; TeamMapper 是基于 Mindmapp 开发的用于绘制思维导图的 Web 应用程序。它使得思维导图变得简单&#xff0c;你可以托管并创建您自己的思维导图。与您的团队分享您的思维导图会议并在思维导图上进行协作。 软件特点&#xff1a; 创建&#xff1…