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

Java AOP Framework概述

Java AOP Framework概述

  • 1. AspectJ
    • 1.1 使用AspectJ进行切面编程
  • 2. Spring AOP
    • 2.1 使用Spring AOP进行切面编程
    • 2.2 如何决定使用哪种动态代理
    • 2.3 如何通过配置指定代理方式
    • 2.4 Spring AOP和AspectJ的关系
  • 3. Spring Boot AOP
  • 4. 扩展
    • 4.1 AspectJ织入方式详解
  • 参考

在这里插入图片描述

Java常用的AOP框架有AspectJ、Spring AOP、Javassist、Guice、Byte Buddy等;本文主要介绍AspectJ的功能示例,Spring AOP的主要功能、代码示例、以及自动代理的配置和实现。并简要介绍了Spring AOP和AspectJ的关系,以及Spring AOP在Spring Boot自动配置时不同版本的差异。

1. AspectJ

AspectJ是一个基于Java语言的强大的面向切面编程(AOP)框架。它扩展了Java语言,提供了更丰富的AOP功能,并且与Java语言紧密集成。

AspectJ提供了一种在编译时或运行时织入切面逻辑的方式,以实现横切关注点的处理。它支持在方法调用、方法执行、字段访问和异常处理等连接点上应用切面逻辑。

以下是AspectJ的一些主要特点和功能:

  1. 丰富的切入点表达式:AspectJ提供了灵活且强大的切入点表达式语言,可以精确地选择要应用切面的连接点。

  2. 多种类型的通知:AspectJ支持多种类型的通知,包括前置通知、后置通知、返回通知、异常通知和环绕通知。这些通知可以在切点的不同阶段执行切面逻辑。

  3. 切面继承和优先级:AspectJ支持切面之间的继承关系和优先级设置,可以灵活地组织和管理切面。

  4. 静态织入和动态织入:AspectJ支持在编译时进行静态织入,以及在运行时通过字节码增强进行动态织入。这使得切面逻辑可以在不同的阶段应用到目标代码中。

  5. 强大的切面编程能力:AspectJ提供了丰富的切面编程能力,包括引入新的成员变量和方法到目标类中,修改现有的类和方法,以及对切点进行动态绑定等。

  6. 与Spring集成:AspectJ与Spring框架紧密集成,可以与Spring AOP无缝协作,提供更强大的AOP功能。

总体而言,AspectJ是一个功能强大且灵活的AOP框架,可以帮助开发人员更好地实现横切关注点的处理。它提供了丰富的特性和语法,使得切面编程变得更加简单和直观。无论是在JavaEE应用程序还是在Spring应用程序中,AspectJ都是一个非常有用的工具。

1.1 使用AspectJ进行切面编程

下面是一个逐步指南,介绍如何使用AspectJ进行切面编程:

  1. 添加AspectJ依赖:在项目的构建文件(如Maven的pom.xml或Gradle的build.gradle)中添加AspectJ的依赖项。

  2. 定义切面类:创建一个Java类,用于定义切面逻辑。可以使用@Aspect注解来标识该类为切面类。

import org.aspectj.lang.annotation.Aspect;@Aspect
public class MyAspect {// 切面逻辑代码
}
  1. 定义切点:在切面类中,使用@Pointcut注解定义切点,即指定在哪些方法或类上应用切面逻辑。
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;@Aspect
public class MyAspect {@Pointcut("execution(* com.example.MyClass.myMethod(..))")public void myPointcut() {}
}
  1. 定义通知:在切面类中,定义各种通知类型的方法,如前置通知、后置通知、环绕通知等。使用@Before@After@Around等注解来标识通知类型。
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;@Aspect
public class MyAspect {@Before("myPointcut()")public void beforeAdvice() {// 在切点方法执行前执行的逻辑}
}
  1. 配置织入:根据使用的方式(静态织入或动态织入),配置编译器或运行时织入器来将切面逻辑织入到目标代码中。
  • 静态织入:使用AspectJ编译器,在编译期间将切面织入到目标代码中。可以使用AspectJ编译器命令行工具或IDE插件来进行编译。

