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

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

hdu1689(线段树成段更新)

两种操作:1、set区间[a,b]上数字为v;2、查询[ 1 , n ]上的sum 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdl

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

AI行业应用(不定期更新)

ChatPDF 可以让你上传一个 PDF 文件,然后针对这个 PDF 进行小结和提问。你可以把各种各样你要研究的分析报告交给它,快速获取到想要知道的信息。https://www.chatpdf.com/

GIS图形库更新2024.8.4-9.9

更多精彩内容请访问 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信:digital_twin123 Cesium 本期发布了1.121 版本。重大新闻,Cesium被Bentley收购。 ✨ 功能和改进 默认启用 MSAA,采样 4 次。若要关闭 MSAA,则可以设置scene.msaaSamples = 1。但是通过比较,发现并没有多大改善。

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