首页 > 其他分享 >Sping的AOP基本教程(使用注解方式)

Sping的AOP基本教程(使用注解方式)

时间:2024-01-24 15:37:23浏览次数:31  
标签:教程 通知 Sping add evan User AOP com public

说明:使用注解方式实现AOP切面。

什么是AOP?

  • 面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
  • 通俗描述:不通过修改源代码方式,在主干功能里面添加新功能。
  • AOP底层使用动态代理。

AOP术语

  1. 连接点
    类里面哪些方法可以被增强,这些方法称为连接点。

  2. 切入点
    实际被真正增强的方法,称为切入点。

  3. 通知(增强)
    实际增强的逻辑部分称为通知。
    多种类型通知:

    • 前置通知
    • 后置通知
    • 环绕通知
    • 异常通知
    • 最终通知
  4. 切面
    是个动作,把通知应用到切入点的过程。

AOP案例实操

  • AOP 相关依赖
    image
  • 切入点表达式
    切入点表达式作用:知道对哪个类里面的哪个方法进行增强。
    语法结构:
execution([权限修饰符] [返回类型] [类全路径] [方法名称]([参数列表]) )

举例 1:对 com.evan.dao.BookDao 类里面的 add 进行增强 
execution(* com.evan.dao.BookDao.add(..)) 
举例 2:对 com.evan.dao.BookDao 类里面的所有的方法进行增强 
execution(* com.evan.dao.BookDao.* (..))
举例 3:对 com.evan.dao 包里面所有类,类里面所有方法进行增强 
execution(* com.evan.dao.*.* (..))

1、创建User类

public class User {

    public void add() {
        System.out.println("add..");
    }
}

2、创建UserProxy增强类

@Component  //创建该类对象加入到spring容器中
@Aspect  //生成代理类对象
@Order(1) //增强类优先级
public class UserProxy {

   //前置通知:在被代理的目标方法前执行
    @Before(value = "execution(* com.evan.spring5.autoano.User.add(..))")
    public void before() {
        System.out.println("before...");
    }

    //最终通知:在被代理的目标方法(不管方法是否有异常都执行)最终结束后执行(盖棺定论)
    @After(value = "execution(* com.evan.spring5.autoano.User.add(..))")
    public void after() {
        System.out.println("after...");
    }

    //后置通知(返回通知):在被代理的目标方法(方法有异常不执行)成功结束后执行(寿终正寝)
    @AfterReturning(value = "execution(* com.evan.spring5.autoano.User.add(..))")
    public void afterReturning() {
        System.out.println("AfterReturning...");
    }

    //异常通知:被代理的目标方法异常结束后执行(死于非命)
    @AfterThrowing(value = "execution(* com.evan.spring5.autoano.User.add(..))")
    public void afterThrowing() {
        System.out.println("AfterThrowing...");
    }

    //环绕通知:在被代理的目标方法前后执行(如果方法有异常,后面的增强操作不执行)
    @Around(value = "execution(* com.evan.spring5.autoano.User.add(..))")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

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

        //被增强的方法执行
        proceedingJoinPoint.proceed();

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

3、创建配置类

@Configurable  //表示该类是配置类
@ComponentScan(basePackages = {"com.evan.spring5"}) //开启组件扫描
@EnableAspectJAutoProxy //开启Aspect生成代理对象
public class MyConfig {
   
   //创建User对象注入到sping容器
    @Bean
    public User user() {
        return new User();
    }
}
  • 测试
@Test
public void test2() {
    ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
    User user = context.getBean("user", User.class);
    user.add();
}
  • 测试结果
    当被代理目标方法出现异常时,会执行异常通知同时环绕通知被增强方法执行之前到最终通知结束;同时后置通知不会被执行。
    image
    当被代理目标方法没有异常时,会执行除异常通知的所有通知。
    image

标签:教程,通知,Sping,add,evan,User,AOP,com,public
From: https://www.cnblogs.com/lisong0626/p/17984753

相关文章