  • 动态织入:在运行时使用AspectJ织入器,通过Java命令行参数或配置文件指定织入器。

以上是使用AspectJ进行切面编程的基本步骤。根据具体的需求和场景,可以进一步扩展和配置切面逻辑,使用AspectJ提供的更多特性和语法。

2. Spring AOP

Spring AOP(Aspect-Oriented Programming)是Spring框架提供的一种轻量级的AOP框架。它通过在运行时动态地将切面逻辑织入到应用程序中,实现了横切关注点的处理。

以下是Spring AOP的一些主要特点和功能:

  1. 基于代理的AOP:Spring AOP使用代理模式来实现AOP。它通过创建目标对象的代理对象,并将切面逻辑织入到代理对象中,从而实现对目标对象方法的增强。

  2. 切点和通知:Spring AOP支持使用切点(Pointcut)来定义需要应用切面逻辑的连接点,例如方法调用或字段访问等。它提供了多种类型的通知(Advice),包括前置通知(@Before)、后置通知(@After)、返回通知(@AfterReturning)、异常通知(@AfterThrowing)和环绕通知(@Around),以实现在切点处执行的切面逻辑。

  3. 自动代理:Spring AOP支持自动代理,可以根据配置自动创建代理对象,并将切面逻辑织入到目标对象中。通过使用@EnableAspectJAutoProxy注解或配置文件中的<aop:aspectj-autoproxy>元素,可以启用自动代理功能。

  4. 切面的模块化:Spring AOP支持将切面逻辑模块化,可以将切面逻辑定义为一个独立的切面类,以实现切面逻辑的重用和解耦。

  5. 与Spring框架集成:Spring AOP与Spring框架无缝集成,可以与其他Spring特性(如依赖注入)一起使用,提供更强大的功能和灵活性。

  6. 不支持跨类的切面织入:Spring AOP基于代理模式实现,只能对方法级别的连接点进行切面织入,不支持跨类的切面织入。

总的来说,Spring AOP是一个简单而强大的AOP框架,可以帮助开发人员实现横切关注点的处理。它提供了基于代理的AOP机制、切点和通知的灵活组合、自动代理的支持以及与Spring框架的无缝集成。通过使用Spring AOP,开发人员可以更轻松地实现日志记录、事务管理、性能监控等横切关注点的功能。

2.1 使用Spring AOP进行切面编程

下面是一个使用注解的示例,演示如何使用Spring AOP来记录方法执行时间:

  1. 引入依赖:确保项目中包含Spring AOP的相关依赖。

  2. 定义切面:创建一个切面类,并使用@Aspect注解进行标记。

@Aspect
@Component
public class LoggingAspect {// 定义切点,匹配所有的public方法@Pointcut("execution(public * com.example.MyService.*(..))")public void publicMethods() {}// 编写通知,在方法执行前和执行后记录执行时间@Around("publicMethods()")public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {long startTime = System.currentTimeMillis();Object result = joinPoint.proceed();long endTime = System.currentTimeMillis();long executionTime = endTime - startTime;System.out.println(joinPoint.getSignature() + " 执行时间:" + executionTime + "ms");return result;}
}
  1. 配置AOP:使用@EnableAspectJAutoProxy注解启用自动代理。
@SpringBootApplication
@EnableAspectJAutoProxy
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args);// ...MyService myService = context.getBean(MyService.class);myService.doSomething();// ...}
}

在上述示例中,我们创建了一个切面类LoggingAspect,并在其中定义了一个切点publicMethods(),它匹配com.example.MyService类中的所有public方法。然后,我们使用@Around注解编写了一个通知,用于在方法执行前和执行后记录执行时间。

通过在应用程序的主类上添加@EnableAspectJAutoProxy注解,我们启用了自动代理,使得Spring能够自动创建代理对象并织入切面逻辑。

当运行应用程序时,每次调用MyService类中的方法时,切面逻辑将记录方法的执行时间,并输出到控制台。

