Spring AOP

目录

1、AOP理解

2、使用场景

3、AOP组成

3.1、切面(类)

3.2、切点(方法)

3.3、通知(方法具体实现代码)

3.4、连接点

4、实现AOP

4.1、添加Spring Boot AOP框架

4.2、创建切面和切点

4.3、创建通知

4.3.1、前置通知方法

4.3.2、后置通知方法

4.3.3、环绕通知方法

4.4、创建连接点

5、Spring AOP实现原理

5.1、JDK动态实现

5.2、CGLIB动态实现

5.3、JDK和CGLIB实现的区别

5.3.1、JDK

5.3.2、CGLIB

6、AOP和IoC的区别


1、AOP理解

AOP:是面向切面编程,是一种思想,对某一类事情的集中处理

举个例子例子来说明:例如你访问一个网站(可以登录的那种),登录后服务器这边是判定你登录状态的,进入每个页面也都会判定一下,如果没有被判定为登录,就会跳转到登录页面进行登录,那每个也页面都需要写一个判定登录,这不就很麻烦了嘛(代码冗余)

使用AOP思想:我们只需要在某一处配置一下,所有需要的判断用户登录页面,全部可以实现用户验证,不再需要每个页面都写一遍验证代码

2、使用场景

前面举例登录验证就是一个比较常用的场景,处理登录注册都会使用到AOP,当然也不仅止于登操作,对于这种功能统一,且使用的地方较多的功能,就可以考虑AOP来统一处理

实现场景:
<1>统一日志记录

<2>统一方法执行时间统计格式

<3>统一的返回格式设置

<4>统一的异常处理

<5>事务的开启和提交等

也就是说使用AOP可以扩充多个对象的某个能力,针对原来的OOP(面向对象)算是一个升级版的

3、AOP组成

3.1、切面(类)

切面是指某一方面的具体内容就是一个切面的,判定用户登录就是一个切面,时间格式统一处理也是一个切面,就是我们要通过AOP执行的一个具体内容

3.2、切点(方法)

在执行后,但尚未执行完,进行拦截验证,我们需要判定的内容

制作一个规则作为拦截处理(定义拦截规则)

3.3、通知(方法具体实现代码)

切点有了,操作是拦截下来,总要干点什么吧

执行AOP逻辑业务(以下会通过代码给友友们演示其作用)

<1>前置通知:在目标方法(真正要执行的方法)调用之前执行的通知(涉及注解@Before)

<2>后置通知:在目标方法调用之后执行的通知(涉及注解@After)

<3>环绕通知:在目标方法调用前、后都会执行的通知(涉及注解@Around)

<4>异常通知:在目标方法抛出异常的时候执行的通知(涉及注解@AfterThrowing)

<5>返回通知:在目标方法返回的时候执行通知(涉及注解@AfterReturning)

3.4、连接点

所有可能触发切点的点叫做“连接点”

举个例子:

 4、实现AOP

4.1、添加Spring Boot AOP框架

我们先创建一个Spring boot项目,以下我们直接跳转到选择依赖的部分和版本,因为我这里使用的是JDK8所以使用2版本的,如果友友使用的是JDK17以上包括JDK17的这里使用3版本的( 友友们不是很了解前面的创建步骤的,可以看看 这篇博客)

 这里会有友友们问为啥这里不添加spring AOP的依赖,其实这里是搜不到的,所以我们需要自己去引入,引入之前先做好一系列前置操作

 我们去maven仓库,引入一下依赖(直接在浏览地址栏中输入mvn既可):

 将依赖放入pom.xml文件中:我这里也直接给出依赖(不加版本的依赖,Spring boot会自己帮你配置对应的版本)

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

 4.2、创建切面和切点

这些操作都算是工具或者组件,就把他们放在common层或者config层就行

我们这里就拿common层为例:

@Aspect    //注解就是一个切面那个单词
@Component    //不能省略 为啥嘞??我们得随着项目一起启动,要么要我们干啥
public class UserAOP {

    //切点  (配置拦截规则) AspectJ的语法
    @Pointcut("execution(* com.example.demo.controller.Usercontroller).*(..)")
    public void pointcut(){
        
    }
}

注:pointcut方法就是一个空方法,它不需要有方法体,此方法名就是起到一个“标识”的作用,标识下面的通知方法具体指的是哪个切点(切点可能会是多个)

