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

news2024/11/25 10:33:09

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

package com.company;

interface mainService{
    void send();
}
class DefaultServiceImpl implements mainService
{
    @Override
    public 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

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

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

class DefaultServiceImpl implements mainService
{
    @Override
    public void send() {
       // System.out.println("start:"+System.currentTimeMillis());
        System.out.println("hello");
      //  System.out.println("end:"+System.currentTimeMillis());
    }
}

class logDefaultImpl extends DefaultServiceImpl
{
    @Override
    public 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
{
    @Override
    public void send() {
       // System.out.println("start:"+System.currentTimeMillis());
        System.out.println("hello");
      //  System.out.println("end:"+System.currentTimeMillis());
    }
}

class logDefaultImpl extends DefaultServiceImpl
{
    @Override
    public 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
{
    @Override
    public void send() {
        System.out.println("hello");
    }
}

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

class logDefaultImpl implements mainService
{
    private mainService mainservice;
    public logDefaultImpl(mainService mainservice){
        this.mainservice=mainservice;
    }
    @Override
    public 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");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/526125.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CTSI 基金会储备透明度报告——2023 年 1 月

由于 Cartesi 代币 (CTSI) 的下一次解锁定于 2023 年 1 月 23 日&#xff0c;我们很高兴接着上一份透明度报告&#xff0c;我们本次依旧提供关于 Cartesi 基金会的治理、运营以及 CTSI 代币如何分配的另一份官方透明度报告。 提醒一下&#xff0c;为了保证诚实和可信度&#xf…

软件测试工程师简历项目经验怎么写

软件测试工程师简历项目经验怎么写 面试是我们进入一个公司的门槛&#xff0c;通过了面试才能进入公司&#xff0c;你的面试结果和你的薪资是息息相关的。 在面试之前&#xff0c;不得不聊聊简历&#xff0c;简历是职场的敲门砖&#xff0c;是拿到offer的通行证&#xff0c;那么…

【unity学习记录-场景绘制+物体碰撞,场景物体的层级关系】跟着Unity2D官方入门教程 Ruby‘ Adventure

文章目录 创建tilemap编辑一下资源&#xff0c;瓦片调色对于瓦片没有填满的情况&#xff0c;调整每片瓦片的像素 添加点小树或其他&#xff0c;调整层级给树木增加一些碰撞的效果&#xff0c;调整碰撞范围&#xff0c;角色也要添加刚体人物倒着走路的解决方法&#xff08;解决角…

线程与进程,你真得理解了吗

线程与进程&#xff0c;你真得理解了吗 1 进程与线程的关系和区别2 并行与并发3 线程共享了进程哪些资源 相信大家面试时一定没少被一个问题刁难&#xff0c;那就是进程和线程的区别是什么&#xff1f;这个问题延申开来并不像表面那么简单&#xff0c;今天就来深入一探。 开始…

个人简历html网页代码(使用chatgpt完成web开发课的实验)

使用chatgpt完成web开发课的实验 前提&#xff1a; chatgpt的使用&#xff0c;建议看https://juejin.cn/post/7198097078005841980或者自己随便找 要学会用“出国旅游”软件 vscode的基本使用 炼丹开始&#xff1a; 炼丹材料&#xff1a; 帮我写一个html页面&#xff0c;内…

沁恒 CH32V208(四): CH32V208 网络DHCP示例代码分析

目录 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置沁恒 CH32V208(二): CH32V208的储存结构, 启动模式和时钟沁恒 CH32V208(三): CH32V208 Ubuntu22.04 Makefile VSCode环境配置沁恒 CH32V208(四): CH32V208 网络DHCP示例代码分析 硬件部分 CH32V208WBU6 …

Python 网络爬虫与数据采集(一)

Python 网络爬虫与数据采集 第1章 序章 网络爬虫基础1 爬虫基本概述1.1 爬虫是什么1.2 爬虫可以做什么1.3 爬虫的分类1.4 爬虫的基本流程1.4.1 浏览网页的流程1.4.2 爬虫的基本流程 1.5 爬虫与反爬虫1.5.1 爬虫的攻与防1.5.2 常见的反爬与反反爬 1.6 爬虫的合法性与 robots 协议…

深入理解Java虚拟机:JVM高级特性与最佳实践-总结-3

深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践-总结-3 垃圾收集器与内存分配策略垃圾收集算法标记-清除算法标记-复制算法标记-整理算法 垃圾收集器与内存分配策略 垃圾收集算法 标记-清除算法 最基础的垃圾收集算法是“标记-清除”&#xff08;Mark-Sweep&#xff…

2023年推荐几款开源或免费的web应用防火墙

2023年推荐几款开源或免费的web应用防火墙 2023年&#xff0c;数字经济将强势崛起&#xff0c;并且成为新一轮经济发展的动力&#xff0c;传统的黑客破坏性攻击如CC&#xff0c;转为更隐蔽的如0day进行APT渗透。所以无论私有服务器还是云厂商如Cloudflare、阿里云、腾讯云等都…

无线安全操作(2)

目录 用户隔离 用户隔离介绍 1、集中式转发方式 2、分布式转发方式 用户隔离配置 用户隔离举例 用户静默排错帮助 ARP抑制 ARP抑制介绍 ARP抑制配置 ARP抑制举例 动态黑名单 动态黑名单概述 动态黑名单配置 动态黑名单举例 动态黑名单排错帮助 无线SAVI 无线…

正月初八,公司复工,我却失业了

昨天&#xff0c;一条吐槽刷屏。 方便大家阅读&#xff0c;原文先贴出来&#xff1a; 正月初八&#xff0c;公司复工&#xff0c;我却失业了。 一大早地铁转公交赶在九点前到达&#xff0c;老板在大门口迎接我们的到来&#xff0c;还发了一个红包&#xff0c;心里暖暖的。 到了…

以太坊EVM源码分析学习记录

EVM 待办清单结构与流程2020年版本的evm结构大致流程 opcodes.gocontract.goanalysis.gostack.gostack_table.goMemory.goMemory_table.goEVM.go区块上下文交易上下文EVM结构以太坊中的调用call、callcode和delegatecall创建合约 interpreter.gojump_table.goinstructions.goga…

极为罕见的大学生现象 凤毛麟角 是参加这种竞赛

大学里有哪些含金量较高&#xff0c;涉及到综合素质加分的竞赛呢&#xff1f; 一定要耐心耐心的看完 对你现在的境地会很有帮助&#xff01;&#xff01;&#xff01; 大学生竞赛大致可以分为综合类和学科类两种。 综合类竞赛面向的范围更大&#xff0c;各个专业的学生均可参…

区块链论文一般发表在哪些地方?

区块链论文一般发表在哪些地方&#xff1f; 区块链论文发表区块链会议区块链会议论文阅读列表区块链相关论文查询论文检索网站 区块链论文发表 会议类&#xff1a; 安全、密码、分布式理论方面的会议&#xff1a;IEEE S&P (Oakland),、ACM CCS,、IACR Crypto、IACR Eurocr…

高通Camera IFE时钟配置

本文主要分享高通camera驱动中minHorizontalBlanking&#xff08;最小水平消隐&#xff09;和minVerticalBlanking&#xff08;最小垂直消隐&#xff09;配置项的计算方法&#xff1b; IFE时钟频率由以下sensor参数所决定&#xff1a; 对应sensor mode的输入IFE的帧尺寸(width…

微信小程序源码1000套

简介 不懂开发&#xff0c;但又想拥有自己的小程序怎么办&#xff1f;或者想要基于某个小程序框架做二次开发&#xff1f;如下截图&#xff0c;免费提供1000套微信小程序源码包合集&#xff08;收集过程中发现网上资源大部分居然还要收费&#xff0c;真的很无语&#xff0c;人…

【TypeScript】TS条件类型(十)

🐱 个人主页:不叫猫先生 🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫优质专栏:vue3从入门到精通、TypeScript从入门到实践 📢 资料领取:前端进阶资料以及文中源…

【burpsuite安全练兵场-服务端9】服务端请求伪造SSRF漏洞-7个实验(全)

前言&#xff1a; 介绍&#xff1a; 博主&#xff1a;网络安全领域狂热爱好者&#xff08;承诺在CSDN永久无偿分享文章&#xff09;。 殊荣&#xff1a;CSDN网络安全领域优质创作者&#xff0c;2022年双十一业务安全保卫战-某厂第一名&#xff0c;某厂特邀数字业务安全研究员&…

UI自动化测试框架之cypress

​ 官网地址&#xff1a;JavaScript End to End Testing Framework | cypress.io testing tools cypress由一个免费的、开源的、本地安装的应用程序和一个用于记录您的测试的仪表服务组成。是前端测试的工具&#xff0c;解决开发人员和QA工程师在测试应用程序时面临的关键痛点…

跟光磊学Java-Windows版Java17开发环境搭建

如果想要开发Java程序/Java项目之前&#xff0c;必须要安装和配置JDK&#xff0c;这里的JDK表示Java17&#xff0c;不过下载软件的时候&#xff0c;强烈推荐大家一定要去软件的官网下载,因为官网提供的软件版本是最新的&#xff0c;会修复旧版本遗留的问题&#xff0c;这样我们…