分享一下我对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

相关文章

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

MySQL8.2.0安装教程分享

《MySQL8.2.0安装教程分享》这篇文章详细介绍了如何在Windows系统上安装MySQL数据库软件,包括下载、安装、配置和设置环境变量的步骤... 目录mysql的安装图文1.python访问网址2javascript.点击3.进入Downloads向下滑动4.选择Community Server5.

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

10个Python自动化办公的脚本分享

《10个Python自动化办公的脚本分享》在日常办公中,我们常常会被繁琐、重复的任务占据大量时间,本文为大家分享了10个实用的Python自动化办公案例及源码,希望对大家有所帮助... 目录1. 批量处理 Excel 文件2. 自动发送邮件3. 批量重命名文件4. 数据清洗5. 生成 PPT6. 自动化测试

10个Python Excel自动化脚本分享

《10个PythonExcel自动化脚本分享》在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式,本文将分享10个实用的Excel自动化脚本,希望可以帮助大家更轻松地掌握这些技能... 目录1. Excel单元格批量填充2. 设置行高与列宽3. 根据条件删除行4. 创建新的Excel工作表5

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像