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

基于SpringCloud的广告系统设计与实现(二)

一、common公共模块

1.common的作用

  • 通用的代码、配置不应该散落在各个业务模块中,不利于维护与更新

  • 一个大的系统,响应对象需要统一外层格式

  • 各种业务设计与实现,可能会抛出各种各样的异常,异常信息的收集也应该做到统一

2.统一响应

提供统一响应的好处主要有两点:

        1. 与前端和客户端保持统一,拥有统一的结构,方便前端和客户端的统一处理,特别是在程序出错的情况下,可以直接显示错误信息。
        2. 日志结构的统一,我们经常会把程序的响应以日志的形式打印出来,所以。响应是统一的,日志的结构也能够保持统一。

统一响应的代码说明

@RestControllerAdvice 注解

Advice 在 Spring 中的含义就是对 XX 功能增强,RestControllerAdvice(ControllerAdvice)就是对控制器增强。之所以使用 RestControllerAdvice,是因为我们对外提供的都是 Rest 接口(json)。

我们需要对 Controller 返回的内容做一些额外的工作,即功能增强,就需要利用到这个注解。另外,这个注解提供了 basePackages 属性可以指定对特定 package 中的 Controller 生效。

ResponseBodyAdvice 接口

ResponseBodyAdvice 的作用是在响应体返回之前做一些自定义的处理工作。通常,我们会实现 ResponseBodyAdvice 接口,并包装统一的响应返回。接口的详细定义可以阅读 Spring 官网的解释: Spring ResponseBodyAdvice

  • supports 方法

supports 的返回值是 boolean 类型,用于指定哪些 Controller 方法需要处理。我们当前的代码实现是标注了 IgnoreResponseAdvice 注解的类或者方法,统一响应不会生效。代码解释如下:

/*** <h2>判断是否需要对响应进行处理</h2>* @return false: 不需要处理; true: 需要处理* */
@Override
@SuppressWarnings("all")
public boolean supports(MethodParameter methodParameter,Class<? extends HttpMessageConverter<?>> aClass) {// 如果当前方法所在的类标识了 IgnoreResponseAdvice 注解, 则不需要处理if (methodParameter.getDeclaringClass().isAnnotationPresent(IgnoreResponseAdvice.class)) {return false;}// 如果当前方法标识了 IgnoreResponseAdvice 注解, 则不需要处理if (methodParameter.getMethod().isAnnotationPresent(IgnoreResponseAdvice.class)) {return false;}// 对响应进行处理, 执行 beforeBodyWrite 方法return true;
}
  • beforeBodyWrite 方法

根据方法的名字可以知道,这个方法实现了在结果输出前的操作。这个方法的参数很多,我们只需要关注第一个:Object,这个就是原始的 Controller 返回的内容。我们也就是需要对它进行包装。代码解释如下:

/*** <h2>响应返回之前的处理</h2>* @param o 响应对象* */
@Nullable
@Override
@SuppressWarnings("all")
public Object beforeBodyWrite(@Nullable Object o,MethodParameter methodParameter,MediaType mediaType,Class<? extends HttpMessageConverter<?>> aClass,ServerHttpRequest serverHttpRequest,ServerHttpResponse serverHttpResponse) {// 定义最终的返回对象CommonResponse<Object> response = new CommonResponse<>(0, "");// 如果 o 是 null, response 不需要设置 dataif (null == o) {return response;// 如果 o 已经是 CommonResponse 类型, 强转即可} else if (o instanceof CommonResponse) {response = (CommonResponse<Object>) o;// 否则, 把响应对象作为 CommonResponse 的 data 部分} else {response.setData(o);}return response;
}

 如果我们对 Controller 返回的结果的处理过程比较复杂,那么根据处理的分类,可以指定多个 ResponseBodyAdvice,并使用 @Order 指定处理顺序。

3.统一异常

 自定义异常是需要细化到具体的业务的,但是只有当你的某一块业务足够大(或者简单的说就是代码比较多)才需要自定义异常。比如代码中有很多处理推广计划的地方,就可以定义 AdPlanException;代码中处理 MySQL Binlog 的部分很多,就可以定义 MySQLBinlogException 等等

统一异常处理的解释说明

@ExceptionHandler

拦截 Spring 的异常处理需要使用到 ExceptionHandler 注解。Spring 3.0 引入的这个注解可以让我们在一个 handler 方法或者类中统一处理 Controller 抛出的异常,使得写出的代码更加清晰。

