首页 > 编程语言 >【SpringBoot】面向切面编程AOP

【SpringBoot】面向切面编程AOP

时间:2023-09-02 10:56:15浏览次数:47  
标签:SpringBoot point System 切面 pointcutExpression AOP println public out

一.基本概念

oop:主要以函数或者过程为程序的基本组织方式,系统功能是由一组相关的过程和函数序列构成,主要实现通过继承,多态和封装

aop:这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。简单来讲就是方法和方法的关联,将公用代码从核心代码中抽取出来,程序员只需要关顾核心代码的实现

OOP(面向对象编程)针对问题领域中以及业务处理过程中存在的实体及其属性和操作进行抽象和封装,面向对象的核心概念是纵向结构的,其目的是获得更加清晰高效的逻辑单元划分;

AOP则是针对业务处理过程中的切面进行提取,用面向对象的思路,将业务操作对象的核心功能和对它的其他服务性功能代码分离,即某一个操作在各个模块中都有涉及,这个操作就可以看成“横切”存在于系统当中。在许多情况下,这些操作都是与业务逻辑相关性不强或者不属于逻辑操作的必须部分,而面向对象的方法很难对这种情况做出处理。AOP可以认为是对OOP的补充,解决了OOP无法处理的横向的问题

实现方法

  1. 导入依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>    

     

  2. 在项目路径下新建文件:aop->xxAspect.java

       

 

  3.demoAspect.java

 1 package com.wanmait.mpdemo.aop;
 2 
 3 import org.aspectj.lang.JoinPoint;
 4 import org.aspectj.lang.ProceedingJoinPoint;
 5 import org.aspectj.lang.annotation.*;
 6 
 7 import java.util.Arrays;
 8 
 9 //@Component
10 //@Aspect//切面类
11 public class DemoAspect {
12     //定义切入点表达式 对com.wanmait.mpdemo.service包下面的所有的类或者接口的所有的方法有任意的参数个数和参数类型都进行切入
13     @Pointcut("execution(* com.wanmait.mpdemo.service.*.*(..))")
14     public void pointcutExpression(){}
15 
16     //前置通知,在目标方法执行之前执行
17     @Before("pointcutExpression()")
18     public void before(JoinPoint point){
19         System.out.println("before..............");
20         System.out.println("类:"+point.getTarget().getClass().getName());
21         System.out.println("方法:"+point.getSignature().getName());
22         System.out.println("参数:"+ Arrays.toString(point.getArgs()));
23     }
24     //后置通知,不管目标方法是否执行成功都会执行
25     @After("pointcutExpression()")
26     //@After(value = "pointcutExpression()")
27     public void after(JoinPoint joinPoint){
28         System.out.println("after..................");
29     }
30     //异常通知,目标方法抛出异常时执行,后置通知的一种
31     @AfterThrowing(value = "pointcutExpression()",throwing = "ex")
32     public void afterThrowing(JoinPoint point,Exception ex){
33         System.out.println("afterThowing...........");
34         System.out.println(ex.getMessage());
35     }
36     //返回通知,目标方法正常执行时执行,后置通知的一种
37     @AfterReturning(value = "pointcutExpression()",returning = "returnValue")
38     public void afterReturning(JoinPoint joinPoint,Object returnValue){
39         System.out.println("afterReturning...........");
40         //如果目标方法没有返回值,returnValue就是null
41         System.out.println(returnValue);
42     }
43 
44     //环绕通知
45     @Around("pointcutExpression()")
46     public Object around(ProceedingJoinPoint point) throws Throwable {
47         System.out.println("around before....................");
48         long beginTime = System.currentTimeMillis();
49         //手动调用目标方法
50         Object returnValue = null;
51         returnValue = point.proceed();
52         long endTime = System.currentTimeMillis();
53         System.out.println("执行时间:"+(endTime-beginTime)+"毫秒");
54         System.out.println("around after....................");
55         return returnValue;
56     }
57 }

 

  

 

 

标签:SpringBoot,point,System,切面,pointcutExpression,AOP,println,public,out
From: https://www.cnblogs.com/zhaoping/p/17673311.html

相关文章

  • 关于SpringBoot中引入html模板的问题的解决(基础)
    问题描述将相关的文件放置到resources/static文件夹目录下面,文件路径正确,但是一直应用不了问题解决原来是在引用的时候,需要在每个文件前面加上一个斜杠——/,这样就解决啦!......
  • 手摸手4-springboot整合redis,实现自动文档
    (目录)手摸手4-springboot整合redis,实现自动文档引入依赖<!--redis相关--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><......
  • SpringBoot 博客网站
    SpringBoot博客网站系统功能登录注册博客列表展示搜索分类个人中心文章分类管理我的文章管理发布文章开发环境和技术开发语言:Java使用框架:SpringBoot+jpa+H2SpringBoot是一个用于构建Java应用程序的开源框架,它是Spring框架的一个扩展,旨在简化和加速Spring......
  • 尚硅谷新版SSM框架全套视频教程,Spring6+SpringBoot3最新SSM企业级开发
    简介  视频地址https://www.bilibili.com/video/BV1AP411s7D7?p=1&vd_source=0d7b1712ce42c1a2fa54bb4e1d601d78 笔记地址https://www.wolai.com/v5Kuct5ZtPeVBk4NBUGBWF......
  • springboot 集成 redisson
    1.maven依赖<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.10.1</version> </dependency>2.添加配置和注入beanimportorg.redisson.Redisson;importorg.redisso......
  • spring/springboot 整合注解切换数据源
    springboot整合注解切换数据源1、SpringBoot的配置文件#数据源1spring.datasource.druid.one.url=jdbc:mysql://localhost:3306/db1spring.datasource.druid.one.username=rootspring.datasource.druid.one.password=123456#数据源2spring.datasource.druid.two.url=j......
  • 学习aop以及nginx
    苍穹外卖第一天搭建前端后端环境先将代码提交到本地然后在git上创建仓库https://gitee.com/lh03062021/sky-take-out.git点击push定义远程仓库把复制好的粘贴上去就可以推送成功了。导入sql文件,编译父项目nginx反向代理,将前端发送的动态请求由nginx转发到后端服务器好......
  • SpringBoot使用protobuf格式的接口方式
    建立SpringBoot项目,pom.xml内容如下:<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="......
  • springboot 使用RestTemplate调用get api,传入参数
    getapi:@ResponseBody@ResponseStatus(HttpStatus.OK)@GetMapping(value="/checkGetApi")@ApiOperation(value="checkgetapimethod")publicJSONObjectcheckGetApi(IntegeruserName){JSONObjectresult=......
  • springboot整合redis,连接两个redis
    在SpringBoot中,可以使用RedisTemplate进行Redis的连接和操作。要连接多个Redis实例,你可以创建多个RedisTemplate实例,并通过配置不同的连接工厂来连接到不同的Redis实例。首先,在application.properties(或application.yml)配置文件中添加Redis连接信息:#第一个Redis......