  • 教程|幻兽帕鲁一键开私服
    《幻兽帕鲁》这游戏最近可谓风靡一时,发售仅三天即创下Steam同时在线峰值超150万的盛况。笔者买到游戏后也是连忙喊上小伙伴一起联机当赛博农场主,奈何官方服务器太过火爆,时不时就遇到卡顿现象。干脆动手搭建一个专用服务器,与朋友们共享流畅的私服联机体验吧!跟着下面的步骤,不用......
  • Steam幻兽帕鲁搭建教程,如何选择服务器
    如何选购服务器大家可以根据自己的需求选购,大家最好选用物理服务器,可以找我参考一下。1到6人建议使用16H32G的20带宽的。12人以上建议大家使用E5的CPU内存64G的带宽50起步的。大家在选择服务器商的时候一定要选择正规的拥有资质的,这样售后会有保证,服务器还会稳定。搭建前需要准备下......
  • 无涯教程-CSS3 - 渐变属性(Gradients)
    渐变显示两种或更多种颜色的组合,如下所示-线性渐变线性渐变用于以线性格式(如从上到下)排列两种或多种颜色。Toptobottom(从上到下)<html><head><style>#grad1{height:100px;background:-webkit-linear-gradient(pink,......
  • 无涯教程-CSS3 - 颜色属性(Color)
    CSS3支持以下其他颜色属性-RGBA颜色HSL颜色HSLA颜色Opacity透明RGBA代表RedGreenBlueAlpha。它是CSS2的扩展,Alpha指定颜色的透明度,参数是0.0到1.0之间的数字。RGBA的示例语法如下所示-#d1{background-color:rgba(255,0,0,0.5);}#d2{background-colo......
  • NSIS打包教程 Winform程序打包
    NSIS软件下载地址:https://pan.baidu.com/s/1sbBX__7Q4ntHeEDp-yl1ng提取码:xeax相关的视频教程https://www.bilibili.com/video/BV1jf4y1a7ji?share_source=copy_web(如果不会请看我录制的视频教程)NSIS打包教程Wnform程序打包,,安装部署步骤如下图 桌面快......
  • 用Java实现冒泡排序:实用教程带你入门
    在处理一些特定系统功能时,经常需要使用冒泡排序。例如,在一个电子商务网站中,需要对商品进行排序和过滤。这个时候可以使用冒泡排序对商品进行排序,以便用户能够按照价格、销量、评分等不同字段进行排序。通过使用冒泡排序,系统可以提供更加灵活和个性化的排序选项,以便用户能够更加方便......
  • DataGrip 2023.3.2 安装教程(附最新激活码,亲测有效)
    DataGrip是JetBrains公司开发的一款多引擎数据库环境,支持MySQL,MariaDB,PostgreSQL,SQLite,HyperSQL,ApacheDerby,H2,HSQLDB,MSSQLServer,Oracle,DB2,InterSystemsCache,Informix,Firebird,Derby和SQLServerExpress。它提供了单一的、集成的开发环境,用于......
  • 无涯教程-CSS3 - boarder-image属性
    CSSBorderimage属性用于向某些元素添加图像边界。边界图像的示例语法如下-#borderimg{border:10pxsolidtransparent;padding:15px;}最常用的值如下所示-Sr.No.Value&Remark1border-image-source用于设置图像路径2border-image-slice用于切片边......
  • 无涯教程-CSS3 - border-radius属性
    CSS3圆角用于通过使用border-radius 属性为正文或文本添加特殊的彩色圆角,语法如下-#rcorners7{border-radius:60px/15px;background:#FF0000;padding:20px;width:200px;height:150px;}下表显示了圆角的可能值,如下所示:Sr.No.Value&Remark1......
  • STM32CubeMX教程23 FSMC - IS62WV51216(SRAM)驱动
    1、准备材料开发板(正点原子stm32f407探索者开发板V2.4)STM32CubeMX软件(Version6.10.0)野火DAP仿真器keilµVision5IDE(MDK-Arm)ST-LINK/V2驱动XCOMV2.6串口助手2、实验目标使用STM32CubeMX软件配置STM32F407开发板的FSMC实现以轮询或DMA的方式读写IS62WV51216(SRAM)芯片3、......