这个示例演示了如何使用注解来定义切面和通知,以及如何配置和启用自动代理。通过使用注解,我们可以更简洁地定义切面逻辑,并将其与特定方法或类关联起来。

2.2 如何决定使用哪种动态代理

在Spring AOP中,默认情况下,自动代理使用基于Java动态代理(Java Dynamic Proxy)实现。

Java动态代理是Java语言提供的一种代理机制,通过在运行时动态生成代理类和代理对象来实现代理功能。它基于接口(Interface)来创建代理对象,对目标对象的方法进行代理,并在代理对象的方法中调用目标对象的方法。

Java动态代理有一个限制,即只能代理实现了接口的类。因此,如果目标对象没有实现接口,Spring AOP将无法使用Java动态代理进行自动代理。

当目标对象实现了接口时,Spring AOP将使用Java动态代理来创建代理对象,并将切面逻辑织入到代理对象中。

如果目标对象没有实现接口,Spring AOP将尝试使用CGLib(Code Generation Library)来创建代理对象。CGLib是一个强大的代码生成库,它通过继承目标类来创建代理对象,并使用字节码增强技术来实现代理功能。

总之,当目标对象实现了接口时,Spring AOP默认使用Java动态代理来创建代理对象。当目标对象没有实现接口时,Spring AOP将使用CGLib来创建代理对象。可以通过配置来指定使用哪种代理方式。

2.3 如何通过配置指定代理方式

在Spring中,可以通过配置来指定使用哪种代理方式(Java动态代理或CGLib)。以下是两种常用的配置方式:

  1. 通过<aop:aspectj-autoproxy>元素配置
<aop:aspectj-autoproxy proxy-target-class="true"/>

在Spring的配置文件中,可以使用<aop:aspectj-autoproxy>元素来启用自动代理,并通过proxy-target-class属性来指定是否使用CGLib代理。将proxy-target-class属性设置为true表示使用CGLib代理,设置为false或省略该属性表示使用Java动态代理。

  1. 通过@EnableAspectJAutoProxy注解配置
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class AppConfig {// 配置其他Bean和AOP切面
}

在Spring的Java配置类中,可以使用@EnableAspectJAutoProxy注解来启用自动代理,并通过proxyTargetClass属性来指定是否使用CGLib代理。将proxyTargetClass属性设置为true表示使用CGLib代理,设置为false表示使用Java动态代理。

通过以上配置方式,可以灵活地指定使用哪种代理方式。根据具体的需求和场景,选择合适的代理方式来实现AOP功能。

2.4 Spring AOP和AspectJ的关系

Spring AOP与AspectJ之间存在一定的关联。Spring AOP可以与AspectJ进行集成,利用AspectJ的注解或XML配置来定义切面,并通过Spring AOP将切面织入到目标对象中。这样,Spring AOP可以结合AspectJ的强大功能和语法,实现更灵活和强大的AOP编程。

Spring AOP是通过动态代理实现AOP的,它并不直接借助AspectJ的编译器和织入工具。虽然Spring AOP的实现受到了AspectJ的影响,并且与AspectJ有很好的集成,但Spring AOP并不使用AspectJ的编译器来修改字节码或进行静态织入。

在Spring AOP中,切面逻辑是通过动态代理来织入到目标对象中的。Spring AOP使用JDK动态代理或CGLIB动态代理来创建代理对象,并在代理对象的方法调用前后织入切面逻辑。这种动态织入的方式使得Spring AOP更加灵活和轻量级,但相对于AspectJ而言,它在切面编程的能力上可能略有限制。

3. Spring Boot AOP

Spring 中的 AOP,有接口就用 JDK 动态代理,没有接口就用 Cglib 动态代理。
Spring Boot 中的 AOP,2.0 之前和 Spring 一样;2.0 之后首选 Cglib 动态代理,如果用户想要使用 JDK 动态代理,需要自己手动配置。

4. 扩展

4.1 AspectJ织入方式详解