这里@Pointcut注解就是切点的注解,参数内容是什么意思,先接收一点基础内容:

AspectJ支持三种通配符

*:匹配任意字符,只匹配一个元素(包,类,方法和方法参数)

..:匹配任意字符,可以匹配的多个元素,在表示类时,必须和*联合使用

+:表示按照类型匹配指定类的所有类,必须跟在类名后⾯,如 com.cad.Car+ ,表示继承该类的
所有⼦类包括本身

execution()是最常用的切点函数,用来匹配方法,语法为:

execution(<修饰符><返回类型><包。类.方法(参数)><异常>)

就拿我们写的这个来解释一下

这里为什么没有看见 修饰符和异常呢,修饰符和异常可以写也可以不写,修饰符不写的时候,我们想写什么修饰的就写什么修饰的,也就不用注意了(修饰符是啥:public ,private这些就是)

简单的看几个案例来理解execution():

execution(* com.example.demo.User.*(..)):配置User类中的所有方法

execution(* com.example.demo.User+*(..)):匹配User类以及User子类的所有方法

execution(* com.example.demo.*+*(..)):匹配 com.example.demo包下的所有类的所有方法

execution(*addUser(String,int)):匹配addUser方法,且第一个参数类型是String,第二个参数类型int

4.3、创建通知

通知就是以上提及的5种,切点拦截了,该通过“通知”来写逻辑业务了(这里我们就写3种通知方法作为演示)

4.3.1、前置通知方法

这里注解@Before中参数就是我们写切点时的标识方法

    @Before("pointcut")
    public void doBefore(){
        System.out.println("执行了前置通知:"+ LocalDateTime.now());
    }

4.3.2、后置通知方法

只有注解不同

    @After("pointcut")
    public void doAfter(){
        System.out.println("执行了后置通知"+LocalDateTime.now());
    }

4.3.3、环绕通知方法

环绕通知是什么意思:就是既执行前置方法,也执行后置方法,但是它的前置方法和后置方法与@Before注解和@After注解不是同一个(一会创建连接点了给友友们展示结果)

    //环绕通知
    @Around("pointcut")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("前置执行环绕通知");
        Object obj=joinPoint.proceed();
        System.out.println("后置执行环绕通知了");
        return obj;
    }

这里需要注意的就是两个点,一个是ProceedingJoinPoint类,它就是一个连接点的操作类,通过它定义的参数进行控制,如果你只想执行“前置执行环绕通知”那执行就是,不需要执行ProceedingJoinPoint类定义的参数操作,这里joinPoint.proceed()就是允许继续执行,它就是这里所有通知老大,它决定是否还继续执行

4.4、创建连接点

创建连接点,就是创建我们要操作涉及AOP的方法(这里主要时为了演示,没有实际意义):

@RestController
public class UseController {
    @RequestMapping("/user/sayhi")
    public String sayhi(){
        System.out.println("执行了 sayhi 方法");
        return " spring boot  aop ";
    }
}

 运行结果及分析:

 5、Spring AOP实现原理

Spring AOP是以代理的基础上实现的;说到代理就被划分为动态代理和静态代理

静态代理:程序运行前就已经定义好代理类,写固定了,需要为每一个被代理对象创建一个代理类,不灵活

动态代理:通过反射机制动态地生成代理类,代理类与被代理类实现相同的接口或者继承相同的父类,并在方法调用前后进行额外的操作,在实现的技术⼿段上,都是在 class 代码运⾏期,动
态的织⼊字节码

Spring AOP基于动态代理,Spring对AOP的支持局限于方法的拦截

Spring AOP支持JDK Proxy和CGLIB方式实现动态代理。默认情况下,实现了接口的类,这个接口类就是AOP基于JDK生成代理类,没有实现接口类的话就会基于CGLIB生成代理类

Spring AOP代理

<1>CGLIB的动态代理框架,主要作用就是根据目标类和方法,动态生成代理类

<2>Java中的动态代理框架,几乎都是依赖字节码框架(ASM,Javassist等)实现的

注:字节码框架直接操作class字节码的框架,可以加载已有的class字节码文件信息,修改部分信息,或动态生成一个class

这个代理是怎么进行处理的:

调用者想要调用目标对象,前面说了AOP是干什么的了,拦截嘛,所以代理会帮我们先进行调用过滤掉一些不需要的,再将目标对象交给调度者

