分享一下我对aop的一点个人见解(持续更新中....)

2023-10-13 15:30

本文主要是介绍分享一下我对aop的一点个人见解(持续更新中....),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

分享一下我对aop的一点个人见解(持续更新中…)

关于aop

AOP(Aspect Orient Programming)是一种设计思想,是软件设计领域中的面向切面编程,它是面向对象编程(OOP)的一种补充和完善。它以通过预编译方式和运行期动态代理方式,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术。
通俗来说,aop就是拓展,可以让程序做更多的事情。打个比方,例如一盘西红柿炒蛋,主心骨就是西红柿和鸡蛋,当你加入一些葱花的时候,会令这盘菜更香,这个就是aop了。
在这里插入图片描述这个图是网上找的,画的很生动,就拿来了,嘿嘿。

AOP的核心

在这里插入图片描述(1)pointcut-切入点
(2)joinpoint-连接点
(3)order-优先级
(4)advice-通知

结合例子去分析

package com.cy.pj.common.aspect;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;@Aspect
@Component
public class SysTimeAspect {@Pointcut("bean(sysUserDeptServiceImpl)")public void doTime() {}@Before("doTime()")public void dobefore() {System.out.println("@before");}@After("doTime()")public void doafter() {System.out.println("@after");}@AfterReturning("doTime()")public void doafterreturning() {System.out.println("@doafterReturning");}@AfterThrowing("doTime()")public void doafterthrowing() {System.out.println("@doafterThrowing");}@Around("doTime()")public  Object doAround(ProceedingJoinPoint jp)throws Throwable{System.out.println("around.before");try {Object result=jp.proceed();		System.out.println("around.after");return result;} catch (Exception e) {System.out.println("around.exception");throw e;}}
}

#aspect作为横向切面对象,在开头用@Aspect声明
pointcut作为多个连接点的集合,在这个例子中他就连接了serviceimpl中的
sysUserDeptServiceImpl,意思即是我们后面做的动作都是在sysUserDeptServiceImpl中去实现。
而现在我们来谈谈pointcut中的bean和annotation的区别
bean后面是一个切入点的表达式
annotation后为一个整体的表达式,如(@annotation(com.require))
此处所有包含@require的都能接收到动作
在这里插入图片描述

@Around 环绕,优先级最高
然后依次为
@Before
@After
如果有错,则抛出
@AfterThrowing
没错则
@AfterReturning

关于joinpoint和proceedingjoinpoint

proceedingjoinpoint是继承于joinpoint,只能用于@Around环绕注解的方法参数里。
两者通俗来说就是让目标方法去执行。

关于order

public @interface Order {/*** The order value.* <p>Default is {@link Ordered#LOWEST_PRECEDENCE}.* @see Ordered#getOrder()*/int value() default Ordered.LOWEST_PRECEDENCE;}

在order的源码中,我们可以看到,他是lowest的,意思则是若没有在order后标识数字,order的优先级是最低的。而当我们为order注入数字时,举个例子order(1)和order(9) 数字越小,优先级越高,而且他是相当于一个链式结构的,优先级越高的越后出来,相反,优先级越低的,越先出来。

关于aop中的异步

在开发系统中,通常会考虑系统的性能问题,为了让系统的性能能更加快更加快,一般会考虑将“*串行”改为“并行”,这就是异步的问题了…
接下来
聊聊spring中的@Async
在需要执行异步的方法中,声明async方法,并加入注释
@Async
@Transactional(propagation = Propagation.REQUIRES_NEW)
如需要获取业务层执行异步操作的结果,可在方法中加入线程,
System.out.println("
.方法:"+
Thread.currentThread().getName());
try{Thread.sleep(5000);}catch(Exception e) {}
return new AsyncResult(*);

#另外我们还可以对异步进行封装,进行重新编写

@Slf4j
@Configuration
@ConfigurationProperties("spring.async.task")
@Setter
public class SpringAsycnConfig implements AsyncConfigurer {//异步执行器private int corePoolSize=5;private int maxPoolSize=100;private int keepAliveSeconds=60;private int queueCapacity=128;private String threadNamePrefix="task==>";@Overridepublic Executor getAsyncExecutor() {ThreadPoolTaskExecutor executor=new ThreadPoolTaskExecutor();executor.setCorePoolSize(corePoolSize);//设置核心线程数executor.setMaxPoolSize(maxPoolSize);//设置最大线程数executor.setKeepAliveSeconds(keepAliveSeconds);//设置释放资源executor.setQueueCapacity(queueCapacity);//设置队列容量executor.setThreadNamePrefix(threadNamePrefix);//设置前缀名称//自定义拒绝处理策略executor.setRejectedExecutionHandler(new RejectedExecutionHandler() {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {log.error("队列已满并且已无线程可用");}});executor.initialize();return executor;}@Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {return new AsyncUncaughtExceptionHandler() {@Overridepublic void handleUncaughtException(Throwable ex, Method method, Object... params) {log.error("任务执行时出现了 {}",ex.getMessage());}};}
}

如有不足之处,请各位大神多多指教!

这篇关于分享一下我对aop的一点个人见解(持续更新中....)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/204173

相关文章

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

linux安装、更新、卸载anaconda实践

《linux安装、更新、卸载anaconda实践》Anaconda是基于conda的科学计算环境,集成1400+包及依赖,安装需下载脚本、接受协议、设置路径、配置环境变量,更新与卸载通过conda命令... 目录随意找一个目录下载安装脚本检查许可证协议,ENTER就可以安装完毕之后激活anaconda安装更

Linux从文件中提取特定内容的实用技巧分享

《Linux从文件中提取特定内容的实用技巧分享》在日常数据处理和配置文件管理中,我们经常需要从大型文件中提取特定内容,本文介绍的提取特定行技术正是这些高级操作的基础,以提取含有1的简单需求为例,我们可... 目录引言1、方法一:使用 grep 命令1.1 grep 命令基础1.2 命令详解1.3 高级用法2

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种