AspectJ提供了两种方式来配置织入方式:静态织入和动态织入。

  1. 静态织入:静态织入是在编译期间将切面逻辑织入到目标代码中。要配置静态织入,可以使用AspectJ编译器命令行工具或IDE插件。
  • 使用AspectJ编译器命令行工具:可以使用ajc命令来编译包含AspectJ切面的代码。在命令行中指定目标代码和切面代码的路径,AspectJ编译器会将切面逻辑织入到目标代码中生成织入后的字节码文件。

  • 使用IDE插件:常见的Java开发工具(如Eclipse、IntelliJ IDEA)提供了AspectJ插件,可以在IDE中配置AspectJ切面,并通过插件进行编译和织入。可以通过插件的配置界面或注解来指定切面逻辑的织入方式。

  1. 动态织入:动态织入是在运行时通过AspectJ织入器来动态地将切面逻辑织入到目标代码中。要配置动态织入,可以通过Java命令行参数或配置文件指定织入器。
  • Java命令行参数:在运行Java程序时,可以使用-javaagent参数指定AspectJ织入器,织入器会在程序启动时加载并根据配置文件将切面逻辑织入到目标代码中。

  • 配置文件:可以创建一个AspectJ配置文件(通常是XML格式),在配置文件中指定要织入的切面和切点,以及织入方式。然后,在运行Java程序时指定该配置文件,AspectJ织入器会根据配置文件将切面逻辑织入到目标代码中。

无论是静态织入还是动态织入,配置织入方式都需要指定切面的位置和目标代码的位置,并选择合适的织入时机。具体的配置方式和细节可以根据使用的工具和需求而有所不同。

通过上述介绍,希望大家能够明白AspectJ和Spring AOP框架的原理及实现方式,以及了解Spring AOP采用了AspectJ的注解但没有采用其织入方式,而是通过动态代理的方式(JDK动态代理和CGLIB动态代理)生成代理类和代理对象。Spring AOP支持自动代理,如果目标对象实现了接口,则会采用JDK动态代理,如果没有实现接口则采用CGLIB动态代理。可以通过配置改变使用哪种动态代理,Spring Boot2.0前后的默认配置不同等。

参考

JDK动态代理和CGLib动态代理的对比
Spring Boot 中的 AOP,到底是 JDK 动态代理还是 Cglib 动态代理?

相关文章:

Java AOP Framework概述

Java AOP Framework概述 1. AspectJ1.1 使用AspectJ进行切面编程 2. Spring AOP2.1 使用Spring AOP进行切面编程2.2 如何决定使用哪种动态代理2.3 如何通过配置指定代理方式2.4 Spring AOP和AspectJ的关系 3. Spring Boot AOP4. 扩展4.1 AspectJ织入方式详解 参考 Java常用的AO…...

220V转12V芯片-交流45v-265v输入,固定12v输出峰值电流600MA

标题&#xff1a;220V转12V芯片&#xff0c;实现宽电压输入和固定12V输出 摘要&#xff1a;本文介绍了一款具备宽电压输入范围&#xff08;45V-265V&#xff09;和固定12V输出的220V转12V芯片。该芯片内置了650V高压MOS管&#xff0c;并通过CS电阻调节输出电流&#xff0c;最大…...

TOGAF架构开发方法—初步阶段

本章描述了满足新企业体系结构业务指令所需的准备和启动活动,包括组织特定体系结构框架的定义和原则的定义。 一、目标 初步阶段的目标是: 确定组织所需的体系结构功能: 审查进行企业架构的组织背景确定受体系结构功能影响的企业组织的元素并确定其范围确定与架构功能相交的…...

软件定制APP开发步骤分析|小程序

软件定制APP开发步骤分析|小程序 软件定制开发步骤&#xff1a; 1.需求分析&#xff1a; 这是软件定制开发的第一步&#xff0c;也是最关键的一步。在这个阶段&#xff0c;软件开发团队需要与客户进行沟通&#xff0c;了解客户的具体需求和期望。通过讨论和交流&#xff0c;确…...

postman接口传参案例