织入(Weaving):代理生成的时机

织入是把切面用到目标对象并创建新的代理对象的过程,切面在指定的连接点被织入到目标对象中

织入时机:

<1>编译期:切面在目标类编译时期被织入,例如:lombok在编译时期就生成的代码,编译过后就会生成字节码

<2>类加载期:切面在目标类加载的JVM时被织入,例如JVM有一个垃圾回收的类,JVM启动时这个垃圾回收的线程就会启动也就是类加载时期进行织入的

<3>运行期:切面在应用执行时刻被织入,例如:AOP容器会为目标对象动态一个代理对象,Spring AOP的这个代理在运行时才会织入

5.1、JDK动态实现

JDK实现,先通过实现InvocationHandler接口创建方法调用处理器,再通过Proxy来创建代理类

下面简单了解一下:

import com.example.demo.service.UserService;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKDynamicProxy implements InvocationHandler {
    //⽬标对象即就是被代理对象
    private Object target;
    public  JDKDynamicProxy( Object target) {
        this.target = target;
    }
    //proxy代理对象
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //<1>.安全检查
        System.out.println("安全检查");
        //<2>.记录⽇志
        System.out.println("记录⽇志");
        //<3>.时间统计开始
        System.out.println("记录开始时间");
        //5、通过反射调⽤被代理类的⽅法 也就是接口过来重写的方法
        Object retVal = method.invoke(target, args);
        //<4>.时间统计结束
        System.out.println("记录结束时间");
        return retVal;
    }
    public static void main(String[] args) {
        //1、 实例 ,重写了接口的方法,但是这里不会执行内部重写的方法
        UserService target= new UserService() {
            @Override
            public void sayhi() {
                System.out.println("hello world");;
            }
        };
        //2、⽅法调⽤处理器
        InvocationHandler handler =
                new JDKDynamicProxy(target);
        //3、创建⼀个代理类:通过被代理类、被代理实现的接⼝、⽅法调⽤处理器来创建
        UserService proxy = (UserService) Proxy.newProxyInstance(
                //第一个参数是代理类,我们开始创建的
                target.getClass().getClassLoader(),
                //第二参数是被代理实现的接口
                new Class[]{UserService.class},
                //方法嗲用处理器
                handler
        );
        //4、这里的 proxy 代理 在调用目标方法时就会 调用 到 invoke 最后再调用目标方法
        proxy.sayhi();
        //System.out.println(proxy.sayhi());
    }
}

注:这里的 UserService是我们自己写的接口,友友们如果是想复制看看效果一定要自己写一个接口放上去

运行结果:

 5.2、CGLIB动态实现

CGLIB不需要通过接口来实现动态代理,而是通过被代理类的子类作为代理

我们创建的类需要实现MethodInterceptor接口重写intercept方法,也就是我们现在写的

import com.example.demo.service.ArticleService;
import com.example.demo.service.UserService;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CGLIBDynamicProxy implements MethodInterceptor {

    //被代理对象
    private Object target;
    public CGLIBDynamicProxy(Object target){
        this.target = target;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        //<1>.安全检查
        System.out.println("安全检查");
        //<2>.记录⽇志
        System.out.println("记录⽇志");
        //<3> .时间统计开始
        System.out.println("记录开始时间");
        //3、通过CGLIB的代理⽅法调⽤
        Object retVal = methodProxy.invoke(target,args);
        //<4>.时间统计结束
        System.out.println("记录结束时间");
        return retVal;
    }
    public static void main(String[] args) {
        //1、实例 该接口一个子类作为动态代理类
        UserService target=new ArticleService();
        //1、开始创建CGLIB动态代理: 第一参数被代理类的子类 第二个参数 实例一个将被代理类的子类
        UserService proxy= (UserService) Enhancer.create(target.getClass(),new CGLIBDynamicProxy(target));
        //2、代理执行
        proxy.sayhi();
    }
}

注:这里UserService是接口,ArticleService一个类继承了UserService接口 

5.3、JDK和CGLIB实现的区别

5.3.1、JDK

<1>JDK 动态代理是基于接口实现的,它要求被代理对象实现一个接口,通过 InvocationHandler 及 Proxy在运⾏时动态的在内存中⽣成了代理类对象,该代理类是在运⾏期时,动态的织⼊统⼀的业务逻辑字节码来完成

