6 使用 AspectJ 的 AOP 配置管理事务

1. 概述

AspectJ 主要是使用 XML 配置顾问方式自动为每个符合切入点表达式的类生成事务代理。创建测试操作步骤如下:

2. 创建测试项目

创建一个名为 aspectj-aop 项目,pom.xml 文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>hello-spring-transaction</groupId><artifactId>aspectj-aop</artifactId><version>1.0.0-SNAPSHOT</version><packaging>jar</packaging><properties><!-- 环境配置 --><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><!-- 统一的依赖管理 --><log4j.version>1.2.17</log4j.version><slf4j.version>1.7.25</slf4j.version><spring.version>4.3.17.RELEASE</spring.version><alibaba-druid.version>1.1.6</alibaba-druid.version><mysql.version>5.1.46</mysql.version><mybatis.version>3.2.8</mybatis.version><mybaits-spring.version>1.3.1</mybaits-spring.version><junit.version>4.12</junit.version><lombok.version>1.16.18</lombok.version></properties><dependencies><!-- Test Begin --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version></dependency><!-- Test Begin --><!-- Spring Begin --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><!-- Spring End --><!-- Log Begin --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jul-to-slf4j</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><!-- Log End --><!-- Database Begin --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>${alibaba-druid.version}</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>${mybaits-spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><!-- Database End --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency></dependencies>
</project>

主要依赖: org.springframework:spring-aspects

2.1 创建实体类

TbContentCategory

package com.hello.spring.transaction.aspectsj.aop.domain;import lombok.Data;import java.util.Date;/*** 分类管理* <p>Title: TbContentCategory</p>* <p>Description: </p>** @author qfxl* @version 1.0.0* @date 2024/05/14*/
@Data
public class TbContentCategory {private Long id;private String name;private Integer status;private Integer sortOrder;private Boolean isParent;private Date created;private Date updated;private TbContentCategory parent;
}

TbContent

package com.hello.spring.transaction.aspectsj.aop.domain;import lombok.Data;import java.util.Date;/*** 内容管理* <p>Title: TbContent</p>* <p>Description: </p>** @author qfxl* @version 1.0.0* @date 2024/05/14*/
@Data
public class TbContent {private Long id;private String title;private String subTitle;private String titleDesc;private String url;private String pic;private String pic2;private String content;private Date created;private Date updated;private TbContentCategory tbContentCategory;
}

2.2 创建数据访问层

TbContentCategoryDao

package com.hello.spring.transaction.aspectsj.aop.dao;import com.hello.spring.transaction.aspectsj.aop.domain.TbContentCategory;
import org.springframework.stereotype.Repository;@Repository
public interface TbContentCategoryDao {void insert(TbContentCategory tbContentCategory);
}

TbContentDao

package com.hello.spring.transaction.aspectsj.aop.dao;import com.hello.spring.transaction.aspectsj.aop.domain.TbContent;
import org.springframework.stereotype.Repository;@Repository
public interface TbContentDao {void insert(TbContent tbContent);
}

2.3 创建业务逻辑层

TbContentCategoryService接口

package com.hello.spring.transaction.aspectsj.aop.service;import com.hello.spring.transaction.aspectsj.aop.domain.TbContent;
import com.hello.spring.transaction.aspectsj.aop.domain.TbContentCategory;public interface TbContentCategoryService {void save(TbContentCategory tbContentCategory, TbContent tbContent);
}

实现

package com.hello.spring.transaction.aspectsj.aop.service.impl;import com.hello.spring.transaction.aspectsj.aop.dao.TbContentCategoryDao;
import com.hello.spring.transaction.aspectsj.aop.domain.TbContent;
import com.hello.spring.transaction.aspectsj.aop.domain.TbContentCategory;
import com.hello.spring.transaction.aspectsj.aop.service.TbContentCategoryService;
import com.hello.spring.transaction.aspectsj.aop.service.TbContentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class TbContentCategoryServiceImpl implements TbContentCategoryService {@Autowiredprivate TbContentCategoryDao tbContentCategoryDao;@Autowiredprivate TbContentService tbContentService;public void save(TbContentCategory tbContentCategory, TbContent tbContent) {tbContentCategoryDao.insert(tbContentCategory);tbContentService.save(tbContent);}
}

TbContentService接口

package com.hello.spring.transaction.aspectsj.aop.service;import com.hello.spring.transaction.aspectsj.aop.domain.TbContent;public interface TbContentService {void save(TbContent tbContent);
}

实现

package com.hello.spring.transaction.aspectsj.aop.service.impl;import com.hello.spring.transaction.aspectsj.aop.dao.TbContentDao;
import com.hello.spring.transaction.aspectsj.aop.domain.TbContent;
import com.hello.spring.transaction.aspectsj.aop.service.TbContentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class TbContentServiceImpl implements TbContentService {@Autowiredprivate TbContentDao tbContentDao;public void save(TbContent tbContent) {tbContentDao.insert(tbContent);}
}

3. 创建 Spring 配置

3.1 spring-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><context:annotation-config/><context:component-scan base-package="com.hello.spring.transaction.aspectsj.aop"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan><!-- 配置事务管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!-- 配置事务通知 --><tx:advice id="myAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="save*" propagation="REQUIRED"/></tx:attributes></tx:advice><!-- 配置顾问和切入点 --><aop:config><aop:pointcut id="myPointcut" expression="execution(* com.hello.spring.transaction.aspectsj.aop.service.*.*(..))" /><aop:advisor advice-ref="myAdvice" pointcut-ref="myPointcut" /></aop:config>
</beans>
3.2 spring-context-druid.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 加载配置属性文件 --><context:property-placeholder ignore-unresolvable="true" location="classpath:jdbc.properties"/><!-- 数据源配置, 使用 Druid 数据库连接池 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><!-- 数据源驱动类可不写,Druid默认会自动根据URL识别DriverClass --><property name="driverClassName" value="${jdbc.driverClass}"/><!-- 基本属性 url、user、password --><property name="url" value="${jdbc.connectionURL}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/><!-- 配置初始化大小、最小、最大 --><property name="initialSize" value="${jdbc.pool.init}"/><property name="minIdle" value="${jdbc.pool.minIdle}"/><property name="maxActive" value="${jdbc.pool.maxActive}"/><!-- 配置获取连接等待超时的时间 --><property name="maxWait" value="60000"/><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000"/><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="300000"/><property name="validationQuery" value="${jdbc.testSql}"/><property name="testWhileIdle" value="true"/><property name="testOnBorrow" value="false"/><property name="testOnReturn" value="false"/><!-- 配置监控统计拦截的filters --><property name="filters" value="stat"/></bean>
</beans>
3.3 spring-context-mybatis.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 配置 SqlSession --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><!-- 用于配置对应实体类所在的包,多个 package 之间可以用 ',' 号分割 --><property name="typeAliasesPackage" value="com.hello.spring.transaction.aspectsj.aop.domain"/><!-- 用于配置对象关系映射配置文件所在目录 --><property name="mapperLocations" value="classpath:/mapper/**/*.xml"/><property name="configLocation" value="classpath:/mybatis-config.xml"></property></bean><!-- 扫描 Mapper --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.hello.spring.transaction.aspectsj.aop.dao" /></bean>
</beans>

4. 创建 MyBatis 配置和映射文件

4.1 mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 全局参数 --><settings><!-- 打印 SQL 语句 --><setting name="logImpl" value="STDOUT_LOGGING" /><!-- 使全局的映射器启用或禁用缓存。 --><setting name="cacheEnabled" value="false"/><!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 --><setting name="lazyLoadingEnabled" value="true"/><!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 --><setting name="aggressiveLazyLoading" value="true"/><!-- 是否允许单条 SQL 返回多个数据集 (取决于驱动的兼容性) default:true --><setting name="multipleResultSetsEnabled" value="true"/><!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true --><setting name="useColumnLabel" value="true"/><!-- 允许 JDBC 生成主键。需要驱动器支持。如果设为了 true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。 default:false  --><setting name="useGeneratedKeys" value="false"/><!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不映射 PARTIAL:部分 FULL:全部  --><setting name="autoMappingBehavior" value="PARTIAL"/><!-- 这是默认的执行类型 (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新) --><setting name="defaultExecutorType" value="SIMPLE"/><!-- 使用驼峰命名法转换字段。 --><setting name="mapUnderscoreToCamelCase" value="true"/><!-- 设置本地缓存范围 session:就会有数据的共享 statement:语句范围 (这样就不会有数据的共享 ) defalut:session --><setting name="localCacheScope" value="SESSION"/><!-- 设置 JDBC 类型为空时,某些驱动程序 要指定值, default:OTHER,插入空值时不需要指定类型 --><setting name="jdbcTypeForNull" value="NULL"/></settings>
</configuration>
4.2 TbContentCategoryMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hello.spring.transaction.aspectsj.aop.dao.TbContentCategoryDao"><insert id="insert">INSERT INTO tb_content_category (`parent_id`,`name`,`status`,`sort_order`,`is_parent`,`created`,`updated`)VALUES(#{parent.id},#{name},#{status},#{sortOrder},#{isParent},#{created},#{updated});</insert>
</mapper>
4.3 TbContentMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hello.spring.transaction.aspectsj.aop.dao.TbContentDao"><insert id="insert">INSERT INTO tb_content (`category_id`,`title`,`sub_title`,`title_desc`,`url`,`pic`,`pic2`,`content`,`created`,`updated`)VALUES(#{tbContentCategory.id},#{title},#{subTitle},#{titleDesc},#{url},#{pic},#{pic2},#{content},#{created},#{updated})</insert>
</mapper>

5. 创建系统配置文件

5.1 log4j.properties
log4j.rootLogger=INFO, console, filelog4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d %p [%c] - %m%nlog4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=logs/log.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.MaxFileSize=1024KB
log4j.appender.A3.MaxBackupIndex=10
log4j.appender.file.layout.ConversionPattern=%d %p [%c] - %m%n
j5.2 dbc.properties
#============================#
#==== Database settings ====#
#============================## JDBC
# MySQL 8.x: com.mysql.cj.jdbc.Driver
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://192.168.75.134:3306/myshop?useUnicode=true&characterEncoding=utf-8&useSSL=false
jdbc.username=root
jdbc.password=123456# JDBC Pool
jdbc.pool.init=1
jdbc.pool.minIdle=3
jdbc.pool.maxActive=20# JDBC Test
jdbc.testSql=SELECT 'x' FROM DUAL

6. 创建测试类

package com.hello.spring.transaction.aspectsj.aop.service.test;import com.hello.spring.transaction.aspectsj.aop.domain.TbContent;
import com.hello.spring.transaction.aspectsj.aop.domain.TbContentCategory;
import com.hello.spring.transaction.aspectsj.aop.service.TbContentCategoryService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-context.xml", "classpath:spring-context-druid.xml", "classpath:spring-context-mybatis.xml"})
public class TestSpringTransaction {@Autowiredprivate TbContentCategoryService tbContentCategoryService;@Testpublic void test() {TbContentCategory tbContentCategory = new TbContentCategory();tbContentCategory.setId(1L);tbContentCategory.setName("测试事务分类");TbContent tbContent = new TbContent();tbContent.setTbContentCategory(tbContentCategory);// 在这里你可以将内容设置为超出数据库字段的存储范围来验证事务是否开启tbContent.setTitle("测试事务内容");tbContentCategoryService.save(tbContentCategory, tbContent);}
}

运行观察事务效果:

  • 有事务:数据插入成功则两张表都存在数据,只要出现异常则两张表都没有数据
  • 无事务:如果第一张表数据插入成功,但第二张表报错则第一张表的数据不会回滚

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

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

相关文章

调味品企业的销量增长秘诀:五丰黎红引领大厨革新之路

随着时代的发展和消费升级&#xff0c;调味品行业的竞争愈发激烈&#xff0c;在此大环境之下&#xff0c;企业需要不断寻找创新的突破点来实现销量的增长。众所周知&#xff0c;调味品行业的销售渠道主要有餐饮、家庭消费和食品加工&#xff0c;按销售额的占比约为6&#xff1a…

[JAVASE] 类和对象(二)(续篇)

目录 一. static 修饰成员方法 1.1 基本使用 1.2 注意事项 (重点) 1.2.1 1.2.1 二. 代码块 2.1 代码块的分类及使用 2.1.1 静态代码块 2.1.2 实例代码块 2.1.3 普通代码块 2.2 代码块的执行顺序 三. 对象的打印 3.1 打印对象的引用 3.2 重写 toString 方法 四. 总结 一…

idea上如何新建git分支

当前项目在dev分支&#xff0c;如果想在新分支上开发代码&#xff0c;如何新建一个分支呢&#xff1f;5秒搞定~ 1、工具类选择git&#xff0c;点击New Branch 或者右下角点击git分支&#xff0c;再点击New Branch 2、在弹出的Create New Branch弹窗中&#xff0c;输入你的新分支…

el-table组件选中后使用toggleRowSelection无法取消已选中的数据——bug记录-骚操作解决

先说本文重点解决的问题&#xff1a; 存在的问题&#xff1a;当右侧已选中的数据中&#xff0c;删除了左侧其他页面的数据&#xff0c;但是左侧数据切换到其他页面后&#xff0c;左侧还保留选中的状态。 最近在写后台管理系统的时候&#xff0c;遇到一个需求&#xff1a; 左…

linux性能监控之lsof

lsof&#xff1a;list open files&#xff0c;显示所有打开的文件以及进程信息&#xff0c;我们通常用来检查特定的文件被哪些进程打开 [rootk8s-master ~]# lsof --help lsof: illegal option character: - lsof: -e not followed by a file system path: "lp" lso…

网络工程师----第二十七天

计算机基 第四章&#xff1a;网络层 网络层提供服务的特点&#xff1a;网络层向上只提供简单的、无连接的、尽最大努力交付的数据报服务&#xff0c;不保证可靠通信。 网际协议IP&#xff1a; *地址解析协议ARP(Address Resolution Protocol) *网际控制报文协议ICMP(Inter…

JAVA学习-练习试用Java实现爬楼梯

问题: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整数。 示例 1&#xff1a; 输入&#xff1a; 2 输出&#xff1a; 2 解释&#xff1a; 有两种方法可以爬到楼…

长图拼接技巧大揭秘:轻松实现横向拼接,一键批量处理方法

在数字化时代&#xff0c;我们经常会遇到需要将多张图片拼接成一张长图的情况&#xff0c;无论是用于制作海报、展示报告&#xff0c;还是制作社交媒体上的长图故事&#xff0c;掌握长图拼接的技巧都显得尤为重要。本文将为大家揭秘长图拼接的实用技巧&#xff0c;并介绍办公提…

React脚手架,配置环境变量(生产模式,开发模式)

项目搭建方式&#xff1a;react脚手架(create-react-app) 1. 下载依赖&#xff1a; npm install dotenv npm install dotenv-expandnpm install dotenv-cli -S 2.配置环境变量&#xff1a; 项目根部录下创建文件.env .env.pro .env.dev 配置package.json - scripts…

群晖 Synology DSM7 过热关机解决方法

最近已经提示我过热关机过两次了&#xff0c;这两次一次是用虚拟机&#xff0c;一次是批量使用Synology Photos批量上传照片&#xff1a; 但是我没有对主机进行任何的位置移动以及硬件修改操作&#xff0c;散热环境没有发生变化。以前使用从来没有出现过这个问题&#xff0c;同…

Mysql 创建索引

1. 在创建表时添加索引 在使用CREATE TABLE语句创建表的同时&#xff0c;可以直接定义索引。例如&#xff0c;创建一个包含索引的表&#xff1a; CREATE TABLE clothes (id INT PRIMARY KEY,c_brand VARCHAR(100),c_type VARCHAR(50),c_size VARCHAR(10),price DECIMAL(10, 2…

Android UI: 动画:属性动画

文章目录 定义两种创建方式 代码:直接创建Animator对象XML:加载xml文件API 类操作源码分析总结定义 一段时间内,属性值从A变化到B 属性可以是任何类的任何属性 两种创建方式 代码:直接创建Animator对象 XML:加载xml文件 xml文件在res/anim/目录下,使用R.anim.xxx获…

聚水潭和金蝶云星空单据接口对接

聚水潭和金蝶云星空单据接口对接 对接系统&#xff1a;金蝶云星空 金蝶K/3Cloud&#xff08;金蝶云星空&#xff09;是移动互联网时代的新型ERP&#xff0c;是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人、体验”&#xff0c;旨在帮助企业打造…

[力扣题解]122. 买卖股票的最佳时机 II

题目&#xff1a;122. 买卖股票的最佳时机 II 思路 贪心法&#xff1b; 计算出利润数组&#xff08;后一天卖出的钱-前一天买进的钱&#xff09;&#xff0c;把原问题转换为选择所有正利润的操作&#xff1b; 分解&#xff1a;想到最终利润可以分解&#xff0c;分解为每天的利…

GoogleGemini-AI预测2024系统分析师论文

Message From You: 系统分析师是全国计算机职业资格与水平考试高级别的一类考试&#xff0c;结合历年的论文考试题目以及当前流行的系统分析方便的问题。你能否预测几个2024年可能的论文题目&#xff1f; Message From ChatGPT: 2024 年系统分析师论文题目预测 基于云计算的…

自集成式 HTTP 代理方案

前言 大部分程序员&#xff0c;想必都会有一个常用的抓包代理工具&#xff1b; 但在座的各位&#xff0c;可曾见过这样一款集成在 Web 应用中的代理工具&#xff1f; ​&#xff0c;时长00:45 它是明显区别于传统代理工具的&#xff0c;有以下特性&#xff1a; 零安装、零配…

解析流中 apts 与 vpts的分布

流中 apts 与 vpts的分布情况&#xff0c;同时使用图显示出来 一&#xff0c;最好的方式是使用EasyICE 来查看&#xff0c;这个自动化工具是很好用的&#xff1a; 二&#xff0c; 当EasyICE不能打出理想的数据的时候&#xff0c;可以自己来提取数据&#xff0c;画出对应的图&a…

tomcat--安装

官网&#xff1a;Apache Tomcat - Welcome! 官网文档&#xff1a;Apache Tomcat 8 (8.5.100) - Documentation Index 帮助文档&#xff1a;Apache Tomcat Home - Apache Tomcat - Apache Software Foundation FAQ - Apache Tomcat - Apache Software Foundation yum安装 查…

OpenNJet:引领下一代云原生应用引擎

文章目录 一、前言二、什么是OpenNJet 应用引擎三、OpenNJet的优势3.1 性能无损动态配置3.2 灵活的CoPilot框架3.3 支持HTTP/33.4 支持国密3.5 企业级应用3.6 高效安全 四、centos 安装4.1 生成njet.repo4.2 更新yum 缓存4.3 安装 njet 或 njet-otel 五、OpenNJet配置与部署5.1…

岩土工程监测仪器之一:振弦采集仪的工作原理解析

岩土工程监测仪器之一&#xff1a;振弦采集仪的工作原理解析 河北稳控科技振弦采集仪是岩土工程监测中常用的一种仪器&#xff0c;用于测量地面、结构物或其他物体的振动情况。它通过感应振弦的振动来获取相关的数据&#xff0c;进而分析和评估土壤、地基或结构物的稳定性和安…