目录 案例1&#xff1a; 接口A 接口B 案例2&#xff1a; //断言 案例1&#xff1a; 接口A 根据返回值需要从返回值中提取userid值&#xff0c;在Tests标签栏下编写脚本 //获取返回的响应值&#xff0c;并转化为json格式 var jsonData pm.response.json(); // 获取返回…...

【2023华为杯A题】WLAN网络信道接入机制建模(代码、思路.....)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

CFCA企业版通配符SSL证书

CFCA是中国CFCA企业版通配符SSL证书金融认证中心的缩写&#xff0c;即China Financial Certification Authority。它是一家经过中国人民银行和国家信息安全机构批准成立的国家级权威安全认证机构&#xff0c;也是国际CA浏览器联盟组织&#xff08;CA/Browser Forum&#xff09;…...

基于ASCON的AEAD

1. 引言 前序博客&#xff1a; ASCON&#xff1a;以“慢而稳”赢得NIST轻量级加密算法标准密码学中的AEAD(authenticated encryption with associated data) 对称密钥加密过去数年来已发生改变&#xff0c;具体为&#xff1a; 当今主要使用stream ciphers&#xff0c;因其比…...

汇编宏伪指令介绍

1、汇编宏伪指令介绍 .macro macname macargs .endm&#xff08;1&#xff09;“.macro"和”.endm"表示宏定义的开始和结束&#xff1b; &#xff08;2&#xff09; “.macro"后面接着宏定义的名字&#xff0c;然后是参数&#xff0c;参数后面的宏定义的实现…...

优化系统报错提示信息,提高人机交互(一)

1、常规报错及处理 package com.example.demo.controller;import com.example.demo.service.IDemoService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.w…...

FPGA纯verilog实现8路视频拼接显示,提供工程源码和技术支持

目录 1、前言版本更新说明免责声明 2、我已有的FPGA视频拼接叠加融合方案3、设计思路框架视频源选择OV5640摄像头配置及采集静态彩条视频拼接算法图像缓存视频输出 4、vivado工程详解5、工程移植说明vivado版本不一致处理FPGA型号不一致处理其他注意事项 6、上板调试验证并演示…...

spring boot项目一次性能测试的总结

满足标准&#xff1a;并发大于等于100 &#xff0c;平均响应时间小于等于3秒 项目在压测过程中并发数只有50&#xff0c;在并发数100的情况下有很多请求链接是失败的 我们该如何入手去处理这些问题并提高并发数呢&#xff1f; 1、首先从压测结果入手&#xff0c;对不满足标准…...

10分钟设置免费海外远程桌面

前言 本教程将向您介绍如何使用 Amazon Lightsail 服务的免费套餐轻松搭建属于您的远程桌面。依托于 Amazon 全球可用区&#xff0c;您可以在世界各地搭建符合您配置需求的远程桌面。 本教程需要先拥有亚马逊云科技海外账户。现在注册亚马逊云科技账户可以享受12个月免费套餐…...

基于复旦微的FMQL45T900全国产化ARM核心模块(100%国产化)

TES745D是一款基于上海复旦微电子FMQL45T900的全国产化ARM核心板。该核心板将复旦微的FMQL45T900&#xff08;与XILINX的XC7Z045-2FFG900I兼容&#xff09;的最小系统集成在了一个87*117mm的核心板上&#xff0c;可以作为一个核心模块&#xff0c;进行功能性扩展&#xff0c;能…...

2023.9.11 关于传输层协议 UDP和TCP 详解

目录 UDP协议 TCP协议 TCP十大核心机制 确认应答 超时重传 连接管理&#xff08;三次握手 四次挥手&#xff09; 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 面向字节流 粘包问题 TCP 中的异常处理 经典面试题 对比 TCP 和 UDP 如何使用 UDP 实现可靠传…...

thinkphp8路由

thinkphp8已出来有好一段时间了。这些天闲来无事&#xff0c;研究了下tp8的路由。默认情况下&#xff0c;tp8的路由是在route\app.php的文件里。但在实际工作中&#xff0c;我们并不会这样子去写路由。因为这样不好管理。更多的&#xff0c;是通过应用级别去管理路由。假如项目…...