首先,来看看对这个注解的解释:

@Target(ElementType.METHOD)             // 这个注解标注在对象的方法上
@Retention(RetentionPolicy.RUNTIME)     // 在运行时有效
@Documented
public @interface ExceptionHandler {/*** Exceptions handled by the annotated method. If empty, will default to any* exceptions listed in the method argument list.* value 是一个 Class 数组,用于指定需要拦截的异常类。*/Class<? extends Throwable>[] value() default {};
}

说明:该注解注释的方法可以有灵活的输入参数,通常需要给出异常参数:包括一般的异常或特定的异常(即自定义异常),如果注解自身没有指定异常类,会默认进行映射。

/*** <h1>全局异常处理</h1>* RestControllerAdvice: 组合注解, ControllerAdvice + ResponseBody, 是对 RestController 的功能增强* Created by Qinyi.*/
@RestControllerAdvice
public class GlobalExceptionAdvice {/*** <h2>对 AdException 进行统一处理</h2>* ExceptionHandler: 可以对指定的异常进行拦截* 优化: 定义多种类异常, 并实现对应的异常处理. 例如: 推广单元的操作出现异常, 抛出 AdUnitException;*  Binlog 解析异常, 抛出 BinlogException* */@ExceptionHandler(value = AdException.class)public CommonResponse<String> handlerAdException(HttpServletRequest req,AdException ex) {// 统一异常接口的响应// 优化: 定义不同类型的异常枚举(异常码和异常信息)CommonResponse<String> response = new CommonResponse<>(-1,"business error");response.setData(ex.getMessage());return response;}
}

4.统一配置开发

WebMvcConfigurer 接口

WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter。

Spring 的 WebMvcConfigurer 接口提供了很多方法让我们来定制 Spring MVC 的配置。这个接口还是非常常用的,可以对 Spring 的很多配置和行为进行定制。下面对一些常用的方法进行解释:

public interface WebMvcConfigurer {/*** 匹配路由请求规则*/default void configurePathMatch(PathMatchConfigurer configurer) {}/*** 注册自定义的 Formatter 和 Convert*/default void addFormatters(FormatterRegistry registry) {}/*** 添加静态资源处理器*/default void addResourceHandlers(ResourceHandlerRegistry registry) {}/*** 配置消息转换器*/default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {}/*** 添加自定义视图控制器*/default void addViewControllers(ViewControllerRegistry registry) {}/*** 添加自定义方法参数处理器*/default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {}
}

HTTP 消息转换器(HttpMessageConverter)是 Spring 框架中的一个核心组件,用于在 HTTP 请求和响应之间进行消息转换。它主要有两个作用:

  • 将请求报文转化为 Java 对象

  • 将 Java 对象转化为响应报文

主要方法

HttpMessageConverter 接口定义了以下方法:

  • getSupportedMediaTypes:获取支持的 MediaType 集合,如 text/html、text/plain、application/json 等。

  • canRead:判断是否能读(请求)。

  • read:将请求数据进行格式转换,当 canRead 方法返回值为 true 时调用。

  • canWrite:判断是否能写(响应)。

  • write:将响应数据进行格式转换,当 canWrite 方法返回值为 true 时调用。

默认配置的消息转换器

SpringMVC 启动时会自动配置一些 HttpMessageConverter,如:

  • ByteArrayHttpMessageConverter:负责读、写二进制格式数据。

  • StringHttpMessageConverter:负责读、写字符串格式数据。

  • ResourceHttpMessageConverter:负责读、写资源文件数据。

  • AllEncompassingFormHttpMessageConverter:负责读、写 Form 表单数据。

  • MappingJackson2HttpMessageConverter:负责读、写 JSON 格式数据(利用 Jackson)。

  • Jaxb2RootElementHttpMessageConverter:负责读、写 XML 格式数据(使用 JAXB)。

使用场景

在 SpringMVC 中,通过 @RequestBody 和 @ResponseBody 注解可以方便地使用 HttpMessageConverter。注意:@ResponseBody 只是 rest 请求的返回序列化注解,并不是消息转换器。

如果没有定义消息转换器,Spring MVC 将会使用自己的默认预定义好的消息转换器。

二、回顾Springboot特性

1.Spring IOC

@Autowire 和 @Resource,它们主要有两点区别:

     1. @Autowire 是 Spring 开发的,而 @Resource 是 jdk 开发的

