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

这篇具有很好参考价值的文章主要介绍了分布式补充技术 01.AOP技术。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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来实现的。
分布式补充技术 01.AOP技术
jdk的代理就好像是使用一个新的类去继承接口,再来包含目标接口实现类
cglib是写一个子类去继承目标接口实现类。

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

 <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
运行:
分布式补充技术 01.AOP技术

AOP通知有五种:
分布式补充技术 01.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。
分布式补充技术 01.AOP技术

如果想要所有的接口实现类的运行方法报错时候有这个切面的类的AfterThrowing来处理异常,可以在bean中去写bean(*ServiceImpl)文章来源地址https://www.toymoban.com/news/detail-469200.html

到了这里,关于分布式补充技术 01.AOP技术的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 对于现有的分布式id发号器的思考 id生成器 雪花算法 uuid

    目录 雪花id tinyid uuid 分布式id特点 业务编号 数据中心编号 当前时间 ip地址 当前序号 对于时钟回拨问题 发号器机器当期时间小于redis的时间 解决步骤 发号器机器当期时间等于redis时间 发号器机器当期时间大于redis最大的时间(相关的key不存在) 分布式id的单次获取和批次获

    2024年02月13日
    浏览(39)
  • springboot实现后端防重复提交(AOP+redis分布式锁)单机情况下

    为什么要实现这个功能呢,可能用户在提交一份数据后,可能因为网络的原因、处理数据的速度慢等原因导致页面没有及时将用户刚提交数据的后台处理结果展示给用户,这时用户可能会进行如下操作: 1秒内连续点击提交按钮,导致重复提交表单。 使用浏览器后退按钮重复之

    2024年02月08日
    浏览(31)
  • hadoop01_完全分布式搭建

    Hadoop运行模式包括: 本地模式 (计算的数据存在Linux本地,在一台服务器上 自己测试)、 伪分布式模式 (和集群接轨 HDFS yarn,在一台服务器上执行)、 完全分布式模式 。 本地模式 :(hadoop默认安装后启动就是本地模式,就是将来的数据存在Linux本地,并且运行MR程序的时

    2024年02月04日
    浏览(31)
  • 聊聊分布式架构01——http通信基础

    目录 web通信的简单结构 网络通信基础TCP/IP TCP/IP 通信传输流 HTTP中的三剑客 负责传输的IP协议 确保可靠性的TCP协议 SYN攻击(SYN Flood Attack) 四次挥手 负责域名解析的DNS服务 基于 TCP 协议实现通信 TCP 协议的通信过程 Web通信的简单结构 Web 使用一种名为 HTTP(HyperText Transfer Pr

    2024年02月07日
    浏览(30)
  • DAY-01--分布式&微服务基础概念

    了解整体项目包含后端、前端、周边维护。整个项目的框架知识。   1、微服务         将应用程序 基于业务 拆分为 多个小服务,各小服务单独部署运行,采用http通信。 2、集群分布式节点         集群是个物理形态,分布式是工作方式。         集群:将几台

    2024年02月09日
    浏览(35)
  • L3上云01 | 分布式、微服务概念

    分布式系统一定是由多个节点组成的系统。 其中,节点指的是计算机服务器,而且这些节点一般不是孤立的,而是互通的。 这些连通的节点上部署了我们的节点,并且相互的操作会有协同。 分布式系统对于用户而言,他们面对的就是一个服务器,提供用户需要的服务而已,

    2024年01月18日
    浏览(34)
  • 2023-01-13 LightDB分布式部署.md

    LightDB分布式部署 分布式部署模式 常规模式部署 1.服务器列表 命令行安装 问题

    2024年02月11日
    浏览(29)
  • 【业务功能100】补充代码【业务功能88】微服务-springcloud-分布式锁-redis-redisson-springcache

    采用redisson做分布式锁,完成数据的查询接口功能getCatelog2JSONRedis 原先从mysql数据库查询的效率较低,现在将部分固定数据展示比如页面的树形栏目信息等,存储到 redis缓存 ,然后基于分布式集群,需要结合本地锁(synchronized )与分布式锁(redissonClient.getLock(“catelog2JSON-lock”

    2024年02月09日
    浏览(35)
  • Spring Cloud学习(九)【Elasticsearch 分布式搜索引擎01】

    Elasticsearch 是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。 elasticsearch 结合 kibana、Logstash、Beats,也就是 elastic stack(ELK) 。被广泛应用在日志数据分析、实时监控等领域。 elasticsearch 是 elastic stack 的核心,负责 存储、搜索、分析数据 。

    2024年02月05日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包