性能:JDK动态代理性能相对较高,生成代理对象速度较快

代理条件:JDK动态代理无法代理fina类和final方法

5.3.2、CGLIB

 <1>CGLIB 动态代理则是通过继承被代理对象来实现的,它不需要被代理对象实现接口,而是直接生成一个被代理对象的子类作为代理对象

性能:CGLIB动态代理性能相对较低,生成代理对象较慢

代理条件:CGLIB动态代理可以代理任意类的方法,但是CGLIB被代理类不能是final修饰的最终类

注:JDK8以后包括JDK8版本,JDK动态代理优化后相比CGLIB性能好

6、AOP和IoC的区别

相似之处:Spring AOP就提供了AOP思想的框架,它俩的关系类似于:IOC是思想和DI是IoC的实现

不同之处:

AOP通过动态代理机型方法级别的拦截,调用者调用目标方法会先通过动态代理,在再拿到目标方法(总的来说其实还是自己去调用的方法)

 相比IoC容器,IoC是将对象都实例好存储Spring中,调用的时候也通过Spring拿的(通过Spring获取对象后进行调用, Spring中的IoC)

学习自省
关注 关注
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringAOP(图文详解)
lhj520cb的博客
07-16 4万+
Spring实现的AOP是代理模式,给调用者使用的实际是已经过加工的对象,你编程时方法体里只写了A,但调用者拿到的对象的方法体却是xAy。x和y总还是需要你来写的,这就是增强。x和y具体在什么时候被调用总还是需要你来规定的,虽然是基于约定的声明这种简单的规定,这就是切点。
Spring AOP全面详解(超级详细)
热门推荐
Cr1556648487的博客
09-09 8万+
AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术,如下图所示:AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离,比如Spring的事务,通过事务的注解配置,Spring会自动在业务方法中开启、提交业务,并且在业务处理失败时,执行相应的回滚策略。
SpringAOP学习--SpringAOP简介及原理
u012098021的博客
05-15 6万+
前文对AOP做了介绍,实际项目中,一般不会直接上手手动实现aop,而是使用一些高级封装的aop实现,如SpringAOPSpring是一个广泛应用的框架,SpringAOP则是Spring提供的一个标准易用的aop框架,依托Spring的IOC容器,提供了极强的AOP扩展增强能力,对项目开发提供了极大地便利。 前文提到AOP的实现有AspectJ、JDK动态代理、CGLIB动态代理,SpringAOP不是一种新的AOP实现,其底层采用的是JDK/CGLIB动态代理。 JDK动态代理回顾 上一篇简单介绍了
spring aop详解
hanbin1998的博客
04-13 6236
1.前言 spring aop是一个面向切面的编程,在自己第一遍学习的时候,感觉aop没有什么作用,但是真实接触下来,感觉spring aop还是很有用途的,感觉自己之前的想法太年轻了。 2.概念 Spring 提供了两种AOP 的实现:基于注解式配置和基于XML配置,我这里主要就是介绍一下,基于注解式配置。 2.1 AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。 所谓的核心业务,工作中做的最多的
Spring AOP详解
chongbaozhong的博客
05-26 3763
前言 什么是AOP AOP (Aspect Orient Programming),直译过来就是 面向切面编程。AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。面向对象编程将程序抽象成各个层次的对象,而面向切面编程是将程序抽象成各个切面,是Spring的核心思想之一。 AOP 实现分类 AOP 要达到的效果是,保证开发者不修改源代码的前提下,去为系统中的业务组件添加某种通用功能。AOP 的本质是由 AOP 框架修改业务组件的多个方法的源代码,按照 AOP 框架修改源代码的时机,可以将其分为两类:
spring aop参数传递
weixin_43931625的博客
04-23 2716
spring aop参数传递
spring aop 注解
面朝大海,春暖花开
02-27 3386
spring Aop 注解 Aop 术语 AOP 的特性术语,不同的翻译还会不一样,得在过程中理解 横切关注点:跨越程序多个模块的方法或功能。即与业务逻辑无关,但我们也要关注的部分,就是横切关注点。如日志、安全、缓存等。 切面( Aspect ):横切关注点被模块化的特殊对象;即切面应是一个类。 通知( Advice):切面要完成的增强处理,通知描述了切面何时执行以及如何执行增强处理;即通知应是切面中的方法。 目标( Target ):被通知对象。 代理( Proxy ):向目标对象应用通知之后创建的对象
Spring AOP 动态代理
qq15035899256的博客
08-30 1728
本文是Spring AOP的学习,学习AOP的思想,AOP的使用(定义切面、切点和通知),以及两种常用的AOP使用方法。之后的学习内容将持续更新!!!
Spring——Spring AOP原理
庄小焱
03-30 2672
AOP即面向切面编程,是OOP编程的有效补充。使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统。从而避免了在业务逻辑的代码中混入很多的系统相关的逻辑.AOPSpring提供的关键特性之一,本文深入剖析Spring AOP的原理。
Spring AOP 代码加案例详解
持续学习,持续更新
04-27 2704
学习AOP就要先学习代理模式,这样AOP的学习就简单了。代理模式是Java常见的设计模式之一,包含:静态代理和动态代理。通过案例感受静态代理:租房子问题。房东需要将房子出租,如果都亲力亲为太麻烦了:房东要自己出去贴广告,带租客看房,讨价还价,签合同,收租金,定期检查房子,定期保洁。这时候就需要中介代理了,房东就是要租房拿钱,额外的功能:签合同,讨价还价,定期检查房子 ,定期保洁都由中介代理去做,所以 代理 简化了 业主的功能,同时对房东的功能做了一个扩展。找中介的好处:(1)保护真实对象 (房东) (2
Spring AOP 16道面试题及答案.docx
06-29
Spring AOP,全称为Aspect Oriented Programming,是面向切面编程的一种编程范式,它是对传统的面向对象编程(OOP)的一种补充。在OOP中,核心是对象,而在AOP中,核心则是切面。切面是关注点的模块化,即程序中的...
SpringAOP:Spring AOP示例
05-06
SpringAOP Spring AOP(面向方面​​的编程)用于模块化“横截面”服务。 用一种简单的方式,我们可以说它是一个旨在拦截某些进程的组件,例如,在执行某个方法时,Spring AOP可以审核该执行方法,并在该方法执行...
Spring源码最难问题:当Spring AOP遇上循环依赖.docx
06-15
Spring源码最难问题:当Spring AOP遇上循环依赖 Spring源码中最难的问题之一是循环依赖问题,当Spring AOP遇上循环依赖时,该如何解决? Spring通过三级缓存机制解决循环依赖的问题。 在Spring中,bean的实例化...
spring AOP 引入jar包,spring IOC 引入Jar包
09-07
Spring AOPSpring IOC 是 Spring 框架的两个核心组件,它们对于任何基于 Java 的企业级应用开发都至关重要。Spring AOP(面向切面编程)允许开发者在不修改源代码的情况下,通过“切面”来插入新的行为或增强已...
SpringCloud】Spring Cloud 开发环境搭建与基础工程构建
Hsusan的博客
09-15 1789
Oracle从JDK9开始每半年发布⼀个新版本, 新版本发布后, ⽼版本就不再进⾏维护. 但是会有⼏个⻓期维护的版本.⽬前⻓期维护的版本有: JDK8, JDK11, JDK17, JDK21在 JDK版本的选择上,尽量选择⻓期维护的版本.为什么选择JDK17?
Spring Session
2401_84881237的博客
09-18 420
它把 servlet 容器实现的 httpSession 替换为 spring-session ,Session 信息存储在 Redis 或其它数据库中统一管理,解决了 session 共享的问题。Spring Session 是 Spring 家族中的一个子项目,Spring Session 提供了用于管理用户会话信息的 API 和实现。在 Web 项目开发中,Session 会话管理是一个很重要的部分,用于存储与记录用户的状态或相关的数据。
springboot每次都需要重设密码?明明在springboot的配置中设置了密码
最新发布
Mero技术博客
09-21 173
接着,修改redis的配置文件,找到redis的安装目录,找到相关的conf文件,找到#requirepass,打开redis-cli.exe,输入config get requirepass,查看当前的密码是什么?第二步:重启redis服务生效。第一步:查看当前的密码是什么?去掉# 修改密码。
SpringBoot中基于Mybatis-Plus多表联查(无xml,通过注解实现)
weixin_45653328的博客111
09-19 705
主要是第三个@Result,通过javaType=List.class,many=@Many来指定这个Result的属性(通过CourseMapper中的方法来查询这个list集合)注意:要写方法名的全名称,包名+类名+方法名。@Results注解:有个id属性,可以理解为定义了一个方法,可以通过id引用,引用方式:ResultMap(“”)。首先,外部查询出这个学生对象,在@Results注解内,表示返回的实际结果集,学生id,学生name,课程Course对象的list集合。下面我们就学生来解决。
spring aop
09-11
Spring AOP(Aspect-Oriented Programming)是Spring框架中的一个重要特性,它提供了一种在应用程序中实现横切关注点(cross-cutting concerns)的方法。所谓横切关注点,指的是那些在应用程序中散布于各个模块之中、具有共同逻辑的行为,例如日志记录、事务管理、安全检查等。 通过使用Spring AOP,开发者可以将这些横切关注点从业务逻辑代码中剥离出来,以便于在不同模块中重复使用,并且能够更好地实现模块化开发。Spring AOP基于AOP的思想,通过在运行时动态地将横切关注点织入到目标对象的方法中,实现了与业务代码的解耦。 Spring AOP主要通过定义切面(Aspect)和连接点(Join Point)来实现,其中切面定义了横切关注点的逻辑,而连接点则指定了在目标对象中哪些方法需要织入切面逻辑。Spring AOP支持多种类型的通知(Advice),包括前置通知(Before Advice)、后置通知(After Advice)、异常通知(After-Throwing Advice)、返回通知(After-Returning Advice)和环绕通知(Around Advice),开发者可以根据需要选择合适的通知类型。 总的来说,Spring AOPSpring框架中的一个重要特性,它通过在运行时动态地将横切关注点织入到目标对象的方法中,实现了对应用程序中横切关注点的解耦,提高了代码的可维护性和可重用性。
写文章

热门文章

  • LoadRunner操作教程 6157
  • 回溯算法(例题详细解析) 4478
  • 动态规划(详细解释) 4064
  • Spring Cloud Gateway整合Sentinel 3468
  • 二叉树(详解初) 3127

分类专栏

  • Set和Map 2篇
  • JavaScript 1篇
  • 网络编程理论 5篇
  • 算法 3篇
  • 排序算法 1篇
  • 网络编程 1篇
  • IO文件操作 1篇
  • 优先级队列 2篇
  • 二叉树 4篇
  • 栈和队列 1篇
  • java初识 2篇
  • 数据类型 1篇
  • 预处理 1篇
  • 程序环境 1篇
  • 文件操作 1篇
  • 字符串函数实现 1篇
  • 内存函数实现 1篇
  • 动态开辟 1篇
  • 枚举 1篇
  • 共用体 1篇

最新评论

  • LoadRunner操作教程

    学习自省: 链接:https://pan.baidu.com/s/1Qc4XCDpqnBmprka22wYhMw?pwd=toa2 提取码:toa2 百度网盘自取下哈

  • LoadRunner操作教程

    qs灯火: 您好 我能用您这个版本学习一下吗

  • LoadRunner操作教程

    学习自省: 你下载也是这个版本吗

  • LoadRunner操作教程

    qq_68477329: 您好 为什么我找不到WebTours

  • LoadRunner操作教程

    学习自省: 已私信回复

大家在看

  • 基于SpringBoot +JSP+MySQL的商城项目
  • C++原始指针的补充 781
  • 基于JAVA+SpringBoot+Vue的华强北商城二手手机管理系统 1215
  • Java基础面试题——异常 1
  • 给 Solidity 开发者的 Starknet 开发指南

最新文章

  • Selenium常用命令(python版)
  • 二分法问题
  • 全排列问题
2024年13篇
2023年51篇
2022年37篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司怎么做网站排名优化郑州家装行业网站优化推广方案无为网站优化北京移动网站优化平台已解决网站推广优化钢然丷云速捷开封新站网站优化平台南平网站运营优化营销网站关键词优化 快排合同大田县网站排名优化新绛网站优化哪家强沁阳百度网站优化报价安庆网站排名优化公司巢湖个人网站优化电话罗湖外贸网站优化计划金华网站seo优化方案如何提高外贸企业网站优化网站数据库优化双域网站怎么优化网站 优化蓦然易 速达许昌企业网站优化外包黄骅网站优化排名河北网站优化公司网站优化到首页免费培训seo网站优化技术镇远网站关键词优化咸宁外包网站优化价格网站优化策划书大数据网站优化越来越好优化网站知道云速捷龙口上市公司网站优化公司歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化