     2. @Autowire 是按照 type 来注入的,而 @Resource 是按照名称来注入的,如果名称找不到,那么就按照 type。对于一个接口,如果有多个实现,那么就必须使用 @Resource 注入,并指定需要注入的实现类。

        关于 @Autowire,它实现了依赖对象的自动装配,而自动装配的各个 Bean 都是在 Spring 容器启动时自动配置好的,并一直保持在 Spring 容器中。


       Spring 中使用 @Repository、@Service、@Controller 和 @Component 将类标识为 Bean。下面,我对这几个注解做出说明:Spring 从 2.0 版本开始,陆续引入了一些注解用于简化 Spring 的开发。@Repository 注解便属于最先引入的一批,它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean。Spring 2.5 在 @Repository 的基础上增加了功能类似的额外三个注解:@Component、@Service、@Controller,它们分别用于软件系统的不同层次:

    1. @Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次;

    2. @Service 通常作用在业务层,但是目前该功能与 @Component 相同;

    3. @Constroller 通常作用在控制层,但是目前该功能与 @Component 相同。

       通过在类上使用 @Repository、@Component、@Service 和 @Controller 注解,Spring 会自动创建相应的 BeanDefinition 对象,并注册到 ApplicationContext 中。

       最后,我们来看下 @Configuration 注解,它的定义如下:

1

2

3

4

5

6

7

@Target({ElementType.TYPE}) 

@Retention(RetentionPolicy.RUNTIME) 

@Documented 

@Component 

public @interface Configuration { 

String value() default ""

}

    因为 @Configuration 注解本身定义时被 @Component 标注了。因此可以说,一个 @Configuration 同时也是一个 @Component。这个注解是用在配置类上的,我们需要在配置信息的类上加上 @Configuration 注解,以明确指出该类是 Bean 配置的信息源。

    综上所述:XXX类中的 @Configuration 是不可以换成 @Service 的。

2.Spring MVC

 

3.Spring Boot常用功能 

(1)SpringBoot应用启动入口

@SpringBootApplication 注解是一个组合注解,它集成了 @SpringBootConfiguration@EnableAutoConfiguration@ComponentScan 三个注解的功能。通过这个注解,Spring Boot 可以自动配置项目,扫描组件,并启用自动配置功能。这大大简化了 Spring Boot 应用程序的配置,使得开发者可以更专注于业务逻辑的实现。

注解组成:

@SpringBootApplication 是由以下三个注解组成的:

  • @SpringBootConfiguration:表示该类是一个配置类,相当于 Spring 中的 @Configuration


    以下类使用@Configuration:

为了在 Ribbon 使用的时候方便注入,如果没有注入到 Spring 容器中,不能直接使用 @Resource 注解。同时,如果你需要做特殊定制时,加上一些配置,没有的话,直接 new 一个放到容器中就可以。

一文搞懂springboot启动原理 - 简书


  • @EnableAutoConfiguration:启用 Spring Boot 的自动配置功能,Spring Boot 会根据添加的依赖自动配置项目。

  • @ComponentScan:启用组件扫描,Spring 会扫描指定包下的组件(如 @Controller@Service@Repository@Component 等)。

 注解属性:

  • exclude:用于排除不需要自动配置的类,例如 DataSourceAutoConfiguration.class

  • excludeName:用于排除不需要自动配置的类的全限定名,例如 "org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration"

  • scanBasePackages:指定组件扫描的包路径,例如 "com.mycompany.myapp"

  • scanBasePackageClasses:指定组件扫描的包路径的类型安全版本,例如 MyApp.class,Spring 会扫描 MyApp.class 所在的包。

(2)容器启动之后执行的操作

在 Spring Boot 应用程序启动并完成容器初始化后,CommandLineRunnerApplicationRunner 可以用于执行一些初始化操作。这两个接口的实现类会被 Spring Boot 自动检测并执行,它们在功能上非常相似,但在参数处理上有所不同。

CommandLineRunnerApplicationRunner 都是 Spring Boot 提供的接口,用于在应用程序启动后执行初始化任务。

  • 简单场景:如果只需要处理简单的命令行参数,使用 CommandLineRunner 更为简洁。

  • 复杂场景:如果需要处理复杂的命令行参数,特别是包含选项和非选项参数的场景,使用 ApplicationRunner 更为合适。

如果同时使用 CommandLineRunnerApplicationRunner,Spring Boot 会按照以下顺序执行它们:

  1. ApplicationRunner:先执行 ApplicationRunnerrun 方法。

  2. CommandLineRunner:再执行 CommandLineRunnerrun 方法。

(3)Profile 环境配置

  •  读取配置文件:

一般项目,在不同阶段要使用不同的环境,一般包括开发、测试、正式环境,分成不同的文件application-{profile}.yml。在application.yml中合理设置环境配置:

active指定环境{profile}

Spring Boot 会按照以下顺序加载配置文件,后面的配置会覆盖前面的配置:

  1. application.propertiesapplication.yml(Spring Boot 会根据 spring.profiles.active 环境变量的值来激活相应的配置文件)

  2. application-{profile}.propertiesapplication-{profile}.yml

  3. 命令行参数

  4. 环境变量

  • 读取配置实体化:

@ConfigurationProperties 注解

@ConfigurationProperties 是 Spring Boot 提供的一个注解,用于将外部配置文件(application.yml)中的属性绑定到 Java 对象上。通过使用这个注解,开发者可以将配置文件(如 application.propertiesapplication.yml)中的属性值映射到应用程序的配置类中,以便在整个应用程序中方便地访问和使用这些属性。

创建一个普通的 Java 类(POJO),该类的属性将映射到配置文件中的属性。确保为属性提供适当的 getter 和 setter 方法。@ConfigurationProperties 并没有把当前类注册成为一个 Spring 的 Bean。所以,我们在使用时都会配合 @Component 注解直接进行注入。

