Spring——AOP核心概念和AOP入门案例
创始人
2024-06-01 12:57:29
0

AOP:面向切面编程,一种编程范式,指导开发者如何组织程序结构

作用:在不惊动原始设计的基础上进行功能增强

Spring理念:无侵入式编程

比如测试一个方法的万次执行时间,原本没有Aop需要这样写

  public void save() {Long st=System.currentTimeMillis();for(int i=0;i<10000;i++)System.out.println("service_save...");Long  et=System.currentTimeMillis();Long tt=et-st;System.out.println("执行万次消耗时间:"+tt);}

有了AOP以后在源代码里面就可以像下面这样写也能测试万次执行时间,本质上是提供接口给外部去测试。这就没有改动源码就可以增加一个万次测试时间的功能。

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

对于上述功能的实现,需要将下列东西抽取出来单独封窗

public void method() {Long st=System.currentTimeMillis();for(int i=0;i<10000;i++) {//通过接口调用原始方法}Long  et=System.currentTimeMillis();Long tt=et-st;System.out.println("执行万次消耗时间:"+tt);}

AOP核心概念:

原始方法也叫做连接点,要追加功能的方法叫做切入点,而追加同一个功能的代码,也就是上面这段封装的公共代码被称为“通知”,通知也有一个对应的通知类

切入点就是要增强的方法,通知就是增强的内容

将通知和切入点绑定到一起的东西就叫做切面

切面:对于通知和切入点之间的关系描述

上述图的流程就是首先找程序中的共性功能写一个通知类,在通知类中定义一个方法叫做通知,而连接点是所有方法,而切入点是被选中要增强的方法,因为不是所有方法都需要增强,将切入点和通知绑定后就得到一个关系——切面:在哪些切入点上执行哪些通知

AOP入门案例

案例流程

项目结构

1.导入坐标

aop的坐标已经包含在了spring-context中去了

org.springframeworkspring-context5.2.22.RELEASEorg.aspectjaspectjweaver 1.9.4

 2.制作连接点方法(原始操作,Dao层接口和实现类)

Dao层接口的一个实现类

@Repository
public class BookDaoImpl implements BookDao {public void save(){System.out.println(System.currentTimeMillis());System.out.println("book dao save...");}public void update(){System.out.println("book dao update...");}
}

再在SpringConfig定义一个基础的配置类

@Configuration
@ComponentScan("org.example")
public class SpringConfig {}

3.制作共性功能(通知类与通知)

新建一个aop包,新建一个通知类MyAdvice


public class MyAdvice {public void method(){System.out.println(System.currentTimeMillis());}
}

4.定义切入点

在通知类的定义一个切入点使用一个@Pointcut()注解,注解括号里的内容如下

解释为执行到一个返回值为空,并且是指定路径下的方法时就说明这是一个切入点

    @Pointcut("execution(void org.example.dao.BookDao.update())")public void pt(){}

5.绑定切入点与通知关系(切面)

使用一个@Before,意为在切入点方法之前执行method()

@Pointcut("execution(void org.example.dao.BookDao.update())")public void pt(){}@Before("pt()")public void method(){System.out.println(System.currentTimeMillis());}

6.将通知类交给spring进行管理,并告知spring这是个做AOP的类

使用两个注解@Component(交给spring管理) @Aspect告诉spring这是个通知类 

@Component
@Aspect
public class MyAdvice {@Pointcut("execution(void org.example.dao.BookDao.update())")public void pt(){}@Before("pt()")public void method(){System.out.println(System.currentTimeMillis());}
}

然后还要告诉spring整个程序是用注解开发的AOP,在SpringConfig配置类上使用一个新注解

@EnableAspectJAutoProxy  该注解启动了通知类里面的@Aspect,然后@Aspect又让spring去注意到通知类里里面的内容

SpringConfig配置类的注解

总结测试

 成功输出

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...