Python统计pdf中英文单词的个数

之前的文章提供了批量识别pdf中英文的方法,详见【python爬虫】批量识别pdf中的英文,自动翻译成中文上。以及自动pdf英文转中文文档,详见【python爬虫】批量识别pdf中的英文,自动翻译成中文下。    本文实现python统计pdf中英文字符的个数。 文章目录 一、要统计字符的pdf…...

Kindle电子书下载功能关闭怎么办,借助calibre和cpolar搭建私有的网络书库公网访问

Kindle中国电子书店停运不要慌&#xff0c;十分钟搭建自己的在线书库随时随地看小说&#xff01; 文章目录 Kindle中国电子书店停运不要慌&#xff0c;十分钟搭建自己的在线书库随时随地看小说&#xff01;1.网络书库软件下载安装2.网络书库服务器设置3.内网穿透工具设置4.公网…...

ubuntu、linux in window安装docker教程

1、首先进入管理员权限。 2、更新软件源。 sudo apt update 3、安装一些依赖 sudo apt install apt-transport-https ca-certificates curl software-properties-common 4、为系统添加Docker的密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-k…...

clickhouse学习之路----clickhouse的特点及安装

clickhouse学习笔记 反正都有学不完的技术&#xff0c;不如就学一学clickhouse吧 文章目录 clickhouse学习笔记clickhouse的特点1.列式存储2. DBMS 的功能3.多样化引擎4.高吞吐写入能力5.数据分区与线程级并行 clickhouse安装1.关闭防火墙2.CentOS 取消打开文件数限制3.安装依…...

STM32 驱动

led 驱动 led头文件 #ifndef _LED_H #define _LED_Hvoid LED_Init(void); void LED_ON(void); void LED_OFF(void); void LED_Turn(void);#endifled代码 #include "stm32f10x.h" void LED_Init(void) {//START CLOCKRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO…...

JavaScript系列从入门到精通系列第五篇:JavaScript中的强制类型转换包含强制类型转换之Number,包含强制类型转换之String

文章目录 前言 一&#xff1a;强制类型转换 1&#xff1a;强制类型转换为String (一)&#xff1a;方式一&#xff1a;调用被转换类型的toString()方法 (二)&#xff1a;方式二&#xff1a;调用String函数 2&#xff1a;强制类型转换为Number (一)&#xff1a;方式一&…...

动力节点老杜JavaWeb笔记(全)

