当前位置: 首页 > news >正文

spring之Spring AOP基于注解

文章目录

  • 前言
  • 一、Spring AOP基于注解的所有通知类型
    • 1、前置通知
    • 2、后置通知
    • 3、环绕通知
    • 4、最终通知
    • 5、异常通知
  • 二、Spring AOP基于注解之切面顺序
  • 三、Spring AOP基于注解之通用切点
  • 三、Spring AOP基于注解之连接点
  • 四、Spring AOP基于注解之全注解开发


前言

通知类型包括:

  • 前置通知:@Before目标方法执行之前的通知
  • 后置通知:@AfterReturning目标方法执行之后的通知
  • 环绕通知:@Around目标方法之前添加通知,同时目标方法执行之后添加通知
  • 异常通知:@AfterThrowing发生异常之后执行的通知
  • 最终通知:@After放在finally语句块中的通知 -

一、Spring AOP基于注解的所有通知类型

1、前置通知

    //@Before(切点表达式 确定在哪里进行切入)标注的方法就是一个前置通知,在目标类的目标方法执行之前执行@Before("execution(* com.powernode.spring.service.UserService.* (..))")public void beforeAdvice(){System.out.println("前置通知");}

在这里插入图片描述

2、后置通知

    //后置通知@AfterReturning("execution(* com.powernode.spring.service.UserService.* (..))")public void afterReturningAdvice(){System.out.println("后置通知");}

在这里插入图片描述

3、环绕通知

    //环绕通知@Around("execution(* com.powernode.spring.service.UserService.* (..))")public void aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {//前面的代码System.out.println("前环绕");//执行目标joinPoint.proceed();//执行目标//后面的代码System.out.println("后环绕");}

注意:需要添加一个参数(ProceedingJoinPoint )去执行目标方法

在这里插入图片描述

4、最终通知

    //最终通知@After("execution(* com.powernode.spring.service.UserService.* (..))")public void afterAdvice(){System.out.println("最终通知");}

在这里插入图片描述

5、异常通知

目标方法中设计异常:

@Service("userservice") //将这个类纳入spring容器管理
public class UserService { //目标类public void login(){ //目标方法System.out.println("系统正在进行身份认证....");if(1==1){throw new RuntimeException("运行时异常");}}
}
    //异常通知@AfterThrowing("execution(* com.powernode.spring.service.UserService.* (..))")public void afterThrowing(){System.out.println("异常通知");}

在这里插入图片描述
发生异常后,后置通知以及后环绕都没有了

二、Spring AOP基于注解之切面顺序

再增加一个安全切面:

public class SecurityAspect { //安全切面//通知+切点@Before("execution(* com.powernode.spring.service.UserService.* (..))")public void beforeAdvice(){System.out.println("前置通知:安全……");}
}

那么安全切面和日志切面的执行顺序如何来排呢?
@Order注解
@Order(1)
@Order(2)
谁的数字越小优先级越高
在这里插入图片描述

三、Spring AOP基于注解之通用切点

切面表达式写了多次,怎么解决?

    @Pointcut("execution(* com.powernode.spring.service.UserService.* (..))")public void 通用切点(){//这个方法只是一个标记。方法名随意,方法体中也不需要写任何代码。}@Before("通用切点()")public void beforeAdvice(){System.out.println("前置通知");}

跨类的话:

    @Before("com.powernode.spring.service.LogAspect.通用切点()")public void beforeAdvice(){System.out.println("前置通知:安全……");}

在这里插入图片描述

三、Spring AOP基于注解之连接点

JoinPoint在Spring容器调用这个方法的时候自动传过来
我们可以用它来获取目标方法的签名

    @Before("通用切点()")public void beforeAdvice(JoinPoint joinPoint){System.out.println("前置通知");System.out.println("目标方法的方法名:"+joinPoint.getSignature().getName());}

在这里插入图片描述

四、Spring AOP基于注解之全注解开发

SpringConfig 代替spring.xml文件

@Configuration//代替spring.xml文件
@ComponentScan({"com.powernode.spring.service"}) //组件扫描
@EnableAspectJAutoProxy(proxyTargetClass = true) //开启aspectj的自动代理
public class SpringConfig {
}

测试程序:

    @Testpublic void testNoXml(){ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);UserService userservice = (UserService) ac.getBean("userservice");userservice.login();}

在这里插入图片描述


http://www.lryc.cn/news/13282.html

相关文章:

  • LeetCode题目笔记——6362. 合并两个二维数组 - 求和法
  • 【C#基础】C# 常用语句讲解
  • 腾讯云——负载均衡CLB
  • 6.关于系统服务的思考—— native vs java
  • SQL语句创建视图:
  • 使用BP神经网络和Elman Net预测航班价格(Matlab代码实现)
  • JavaWeb9-volatile解决内存可见性和指令重排序问题
  • Docker - 镜像操作命令
  • 全栈之路-前端篇 | 第三讲.基础前置知识【前端标准与研发工具】学习笔记
  • Tomcat 线上调优记录
  • 学习 Python 之 Pygame 开发坦克大战(四)
  • New和Malloc的使用及其差异
  • 2023年细胞生物学复习汇总
  • 光伏VSG-基于虚拟同步发电机的光伏并网逆变器系统MATLAB仿真
  • 高可用 - 02 Keepalived_VRRP工作原理
  • vue实现xml在线编辑功能
  • GitHub Workflow
  • vue学习
  • Windows使用ssh协议远程连接ubuntu linux系统
  • 大数据处理 - Overview
  • 12-Composer的配置与使用详解
  • RK3566开启wifi自适应
  • shell编程之变量定义
  • Spring Cloud Alibaba 微服务简介
  • 【调试】GDB使用总结
  • 基于Spring、Spring MVC、MyBatis的招聘管理系统
  • 软件测试基础
  • 【算法基础】链表
  • [AUTOSAR][Fls模块] Flash Driver Module
  • 如何正确选择好用的投票平台微信公众平台投票链接链接投票平台