当前位置: 首页 > news >正文

分布式补充技术 01.AOP技术

01.AOP技术是对于面向对象编程(OOP)的补充。是按照OCP原则进行的编写,(ocp是修改模块权限不行,扩充可以)
02.写一个例子:
创建一个新的java项目,在main主启动类中,写如下代码。

package com.company;interface mainService{void send();
}
class DefaultServiceImpl implements mainService
{@Overridepublic void send() {System.out.println("hello");}
}
public class main {public static void main(String[] args){DefaultServiceImpl defaultService=new DefaultServiceImpl();defaultService.send();}
}

一个接口,一个接口实现类,一个main主方法。

03.如果要实现显示接口实现类中的send方法运行的时间,一般的就在实现类中的send方法前后添加system.currenttimeMills

 @Overridepublic void send() {System.out.println("start:"+System.currentTimeMillis());System.out.println("hello");System.out.println("end:"+System.currentTimeMillis());}

04.如果在项目的发布后,或者以后接口实现类以后代码多,如何去修改项目呢?实现显示运行时间呢?
方法一:继续写一个子类去继承接口实现类。

class DefaultServiceImpl implements mainService
{@Overridepublic void send() {// System.out.println("start:"+System.currentTimeMillis());System.out.println("hello");//  System.out.println("end:"+System.currentTimeMillis());}
}class logDefaultImpl extends DefaultServiceImpl
{@Overridepublic void send() {System.out.println("start:"+System.currentTimeMillis());System.out.println("hello");System.out.println("end:"+System.currentTimeMillis());}
}
package com.company;interface mainService{void send();
}
class DefaultServiceImpl implements mainService
{@Overridepublic void send() {// System.out.println("start:"+System.currentTimeMillis());System.out.println("hello");//  System.out.println("end:"+System.currentTimeMillis());}
}class logDefaultImpl extends DefaultServiceImpl
{@Overridepublic void send() {System.out.println("start:"+System.currentTimeMillis());System.out.println("hello");System.out.println("end:"+System.currentTimeMillis());}
}
public class main {public static void main(String[] args){mainService logDefaultImpl=new logDefaultImpl();logDefaultImpl.send();}
}

方法二:如果接口实现类被final修饰的话,不能用子类来继承,可以写一个集合来实现运行时间的功能

final class DefaultServiceImpl implements mainService
{@Overridepublic void send() {System.out.println("hello");}
}

创建一个新的类,也同样实现接口mainService:
在这个类中声明一个接口的变量:

class logDefaultImpl implements mainService
{private mainService mainservice;public logDefaultImpl(mainService mainservice){this.mainservice=mainservice;}@Overridepublic void send() {System.out.println("start:"+System.currentTimeMillis());mainservice.send();System.out.println("end:"+System.currentTimeMillis());}
}

在main主方法中:

public class main {public static void main(String[] args){mainService DefaultServiceImpl=new DefaultServiceImpl();DefaultServiceImpl.send();mainService log=new logDefaultImpl(new DefaultServiceImpl());log.send();}
}

通过构造函数,将final修饰的接口实现类传入到新的类中,结合方法,来实现显示运行时间的功能。

05.AOP技术的底层实现。
AOP对象是通过代理对象来实现的,代理对象有两种,一种是通过JDK来实现的,一种是通过CGlib来实现的。
在这里插入图片描述
jdk的代理就好像是使用一个新的类去继承接口,再来包含目标接口实现类
cglib是写一个子类去继承目标接口实现类。

06.AOP的术语
1切面:就是写了相关扩展功能的类
2.通知:就是切面中的相关方法
3.连接点:就是需要扩展的方法
4.切入点:就是连接点所在的类,有的时候也可能是一整个包。
在这里插入图片描述
07.在springboot中去实现AOP技术
先在maven项目中导入相关的依赖。
在这里插入图片描述

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>     </dependency>

在去写切面类,这里需要用注解@Aspect标识这个类是切面类,用@Component来将类交给spring容器进行管理。还需要使用到log4j来进行日志管理@Slf4j。

package com.cy.common;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Slf4j//日志
@Aspect//标识切面类
@Component//交给spring容器管理
public class sysLogAspect {@Pointcut("bean(sysUserServiceImpl)")//@Pointcut标识连接点(多个切入点的集合)public void logPointCut(){} @Around("logPointCut()")//这个是环绕通知,属性是切入点public Object around(ProceedingJoinPoint joinPoint) throws Throwable {//还是计算运行时间//并且执行方法Long startTime=System.currentTimeMillis();Object object= joinPoint.proceed();//调用本切面的其他方法或者其他切面的通知和目标Long endTime=System.currentTimeMillis();log.info("总时长是:",endTime-startTime);return object;}}

@Pointcut标识连接点(多个切入点的集合),这里用来写的是连接点bean标识spring容器中的类,括号中的是类名,一般是接口的实现类impl。

这个切面的意义在于sysUserServiceImpl这个接口实现类的每一个方法都扩展了功能,记录运行时间。

07.在springboot项目导入AOP依赖后,项目实现路径发送了改变。
springboot版本2.x后,默认AOP代理是Cglib
运行:
在这里插入图片描述

AOP通知有五种:
在这里插入图片描述

package com.cy.common;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Slf4j
@Aspect
@Component
public class sysTimeAspect {@Pointcut("bean(sysUserServiceImpl)")public void doTime(){}@Around("doTime()")public Object aroud(ProceedingJoinPoint joinPoint) throws Throwable {Long startTime=System.currentTimeMillis();Object object= joinPoint.proceed();Long endTime=System.currentTimeMillis();log.info("总时长是:",endTime-startTime);System.out.println("通知around");return object;}//前置@Before("doTime()")public void before()  {System.out.println("通知before");}//后置@After("doTime()")public void after()  {System.out.println("通知before");}//正常@AfterReturning("doTime()")public void AfterReturn()  {System.out.println("通知AfterReturning");}//异常@AfterThrowing("doTime()")public void AfterThrow()  {System.out.println("通知AfterThrowing");}
}

使用通知@AfterThrowing,在切面中去写一个异常通知,就是目标接口类方法运行时候有异常,切面类处理。

@Slf4j
@Aspect
@Component
public class sysExceptionAspect {@AfterThrowing(pointcut = "bean(sysUserServiceImpl)",throwing = "e")//pointcut是连接点,throwing是抛出的异常public void doHandlerException(JoinPoint jp//这个是切入点,Throwable e){MethodSignature ms= (MethodSignature)jp.getSignature();log.error("{},exception msg is {}",ms.getName(),e.getMessage());}}

getsignature返回的类型是signature。
在这里插入图片描述

如果想要所有的接口实现类的运行方法报错时候有这个切面的类的AfterThrowing来处理异常,可以在bean中去写bean(*ServiceImpl)

相关文章:

分布式补充技术 01.AOP技术

01.AOP技术是对于面向对象编程&#xff08;OOP&#xff09;的补充。是按照OCP原则进行的编写&#xff0c;(ocp是修改模块权限不行&#xff0c;扩充可以) 02.写一个例子&#xff1a; 创建一个新的java项目&#xff0c;在main主启动类中&#xff0c;写如下代码。 package com.co…...

QT 多对一服务插件 CTK开发(五)

CTK在软件的开发过程中可以很好的降低复杂性、使用 CTK Plugin Framework 提供统一的框架来进行开发增加了复用性 将同一功能打包可以提供多个应用程序使用避免重复性工作、可以进行版本控制提供了良好的版本更新迭代需求、并且支持动态热拔插 动态更新、开发更加简单快捷 方便…...

[Windows]_[初级]_[创建目录和文件的名字注意事项]

场景 在开发Windows程序时,会出现目录生成了,但是函数无法在目录里创建文件,怎么回事?说明 在之前说过Windows上有些字符是不能作为文件名的[1],但是检查了下出问题的目录名没有非法字符,所以不是这个原因。 把文件的绝对路径打印出来就发现了问题,目录名后边带了空格,…...

「QT」QT5程序设计目录

✨博客主页:何曾参静谧的博客 📌文章专栏:「QT」QT5程序设计 目录 📑【QT的基础知识篇】📑【QT的GUI编程篇】📑【QT的项目示例篇】📑【QT的网络编程篇】📑【QT的数据库编程篇】📑【QT的跨平台编程篇】📑【QT的高级编程篇】📑【QT的开发工具篇】📑【QT的调…...

ConcurrentHashMap核心源码(JDK1.8)

一、ConcurrentHashMap的前置知识扫盲 ConcurrentHashMap的存储结构&#xff1f; 数组 链表 红黑树 二、ConcurrentHashMap的DCL操作 HashMap线程不安全&#xff0c;在并发情况下&#xff0c;或者多个线程同时操作时&#xff0c;肯定要使用ConcurrentHashMap 无论是HashM…...

【Python】文件 读取 写 os模块 shutil模块 pickle模块

目录 1.文件 1.1 读取操作 1.2 写操作 1.3 os&#xff1a;文件管理 1.4 os.path&#xff1a;获取文件属性 1.5 shutil&#xff1a;文件的拷贝删除移动解压缩 1.6 pickle&#xff1a;数据永久存储 1.文件 文件编码 编码是一种规则集合&#xff0c;记录内容和二进制间相互…...

PAT A1087 All Roads Lead to Rome

1087 All Roads Lead to Rome 分数 30 作者 CHEN, Yue 单位 浙江大学 Indeed there are many different tourist routes from our city to Rome. You are supposed to find your clients the route with the least cost while gaining the most happiness. Input Specific…...

浅谈HttpURLConnection所有方法详解

HttpURLConnection 类是 Java 中用于实现 HTTP 协议的基础类&#xff0c;它提供了一系列方法来建立与 HTTP 服务器的连接、发送请求并读取响应信息。下面是 HttpURLConnection 类中常用的方法以及其详细解释&#xff1a; ---------------------------------------------------…...

前端快速创建web3应用模版分享

一、起因 一直以来都有一个创建前端Dapp模版的愿望&#xff0c;一来是工作中也有这样的需要&#xff0c;避免每次都要抽离重复的代码。二来是这样的模版也能帮助其他前端快速了解到web3应用的脚手架以及框架结构。于是决定整理一个模版并开源&#xff0c;希望我的代码能帮助到大…...

越权漏洞讲解

越权漏洞是指系统或应用程序中存在的安全漏洞&#xff0c;允许攻击者以超越其授权范围的方式访问系统资源或执行特权操作。这种漏洞可能会导致严重的安全风险&#xff0c;因为攻击者可以利用它来获取敏感信息、修改系统设置或执行恶意操作。 下面是一些常见的越权漏洞类型和它…...

短视频矩阵源码系统打包.源码

Masayl是一款基于区块链技术的去中心化应用程序开发平台&#xff0c;可帮助开发者快速、便捷地创建去中心化应用程序。Masayl拥有丰富的API和SDK&#xff0c;为开发者们提供了支持。此外&#xff0c;Masayl还采用了高效的智能合约技术&#xff0c;确保应用程序的稳定、安全和高…...

云南LED、LCD显示屏系统建设,户外、室内广告大屏建设方案

LED大屏幕显示系统是LED高清晰数字显示技术、显示单元无缝拼接技术、多屏图像处理技术、信号切换技术、网络技术等科技手段的应用综合为一体&#xff0c;形成一个拥有高亮度、高清晰度、技术先进、功能强大、使用方便的大屏幕投影显示系统。通过大屏幕显示系统&#xff0c;可以…...

Shell脚本:expect脚本免交互

Shell脚本&#xff1a;expect脚本免交互 expect脚本免交互 一、免交互基本概述&#xff1a;1.交互与免交互的区别&#xff1a;2.格式&#xff1a;3.通过read实现免交互&#xff1a;4.通过cat实现查看和重定向&#xff1a;5.变量替换&#xff1a; 二、expect安装&#xff1a;1.…...

王道考研计算机网络第二章知识点汇总

2.1.1物理层基本概念 电气特性和功能特性易混淆&#xff0c;注意区分。电气特性一般指的是某个范围&#xff0c;功能特性一般指的是电平所代表的含义。 2.1.2数据通信基础知识 同步传输是指发送方和接收方节奏是统一的&#xff0c;数据之间是没有间隔的是一个一个的区块。在键…...

06.05

1.二进制求和 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 考虑一个最朴素的方法&#xff1a;先将 aaa 和 bbb 转化成十进制数&#xff0c;求和后再转化为二进制数。利用 Python 和 Java 自带的高精度运算&#xff0c;我们可以很简单地写出这…...

【虹科案例】虹科数字化仪在激光雷达大气研究中的应用

01 莱布尼茨研究所使用激光雷达进行大气研究 图 1&#xff1a;在 Khlungsborn 的 IAP 办公室测试各种激光器 大气研究使用脉冲激光束通过测量大气中 100 公里高度的多普勒频移和反向散射光来测量沿光束的温度和风速。返回的光信号非常微弱&#xff0c;会被阳光阻挡&#xff0c…...

Java抽象类介绍

1 问题 声明一个名为Employee的抽象类&#xff0c;其中包含name(姓名)和sex(性别)两个String类型的私有属性&#xff0c;并声明一个继承于Employee抽象类的子类Teacher。 2 方法 2.1 定义一个抽象类&#xff1a;Employee。 2.2 为Employee类设计一个抽象方法。 2.3实现抽象类Em…...

适配器模式的运用

文章目录 一、适配器模式的运用1.1 介绍1.2 适配器模式结构1.3 类适配器模式1.3.1 类适配器模式类图1.3.2 代码 1.4 对象适配器模式1.4.1 对象适配器模式类图1.4.2 代码 1.5 应用场景1.6 JDK源码解析1.6.1 字节流到字符流的转换类图1.6.2 部分源码分析1.6.3 总结 一、适配器模式…...

2023/6/8总结

MySQL必知必会 commit 和 rollback 的差异是commit会提交&#xff0c;而rollback不会&#xff0c;就好像是撤回。 使用保留点&#xff1a; 简单的rollback和commit语句就可以写入或者撤销整个事务处理&#xff0c;但是&#xff0c;只是对简单的事务处理才能这样做&#xff0…...

AIGC大模型之——以文生图介绍

一、什么是以文生图&#xff1f; 以文生图是AIGC ( AI Generated Content &#xff09;框架中的一个关键技术&#xff0c;通过文字描述&#xff0c;将文字转化为图像并展示出来。以文生图具有白动化程度高、精度高、可扩展性强、可定制化等优势&#xff0c;具有广泛的应用前景&…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...