Servlet 关于系统架构 系统架构包括什么形式? C/S架构B/S架构C/S架构? Client / Server(客户端 / 服务器)C/S架构的软件或者说系统有哪些呢? QQ(先去腾讯官网下载一个QQ软件,几十MB,然后把这个客户端软件安装上去,然后输入QQ号以及密码,登录之后,就可以和你的朋友聊…...

【微信小程序开发】宠物预约医疗项目实战-注册实现

【微信小程序开发】宠物预约医疗项目实战-注册实现 第二章 宠物预约医疗项目实战-注册实现 文章目录 【微信小程序开发】宠物预约医疗项目实战-注册实现前言一、打开项目文件二、编写wxss代码2.1 什么是wxss2.2 配置主程序全局样式 三. 在sign文件下的wxml文件中编写如下代码并…...

聚观早报 | 飞书签约韵达速递;蔚来首颗自研芯片“杨戬”量产

【聚观365】9月22日消息 飞书签约韵达速递 蔚来首颗自研芯片“杨戬”10月量产 靳玉志接任华为车 BU CEO 亚马逊发布全新Alexa语音助手 OpenAI推出图像生成器DALL-E 3 飞书签约韵达速递 近日&#xff0c;国内物流服务公司韵达快递宣布全员上飞书。飞书解决方案副总裁何斌表…...

zookeeper + kafka

Zookeeper 概述 Zookeeper是一个开源的分布式服务管理框架。存储业务服务节点元数据及状态信息&#xff0c;并负责通知再 ZooKeeper 上注册的服务几点状态给客户端 Zookeeper 工作机制 Zookeeper从设计模式角度来理解: 是一个基于观察者模式设计的分布式服务管理框架&…...

wordpress添加评论过滤器

给wordpress添加评论过滤器&#xff0c;如果用户留言包含 "http" (可以为任意字符串) 就禁止提交评论。 function filter_comment_content($comment_data) {$comment_contents $comment_data["comment_content"]; //获取评论表单的内容字段if (stripos($…...

工具篇 | Gradle入门与使用指南

介绍 1.1 什么是Gradle&#xff1f; Gradle是一个开源构建自动化工具&#xff0c;专为大型项目设计。它基于DSL&#xff08;领域特定语言&#xff09;编写&#xff0c;该语言是用Groovy编写的&#xff0c;使得构建脚本更加简洁和强大。Gradle不仅可以构建Java应用程序&#x…...

Wireshark TS | MQ 传输缓慢问题

问题背景 应用传输慢是一种比较常见的问题&#xff0c;慢在哪&#xff0c;为什么慢&#xff0c;有时候光从网络数据包分析方面很难回答的一清二楚&#xff0c;毕竟不同的技术方向专业性太强&#xff0c;全栈大佬只能仰望&#xff0c;而我们能做到的是在专注于自身的专业方向之…...

flink集群与资源@k8s源码分析-回顾

本章是分析系列最后一章,作为回顾,以运行架构图串联起所有分析场景 1 启动集群,部署集群(提交k8s),新建作业管理器组件 2 构建和启动flink master组件 3 提交作业,N/A...

官方网站开发公司排名/seo权重是什么意思

JavaScript的正则&#xff08;RegExp&#xff09; 前言 此文不作正则规则讲解&#xff0c;只写JavaScript对正则的应用。 一、RegExp 的应用 活着的意义是处理字符&#xff1a; 解析&#xff0c;提取一段字符中想要的内容。如&#xff1a; 解析括号内的内容 "he(llo…...

南通制作手机网站/互联网公司排名100强

最近在做一个字体编辑的软件&#xff0c;其中需要用 TextArea 接受用户输入&#xff0c;并转换成 Text 保留在 图片上&#xff0c;碰到了字符自动换行的问题&#xff0c;开始是在 TextArea 的text 里 追加 "\n" , 但后来找到了一种更简单的办法&#xff0c;就是动态控…...

淘宝网页版看直播/西安seo计费管理

C笔记(进阶3)&#xff1a;Makefile 1.作用 Makefile文件告诉Make怎样编译和连接成一个程序。 2. Makefile基本语法与执行 示例 编译一个单文件HelloWorld.cpp 编写Makefile HelloWorld : HelloWorld.cppg HelloWorld.cpp -o HelloWorld clean :rm HelloWorld编译 make清…...

做网站有生意吗/网站建设策划书范文

1、目标今天的目标是某生鲜App的签名 paramsMD5 &#xff0c;抓个包先&#xff1a;javaTIP: 新鲜热乎的 1.4.5python2、步骤老规矩&#xff0c;上jadx纳尼...... 这个 qihoo 很眼熟&#xff0c;在Windows平台下是老熟人了&#xff0c;没想到如今混移动端了&#xff0c;它又冒出…...

网站建设任务分解/seo销售话术开场白

C#根据控件名获取控件对象 2014年11月07日 11:05:57 CLeopard 阅读数 25001 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/CLeopard/article/details/40889999 需求&#xff1a;在一个项目中&#xff0c;要实现一个控件…...

曲靖做网站/优化方案的格式及范文

蒂莫西约翰伯纳斯-李发明了三样东西&#xff1a;URL HTTP HTML&#xff0c;其中HTML为超文本标记语言&#xff0c;就是我们前端编写页面的HTML&#xff0c;HTTP为超文本传输语言(这个会在我之后的博客中写道)&#xff0c;以及我们本次要提到的URL。URL为&#xff1a;Uniform R…...