分享一下我对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的一点个人见解(持续更新中....)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_44957065/article/details/114416196
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/204173

相关文章

JDK9到JDK21中值得掌握的29个实用特性分享

《JDK9到JDK21中值得掌握的29个实用特性分享》Java的演进节奏从JDK9开始显著加快,每半年一个新版本的发布节奏为Java带来了大量的新特性,本文整理了29个JDK9到JDK21中值得掌握的... 目录JDK 9 模块化与API增强1. 集合工厂方法:一行代码创建不可变集合2. 私有接口方法:接口

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

Oracle 通过 ROWID 批量更新表的方法

《Oracle通过ROWID批量更新表的方法》在Oracle数据库中,使用ROWID进行批量更新是一种高效的更新方法,因为它直接定位到物理行位置,避免了通过索引查找的开销,下面给大家介绍Orac... 目录oracle 通过 ROWID 批量更新表ROWID 基本概念性能优化建议性能UoTrFPH优化建议注

Redis中6种缓存更新策略详解

《Redis中6种缓存更新策略详解》Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案,然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性,本文将介绍Redis中6种缓存更... 目录引言策略一:Cache-Aside(旁路缓存)策略工作原理代码示例优缺点分析适用场景策略二:Re

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Pandas利用主表更新子表指定列小技巧

《Pandas利用主表更新子表指定列小技巧》本文主要介绍了Pandas利用主表更新子表指定列小技巧,通过创建主表和子表的DataFrame对象,并使用映射字典进行数据关联和更新,实现了从主表到子表的同... 目录一、前言二、基本案例1. 创建主表数据2. 创建映射字典3. 创建子表数据4. 更新子表的 zb

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

MySQL更新某个字段拼接固定字符串的实现

《MySQL更新某个字段拼接固定字符串的实现》在MySQL中,我们经常需要对数据库中的某个字段进行更新操作,本文就来介绍一下MySQL更新某个字段拼接固定字符串的实现,感兴趣的可以了解一下... 目录1. 查看字段当前值2. 更新字段拼接固定字符串3. 验证更新结果mysql更新某个字段拼接固定字符串 -

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作