 配置文件中:

(4)定时任务 

@Scheduled

@Scheduled 注解用于计划执行,它提供了多种参数控制执行的时间和频率等。例如:fixedRate 以固定的频率执行、cron 以 crontab 表达式的规则执行等等。

@Scheduled 任务是非常常用的,使用起来也非常简单:1. 加载到 Spring 容器中;2. 指定你想要的执行规则。例如:

@Component
public class ScheduledTask {// @Scheduled(fixedRate = 5000)         上一次开始执行时间点之后5秒再执行// @Scheduled(fixedDelay = 5000)        上一次执行完毕时间点之后5秒再执行// @Scheduled(cron = "*/5 * * * * *")   通过 crontab 表达式定义规则@Scheduled(fixedRate = 1000)public void helloSpringBoot() {System.out.println("Hello SpringBoot");}
}

在启动类中要配置@EnableScheduling,才会扫描到定时任务。 

相关文章:

基于SpringCloud的广告系统设计与实现(二)

一、common公共模块 1.common的作用 通用的代码、配置不应该散落在各个业务模块中&#xff0c;不利于维护与更新 一个大的系统&#xff0c;响应对象需要统一外层格式 各种业务设计与实现&#xff0c;可能会抛出各种各样的异常&#xff0c;异常信息的收集也应该做到统一 2.统…...

2011年西部数学奥林匹克的几何题

2011G1 证明: 显然, O O O, I I I, F F F 共线, E I / / M O EI//MO EI//MO, △ E I F ∼ △ M O F \triangle EIF \sim \triangle MOF △EIF∼△MOF. 进而 E F / M F r 1 / r 2 EF/MFr_1/r_2 EF/MFr1​/r2​. ( r 1 (r_1 (r1​ 为圆 I I I 的半径, r 2 r_2 r2​ 为…...

(一)afsim第三方库编译

注意&#xff1a;防止奇怪的问题&#xff0c;源码编译的路径最好不要有中文&#xff0c;请先检查各文件夹名 AFSIM版本 Version&#xff1a; 2.9 Plugin API Version&#xff1a; 11 软件环境 操作系统&#xff1a; Kylin V10 SP1 项目构建工具: cmake-3.26.0-linux-aarch6…...

boss直聘 __zp_stoken__ 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向过程 py代码 import execjs imp…...

python matplotlib绘图,显示和保存没有标题栏和菜单栏的图像

目录 1. 使用plt.savefig保存无边框图形 2. 显示在屏幕上&#xff0c;并且去掉窗口的标题栏和工具栏 3. 通过配置 matplotlib 的 backend 和使用 Tkinter&#xff08;或其他图形库&#xff09; 方法 1&#xff1a;使用 TkAgg 后端&#xff0c;并禁用窗口的工具栏和标题栏 …...

AI-Talk开发板之替换唤醒词

一、说明 聆思提供的Demo唤醒词默认为"小美,小美"&#xff0c;V2.4及之后的SDK支持替换唤醒词&#xff0c;聆思提供了在线工具生成唤醒词固件。 工具&#xff1a;tool.listenai.com/audio-custom/products/ 官方博客教程&#xff1a;实操给桌面AI语音助理&#xff…...

C#实现字符串反转的4种方法

见过不少人、经过不少事、也吃过不少苦&#xff0c;感悟世事无常、人心多变&#xff0c;靠着回忆将往事串珠成链&#xff0c;聊聊感情、谈谈发展&#xff0c;我慢慢写、你一点一点看...... 1、string.Reverse 方法 string content "Hello World";string reverseStri…...

【MySQL索引:B+树与页的深度解析】

文章目录 MySQL索引&#xff1a;B树与页的深度解析1. 索引使用的数据结构——B树1.1 B树介绍1.2 B树的特点1.3 B树和B树的对比 2. MySQL中的页2.1 页的介绍2.2 页主体2.3 页目录2.4 B树在MySQL索引中的应用 MySQL索引&#xff1a;B树与页的深度解析 在MySQL数据库中&#xff0…...

在 macOS 上,用命令行连接 MySQL(/usr/local/mysql/bin/mysql -u root -p)

根据你提供的文件内容&#xff0c;MySQL 的安装路径是 /usr/local/mysql。要直接使用 mysql 命令&#xff0c;你需要找到 mysql 可执行文件的路径。 在 macOS 上&#xff0c;mysql 客户端通常位于 MySQL 安装目录的 bin 子目录中。因此&#xff0c;完整的路径应该是&#xff1…...

深入HDFS——数据上传源码

引入 就如RPC篇章里提到的观点一样&#xff0c;任何一种能广为传播的技术&#xff0c;都是通过抽象和封装的思想&#xff0c;屏蔽底层底层复杂实现&#xff0c;提供简单且强大的工具&#xff0c;来降低使用门槛的。 HDFS的风靡自然也是如此。 通过前面深入了NameNode和DataN…...

归并排序算法

归并排序 1算法介绍 和选择排序一样&#xff0c;归并排序的性能不受输入数据的影响&#xff0c;但表现比选择排序好的多&#xff0c;因为始终都是O(n log n&#xff09;的时间复杂度。代价是需要额外的内存空间。归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用…...

优雅解决webview_flutter不支持安卓选择图片视频文件问题

这个问题&#xff0c;网上一搜索&#xff0c;就是要去修改别人写好的插件。 搞Flutter开发&#xff0c;尽量不要去修改别人的插件 &#xff0c;特别是像 webview_flutter 这种比较大的官方插件。 相信我&#xff0c;你拿捏不了它。 主要问题就是&#xff1a; webview_flutter…...

Linux UDP 编程详解

一、引言 在网络编程领域&#xff0c;UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;作为一种轻量级的传输层协议&#xff0c;具有独特的优势和适用场景。与 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff0…...

UllnnovationHub,一个开源的WPF控件库

目录 UllnnovationHub1.项目概述2.开发环境3.使用方法4.项目简介1.WPF原生控件1.Button2.GroupBox3.TabControl4.RadioButton5.SwitchButton6.TextBox7.PasswordBox8.CheckBox9.DateTimePicker10.Expander11.Card12.ListBox13.Treeview14.Combox15.Separator16.ListView17.Data…...

[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令

[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令 简介 项目分析 如何执行系统命令并拿到结果 代码实现 简介 在Python学习日记-77中我们介绍了 socket 基于 TCP 和基于 UDP 的套接字&#xff0c;还实现了服务器端和客户端的通信&#xff0c;本…...

css3过渡总结

一、过渡的定义与作用 CSS3 过渡&#xff08;Transitions&#xff09;允许 CSS 属性在一定的时间区间内平滑地过渡&#xff0c;从一个值转变为另一个值。它能够让网页元素的状态变化更加自然、流畅&#xff0c;给用户带来更好的视觉体验。例如&#xff0c;当一个元素从隐藏状态…...

生产环境中常用的设计模式

生产环境中常用的设计模式 设计模式目的使用场景示例单例模式保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点- 日志记录器- 配置管理器工厂方法模式定义一个创建对象的接口&#xff0c;让子类决定实例化哪个类- 各种工厂类&#xff08;如视频游戏工厂模式创…...

【STM32-学习笔记-4-】PWM、输入捕获(PWMI)

文章目录 1、PWMPWM配置 2、输入捕获配置3、编码器 1、PWM PWM配置 配置时基单元配置输出比较单元配置输出PWM波的端口 #include "stm32f10x.h" // Device headervoid PWM_Init(void) { //**配置输出PWM波的端口**********************************…...

游戏行业销售数据分析可视化

完整源码项目包获取→点击文章末尾名片&#xff01; &#x1f31f;分析&#xff1a; 可看出最近五年用户最喜爱的游戏类型依然还是Action-动作类&#xff08;当然市场发行的也很多&#xff09; Sports-运动类和Shooter-射击类顺序互换,但我估计现在大环境局势紧张可以会推动射击…...

微服务网关,如何选择?

什么是API网关 API网关&#xff08;API Gateway&#xff09;是微服务架构中的一个关键组件&#xff0c;它充当了客户端与后端服务之间的中间层。其主要功能包括请求路由、协议转换、负载均衡、安全认证、限流熔断等。通过API网关&#xff0c;客户端无需直接与多个微服务交互&a…...

Java开发提速秘籍:巧用Apache Commons Lang工具库

一、Java 开发效率之困 在当今数字化时代&#xff0c;Java 作为一门广泛应用的编程语言&#xff0c;在各类软件开发项目中占据着举足轻重的地位。无论是大型企业级应用、互联网平台&#xff0c;还是移动应用后端&#xff0c;都能看到 Java 的身影。然而&#xff0c;Java 开发者…...

多用户商城系统源码哪家好用?怎么选?

想拥有属于自己的多用户商城系统&#xff0c;但回头一看自己又是个技术小白&#xff0c;看着网上眼花缭乱的b2b2c商城系统&#xff0c;更是不知道如何选起&#xff1f;下面给大家分享一条较为成熟的选择思路&#xff0c;以作参考。 1、从需求上决定系统方向 企业在选型b2b2c商…...

聊聊如何实现Android 放大镜效果

一、前言 很久没有更新Android 原生技术内容了&#xff0c;前些年一直在做跨端方向开发&#xff0c;最近换工作用重新回到原生技术&#xff0c;又回到了熟悉但有些生疏的环境&#xff0c;真是感慨万分。 近期也是因为准备做地图交互相关的需求&#xff0c;功能非常复杂&#x…...

NVIDIA视频编解码

开源了两个项目&#xff1a;英伟达显卡视频编解码、jetson视频编解码。都是基于官方SDK进行的封装&#xff0c;由于官方自带的demo晦涩难懂并且每块都是独立的&#xff0c;我对SDK进行二次封装并形成了一套较为完整的视频编解码流程&#xff0c;调用简单&#xff0c;有完整的测…...

Mysql事务隔离级

什么是事务的隔离级别 数据库事务的隔离级别是指事务在并发执行时&#xff0c;如何控制事务之间相互影响的程度。它决定了多个事务并发执行时&#xff0c;事务中的操作对其他事务的可见性&#xff0c;进而影响数据的一致性和并发性。 为什么会有隔离级别的概念&#xff1f; …...

K210视觉识别模块

K210视觉识别模块是一款功能强大的AI视觉模块&#xff0c;以下是对其的详细介绍&#xff1a; 一、核心特性 强大的视觉识别功能&#xff1a;K210视觉识别模块支持多种视觉功能&#xff0c;包括但不限于人脸识别、口罩识别、条形码和二维码识别、特征检测、数字识别、颜色识别…...

springboot使用websocket

文章目录 一、概述1、简介 二、 使用1、引包2、配置处理器3、前端测试 一、概述 1、简介 简介略&#xff0c;附上官方文档&#xff0c;spring5和spring6的官方文档内容大致是一样的&#xff1a; https://docs.spring.io/spring-framework/docs/5.2.25.RELEASE/spring-framewo…...

线程池底部工作原理

线程池内部是通过线程和队列实现的&#xff0c;当我们通过线程池处理任务时&#xff1a; 如果线程池中的线程数量小于corePoolSize&#xff0c;无论是否有处于空闲的线程&#xff0c;都创建新的线程来处理被添加的任务。 如果线程池中的线程数量等于corePoolSize&#xff0c;…...

DevUI 2024 年度运营报告:开源生态的成长足迹与未来蓝图

在当今数字化飞速发展的时代&#xff0c;开源已成为推动技术创新与协作的重要力量。DevUI 作为开源领域的重要一员&#xff0c;其发展历程与成果备受关注。值此之际&#xff0c;GitCode 精心整理了 DevUI 年度运营报告&#xff0c;为您全面呈现 DevUI 社区在过去一年里的开源之…...

Mybatis面试题

Mybatis面试题 什么是 MyBatis&#xff1f;讲下 MyBatis 的缓存Mybatis 是如何进行分页的&#xff1f;分页插件的原理是什么&#xff1f;简述 Mybatis 的插件运行原理&#xff0c;以及如何编写一个插件&#xff1f;Mybatis 动态 sql 是做什么的&#xff1f;都有哪些动态 sql&am…...

Python获取系统运行时间

有时候想获取系统启动后到现在的运行时间&#xff0c;在Linux C可以使用clock_gettime()来获得&#xff0c;如下&#xff0c; #include <time.h> #include <stdio.h>int main() {struct timespec ts;clock_gettime(CLOCK_MONOTONIC, &ts);printf("syste…...

软考高级5个资格、中级常考4个资格简介及难易程度排序

一、软考高级5个资格 01、网络规划设计师 资格简介&#xff1a;网络规划设计师要求考生具备全面的网络规划、设计、部署和管理能力&#xff1b;该资格考试适合那些在网络规划和设计方面具有较好理论基础和较丰富从业经验的人员参加。 02、系统分析师 资格简介&#xff1a;系统分…...

【18】Word:明华中学-儿童医保❗

目录 题目​ NO2 NO3 NO4 NO5 NO6 NO7 NO8 NO9 题目 NO2 布局→页面设置对话框→纸张方向&#xff1a;横向→纸张大小&#xff1a;A3 &#xff1b;页面设置对话框&#xff1a;直接输入纸张大小的宽度和高度即可→页面设置对话框&#xff1a;上下左右边距→版式&…...

Vue 中实现修改数组,并保持页面渲染数据是响应式更改

如果你在 Vue 中使用数组并希望确保对数组项的修改是响应式的&#xff0c;直接替换数组项可能不会触发 Vue 的响应式更新。为了确保响应式更新&#xff0c;你可以使用 Vue 提供的 Vue.set() 方法&#xff08;在 Vue 2 中&#xff09;或使用 this.$set() 方法&#xff08;在 Vue…...

MATLAB算法实战应用案例精讲-【数模应用】图形变换和复杂图形组合(附python和MATLAB代码实现)

目录 前言 算法原理 变换 1二维变换 1.1缩放 1.2 翻转 1.3剪切 1.4 旋转 2齐次坐标 2.1引入齐次坐标的原因 2.2 二维齐次坐标 2.3二维仿射变换 2.4逆变换 4组合变换 5三维变换(由二维变换推理而来) 5.1三维齐次坐标 5.2 三维仿射变换 5.3 缩放和平移 5.4…...

GCC支持Objective C的故事?Objective-C?GCC只能编译C语言吗?Objective-C 1.0和2.0有什么区别?

GCC支持Objective C的故事 Objective-C 主要由 Stepstone 公司的Brad Cox和 Tom Love 在1980 年左右发明。乔布斯离开苹果公司后成立了NeXT STEP公司&#xff0c; 买下了Objective-C 语言的授权。GCC对Objective-C语言的支持是在1992年加入的&#xff0c;具体是在GCC 1.3版本中…...

自动驾驶占用网格预测

文章目录 需要阅读的文献&#xff1a;github论文仓库论文idea提取BEVFormer 需要阅读的文献&#xff1a; ⭐[ECCV 2024] SparseOcc 纯稀疏3D占用网络和 RayIoU 评估指标 ECCV 2024&#xff5c;OSP&#xff1a;自动驾驶全新建模方法&#xff0c;端到端输出任意位置的占用结果 S…...

1.17组会汇报

STRUC-BENCH: Are Large Language Models Good at Generating Complex Structured Tabular Data? STRUC-BENCH&#xff1a;大型语言模型擅长生成复杂的结构化表格数据吗&#xff1f;23年arXiv.org 1概括 这篇论文旨在评估大型语言模型&#xff08;LLMs&#xff09;在生成结构…...

使用 Ansys Motor-CAD 的自适应模板加速创新

应对现代电机设计挑战 电机设计不断发展&#xff0c;Ansys 正在通过创新解决方案引领潮流&#xff0c;不断突破可能的界限。随着电动汽车、工业自动化和可再生能源系统的快速增长&#xff0c;对优化电机的需求从未如此之高。工程师面临着越来越大的压力&#xff0c;他们需要开发…...

用nginx正向代理https网站

目录 1. 缘起2. 部署nginx3. 测试3.1 http测试3.2 https测试4 给centos设置代理访问外网 1. 缘起 最近碰到了一个麻烦事情&#xff0c;就是公司的centos测试服务器放在内网环境&#xff0c;而且不能直接上外网&#xff0c;导致无法通过yum安装软件&#xff0c;非常捉急。 幸…...

PyTorch使用教程(6)一文讲清楚torch.nn和torch.nn.functional的区别

torch.nn 和 torch.nn.functional 在 PyTorch 中都是用于构建神经网络的重要组件&#xff0c;但它们在设计理念、使用方式和功能上存在一些显著的区别。以下是关于这两个模块的详细区别&#xff1a; 1. 继承方式与结构 torch.nn torch.nn 中的模块大多数是通过继承 torch.nn…...

图论DFS:黑红树

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法&#xff1a;记忆化搜索DFS 算法&#xf…...

StarRocks 怎么让特定的SQL路由到FE master节点的

背景 本文基于 StarRocks 3.1.7 大家都知道对于Starrocks来说 FE 是分 master和follower的&#xff0c;而只有master节点才能对元数据进行写操作。但是为什么呢&#xff1f;哪里有体现呢&#xff1f; 这其中的原因在网上是搜不到的&#xff0c;所以大家只知道只有master节点才…...

蓝桥杯真题 - 公因数匹配 - 题解

题目链接&#xff1a;https://www.lanqiao.cn/problems/3525/learning/ 个人评价&#xff1a;难度 2 星&#xff08;满星&#xff1a;5&#xff09; 前置知识&#xff1a;调和级数 整体思路 题目描述不严谨&#xff0c;没说在无解的情况下要输出什么&#xff08;比如 n n n …...

Java 8 Stream API

文章目录 Java 8 Stream API1. Stream2. Stream 的创建3. 常见的 Stream 操作3.1 中间操作3.2 终止操作 4. Stream 的并行操作 Java 8 Stream API Java 8 引入了 Stream API&#xff0c;使得对集合类&#xff08;如 List、Set 等&#xff09;的操作变得更加简洁和直观。Stream…...

AI刷题-还原原始字符串、大数和中的极值位距离

目录 一、还原原始字符串 问题描述 举例 输入格式 输出格式 输入 输出 输入 输出 输入 输出 输入 输出 输入 输出 输入 输出 数据范围 解题思路&#xff1a; 数据结构选择 最终代码&#xff1a; 运行结果&#xff1a; 二、大数和中的极值位距离 问题…...

Ubuntu20.04取消root账号自动登录的方法,触觉智能RK3568开发板演示

Ubuntu20.04默认情况下为root账号自动登录&#xff0c;本文介绍如何取消root账号自动登录&#xff0c;改为通过输入账号密码登录&#xff0c;使用触觉智能EVB3568鸿蒙开发板演示&#xff0c;搭载瑞芯微RK3568&#xff0c;四核A55处理器&#xff0c;主频2.0Ghz&#xff0c;1T算力…...

MySQL 数据库 :SQL 语句规约(不得使用外键与级联,一切外键概念必须在应用层解决。)

文章目录 I 强制规约表名限定数据订正禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。不得使用外键与级联,一切外键概念必须在应用层解决。使用 ISNULL() 来判断是否为 NULL 值NPE 问题不要使用 count(列名) 或 count(常量) 来替代 count(*)II 建议in 操作能避免则…...

深入理解 SQL 中的 DATEDIFF 函数

深入理解 SQL 中的 DATEDIFF 函数 DATEDIFF 函数在 SQL 中是一个用于计算两个日期之间差值的重要工具。不同数据库实现了不同版本的 DATEDIFF&#xff0c;它们在功能和语法上有所不同。本文将详细解析 DATEDIFF 的用法、数据库间差异、复杂场景中的应用&#xff0c;以及替代方…...

【Linux】15.Linux进程概念(4)

文章目录 程序地址空间前景回顾C语言空间布局图&#xff1a;代码1代码2代码3代码4代码5代码6代码7 程序地址空间前景回顾 历史核心问题&#xff1a; pid_t id fork(); if(id 0) else if(id>0) 为什么一个id可以放两个值呢&#xff1f;之前没有仔细讲。 C语言空间布局图&am…...