SpringBoot总结-配置管理和日志管理

原创作者:田超凡(程序员田宝宝)

版权所有,引用请注明原作者,严禁复制转载

整合配置文件

1.在springboot整合配置文件,分成两大类:

application.properties

application.yml

或者是

Bootstrap.properties

Bootstrap.yml

相对于来说yml文件格式写法更加精简,减少配置文件的冗余性。

2.加载顺序:

bootstrap.yml 先加载 application.yml后加载

bootstrap.yml 用于应用程序上下文的引导阶段。

bootstrap.yml 由父Spring ApplicationContext加载。

  1. 区别:

bootstrap.yml 和 application.yml 都可以用来配置参数。

bootstrap.yml 用来程序引导时执行,应用于更加早期配置信息读取。可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。一旦bootStrap.yml 被加载,则内容不会被覆盖。

application.yml 可以用来定义应用级别, 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。

分布式配置中心:

Properties在线转换yml格式网址:https://www.toyaml.com/index.html

7.1使用@value注解:

@Value("${tcf.name}")private String name;

7.2@ConfigurationProperties

<!--导入配置文件处理器,配置文件进行绑定就会有提示--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>
 
 
import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;
@Component@ConfigurationProperties(prefix = "tcf")public class TcfUserEntity {private String addres;private String age;private String name;public String getAddres() {return addres;}public String getAge() {return age;}public String getName() {return name;}public void setAddres(String addres) {this.addres = addres;}public void setAge(String age) {this.age = age;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "TcfUserEntity{" +"addres='" + addres + '\'' +", age='" + age + '\'' +", name='" + name + '\'' +'}';}}

tcf:addres: www.tcf.comage: 22name: tcf

@Autowiredprivate TcfUserEntity tcfUserEntity;
@RequestMapping("/getNameAndAgeAddres")public String getNameAndAgeAddres() {return tcfUserEntity.toString();}

7.3配置文件占位符

在SpringBoot的配置文件中,我们可以使用SpringBoot提供的的一些随机数

${random.value}、${random.int}、${random.long}

${random.int(10)}、${random.int[1024,65536]}

-${app.name:默认值} 来制定找不到属性时的默认值

7.4多环境配置

spring:profiles:active: pre

application-dev.yml:开发环境

application-test.yml:测试环境

application-prd.yml:生产环境

7.5、核心配置

server:port: 8081servlet:context-path: /tcf
 
Springboot 默认的情况下整合tomcat容器

  •  日志管理

8.1.使用logback记录日志

Springboot 已经默认帮你整合好了logback

日志输出文件在当前项目路径log文件夹下

Maven依赖
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

Logback配置
<configuration><!--本文主要输出日志为控制台日志,系统日志,sql日志,异常日志--><!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,,,, --><!--控制台--><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d %p (%file:%line\)- %m%n</pattern><charset>UTF-8</charset></encoder></appender><!--系统info级别日志--><!--<File> 日志目录,没有会自动创建--><!--<rollingPolicy>日志策略,每天建立一个日志文件,或者当天日志文件超过64MB--><!--encoder 日志编码及输出格式--><appender name="fileLog"class="ch.qos.logback.core.rolling.RollingFileAppender"><File>log/file/fileLog.log</File><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>log/file/fileLog.log.%d.%i</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!-- or whenever the file size reaches 64 MB --><maxFileSize>64 MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><encoder><pattern>
%d %p (%file:%line\)- %m%n</pattern><charset>UTF-8</charset><!-- 此处设置字符集 --></encoder></appender><!--sql日志--><appender name="sqlFile"class="ch.qos.logback.core.rolling.RollingFileAppender"><File>log/sql/sqlFile.log</File><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>log/sql/sqlFile.log.%d.%i</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!-- or whenever the file size reaches 64 MB --><maxFileSize>64 MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><!--对记录事件进行格式化。负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。--><encoder><!--用来设置日志的输入格式--><pattern>
%d %p (%file:%line\)- %m%n</pattern><charset>UTF-8</charset><!-- 此处设置字符集 --></encoder></appender><!--异常日志--><appender name="errorFile"class="ch.qos.logback.core.rolling.RollingFileAppender"><File>log/error/errorFile.log</File><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>log/error/errorFile.%d.log.%i</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!-- or whenever the file size reaches 64 MB --><maxFileSize>64 MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy><!--对记录事件进行格式化。负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。--><encoder><!--用来设置日志的输入格式--><pattern>
%d %p (%file:%line\)- %m%n</pattern><charset>UTF-8</charset><!-- 此处设置字符集 --></encoder><!--日志都在这里 过滤出 error使用 try {}catch (Exception e){} 的话异常无法写入日志,可以在catch里用logger.error()方法手动写入日志--><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!--  日志输出级别 --><!--All\DEBUG\INFO\WARN\ERROR\FATAL\OFF--><!--打印info级别日志,分别在控制台,fileLogerrorFile输出异常日志在上面由过滤器过滤出ERROR日志打印--><root level="INFO"><appender-ref ref="fileLog" /><appender-ref ref="console" /><appender-ref ref="errorFile" /></root><!--打印sqlsqlFile文件日志--><logger name="com.dolphin.mapper" level="DEBUG" additivity="false"><appender-ref ref="console" /><appender-ref ref="sqlFile" /></logger></configuration>

application
###指定读取logback配置文件logging:config: classpath:log/logback.xml

测试案例
@RestController@Slf4jpublic class MyIndexService {
 
@RequestMapping("/getName")public String getName(String name, int age) {log.info("name:{},age:{}", name, age);return name;}
 
}

日志级别

ALL 最低等级的,用于打开所有日志记录。

TRACE designates finer-grained informational events than the DEBUG.Since:1.2.12,很低的日志级别,一般不会使用。

DEBUG 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。

INFO 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。

WARN 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示

ERROR 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。

FATAL 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。

OFF 最高等级的,用于关闭所有日志记录。

日志目录

8.2.使用log4j记录日志

日志级别

机制:如果一条日志信息的级别大于等于配置文件的级别,就记录。

trace:追踪,就是程序推进一下,可以写个trace输出

debug:调试,一般作为最低级别,trace基本不用。

info:输出重要的信息,使用较多

warn:警告,有些信息不是错误信息,但也要给程序员一些提示。

error:错误信息。用的也很多。

fatal:致命错误。

输出源

CONSOLE(输出到控制台)

FILE(输出到文件)

格式

SimpleLayout:以简单的形式显示

HTMLLayout:以HTML表格显示

PatternLayout:自定义形式显示

8.2.1新建log4j配置文件

文件名称log4j.properties

#log4j.rootLogger=CONSOLE,info,error,DEBUGlog4j.rootLogger=DEBUG,error,CONSOLE,infolog4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender     log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout     log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n    log4j.logger.info=infolog4j.appender.info=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.info.layout=org.apache.log4j.PatternLayout     log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n  log4j.appender.info.datePattern='.'yyyy-MM-ddlog4j.appender.info.Threshold = info   log4j.appender.info.append=truelog4j.appender.info.File=E:/code/log/info.loglog4j.logger.error=error  log4j.appender.error=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.error.layout=org.apache.log4j.PatternLayout     log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n  log4j.appender.error.datePattern='.'yyyy-MM-ddlog4j.appender.error.Threshold = error   log4j.appender.error.append=truelog4j.appender.error.File=E:/code/log/error.loglog4j.logger.DEBUG=DEBUGlog4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.DEBUG.layout=org.apache.log4j.PatternLayout     log4j.appender.DEBUG.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n  log4j.appender.DEBUG.datePattern='.'yyyy-MM-ddlog4j.appender.DEBUG.Threshold = DEBUG   log4j.appender.DEBUG.append=truelog4j.appender.DEBUG.File=E:/code/log/dubug.log

log4j代码

private static final Logger logger = LoggerFactory.getLogger(IndexController.class);

8.2.2.Maven依赖
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- spring boot start --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><!-- 排除自带的logback依赖 --><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency><!-- springboot-log4j --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j</artifactId><version>1.3.8.RELEASE</version></dependency>

8.2.3.application
  ###指定log4j.properties配置文件路径logging:config: classpath:log4j.properties

8.3.使用AOP统一处理Web请求日志

基于AOP实现 或者elk

在我们的方法的前后实现拦截 减少打印日志代码的冗余性的问题

8.3.1 POM文件新增依赖

    <dependency>

             <groupId>org.springframework.boot</groupId>

             <artifactId>spring-boot-starter-aop</artifactId>

    </dependency>

6.3.2 AOP切面相关配置

@Aspect

@Component

public class WebLogAspect {

      private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);

      @Pointcut("execution(public * com.tcf.controller.*.*(..))")

      public void webLog() {

      }

      @Before("webLog()")

      public void doBefore(JoinPoint joinPoint) throws Throwable {

            // 接收到请求,记录请求内容

            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

            HttpServletRequest request = attributes.getRequest();

            // 记录下请求内容

            logger.info("URL : " + request.getRequestURL().toString());

            logger.info("HTTP_METHOD : " + request.getMethod());

            logger.info("IP : " + request.getRemoteAddr());

            Enumeration<String> enu = request.getParameterNames();

            while (enu.hasMoreElements()) {

                  String name = (String) enu.nextElement();

                  logger.info("name:{},value:{}", name, request.getParameter(name));

            }

      }

      @AfterReturning(returning = "ret", pointcut = "webLog()")

      public void doAfterReturning(Object ret) throws Throwable {

            // 处理完请求,返回内容

            logger.info("RESPONSE : " + ret);

      }

}

  • 其他内容

9.1、使用@Scheduled创建定时任务

在Spring Boot的主类中加入@EnableScheduling注解,启用定时任务的配置

@Component

public class ScheduledTasks {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(fixedRate = 5000)

    public void reportCurrentTime() {

        System.out.println("现在时间:" + dateFormat.format(new Date()));

    }

}

 @Scheduled(cron = "0/2 * * * * *") 写法:

quartz/Cron/Crontab表达式在线生成工具-BeJSON.com

Xxl-job

9.2、使用@Async实现异步调用

启动加上@EnableAsync ,需要执行异步方法上加入      @Async

异步应用场景

@Async实际就是多线程封装的

异步线程执行方法有可能会非常消耗cpu的资源,所以大的项目建议使用

Mq异步实现。

整合线程池
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.task.TaskExecutor;import org.springframework.scheduling.annotation.EnableAsync;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.ThreadPoolExecutor;@Configuration@EnableAsyncpublic class ThreadPoolConfig {/*** 每秒需要多少个线程处理?* tasks/(1/taskcost)*/private int corePoolSize = 3;/*** 线程池维护线程的最大数量* (max(tasks)- queueCapacity)/(1/taskcost)*/private int maxPoolSize = 3;/*** 缓存队列* (coreSizePool/taskcost)*responsetime*/private int queueCapacity = 10;/*** 允许的空闲时间* 默认为60*/private int keepAlive = 100;@Beanpublic TaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();// 设置核心线程数executor.setCorePoolSize(corePoolSize);// 设置最大线程数executor.setMaxPoolSize(maxPoolSize);// 设置队列容量executor.setQueueCapacity(queueCapacity);// 设置允许的空闲时间(秒)//executor.setKeepAliveSeconds(keepAlive);// 设置默认线程名称executor.setThreadNamePrefix("thread-");// 设置拒绝策略rejection-policy:当pool已经达到max size的时候,如何处理新任务// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());// 等待所有任务结束后再关闭线程池executor.setWaitForTasksToCompleteOnShutdown(true);return executor;}}
 
import lombok.extern.slf4j.Slf4j;import org.springframework.scheduling.annotation.Async;import org.springframework.stereotype.Component;
@Slf4j@Componentpublic class MemberServiceAsync {@Async("taskExecutor")public String smsAsync() {log.info(">02<");try {log.info(">正在发送短信..<");Thread.sleep(3000);} catch (Exception e) {}log.info(">03<");return "短信发送完成!";}}
 
异步注解配置类
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.task.TaskExecutor;import org.springframework.scheduling.annotation.EnableAsync;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.ThreadPoolExecutor;@Configuration@EnableAsyncpublic class ThreadPoolConfig {/*** 每秒需要多少个线程处理?* tasks/(1/taskcost)*/private int corePoolSize = 3;/*** 线程池维护线程的最大数量* (max(tasks)- queueCapacity)/(1/taskcost)*/private int maxPoolSize = 3;/*** 缓存队列* (coreSizePool/taskcost)*responsetime*/private int queueCapacity = 10;/*** 允许的空闲时间* 默认为60*/private int keepAlive = 100;@Beanpublic TaskExecutor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();// 设置核心线程数executor.setCorePoolSize(corePoolSize);// 设置最大线程数executor.setMaxPoolSize(maxPoolSize);// 设置队列容量executor.setQueueCapacity(queueCapacity);// 设置允许的空闲时间(秒)//executor.setKeepAliveSeconds(keepAlive);// 设置默认线程名称executor.setThreadNamePrefix("thread-");// 设置拒绝策略rejection-policy:当pool已经达到max size的时候,如何处理新任务// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());// 等待所有任务结束后再关闭线程池executor.setWaitForTasksToCompleteOnShutdown(true);return executor;}}

注意失效问题

注意:如果异步注解写当前自己类,有可能aop会失效,无法拦截注解,最终导致异步注解失效,需要经过代理类调用接口;

所以需要将异步的代码单独抽取成一个类调用接口。

9.3全局捕获异常

@ExceptionHandler 表示拦截异常

  • @ControllerAdvice 是 controller 的一个辅助类,最常用的就是作为全局异常处理的切面类
  • @ControllerAdvice 可以指定扫描范围
  • @ControllerAdvice 约定了几种可行的返回值,如果是直接返回 model 类的话,需要使用 @ResponseBody 进行 json 转换
    • 返回 String,表示跳到某个 view
    • 返回 modelAndView
    • 返回 model + @ResponseBody

@ControllerAdvicepublic class TcfExceptionHandler {/*** 拦截运行异常出现的错误~~~** @return*/@ExceptionHandler(RuntimeException.class)@ResponseBodypublic Map<Object, Object> exceptionHandler() {Map<Object, Object> map = new HashMap<>();map.put("error", "500");map.put("msg", "系统出现错误~");return map;}}

9.4发布打包

使用mvn package 打包

使用java –jar 包名

如果报错没有主清单,在pom文件中新增

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions><configuration><mainClass>com.tcf.App</mainClass><excludes><exclude><groupId>junit</groupId><artifactId>junit</artifactId></exclude><exclude><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></exclude></excludes></configuration></plugin></plugins></build>

本文部分素材转载自蚂蚁课堂

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

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

相关文章

模板模式-C#实现

在模板模式&#xff08;Template Pattern&#xff09;中&#xff0c;一个抽象类公开定义了执行它的方法的方式/模板。 意图&#xff1a;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。 主要解决&#xff1a;一些方法通用&#xff0c;却在每一个子类都重新…

javaEE13(网站第8章两个课后题)

1、对“jspservletjavabean实现分页查询”功能做如下补充&#xff1a; &#xff08;1&#xff09;记录批量删除&#xff1a;每个记录前添加复选框&#xff0c;点击批量删除&#xff0c;删除选中记录。 增加跳转到任意页功能。用户可改变每页记录条数。 页面&am…

JAVA学习-IO.ZIP压缩输入输出流

ZIP压缩输入输出流是Java中用于处理ZIP格式文件的API&#xff0c;它们提供了对ZIP文件进行压缩和解压缩操作的功能。 一、Java中常用的ZIP压缩输入输出流有以下几种&#xff1a; 1. ZipOutputStream&#xff1a; 这是用于将数据写入ZIP文件的输出流&#xff0c;可以将多个文件…

phpqrcode生成二维码

public function getImg(){ $uid1000; //自定义用户id require_once /sdk/phpqrcode/phpqrcode.php; //注意替换sdk路径 $object new \QRcode(); $value \App\get_upload_path(/appapi/Agent/share?code.$code); $errorCorrectionLevel L;//容错级别 $mat…

[vscode]使用cmake时将命令行参数传递给调试目标

一、简介 本文介绍了在vscode中使用cmake工具时&#xff0c;如何传递参数给编译目标的方法。 前提&#xff1a;使用vscodecmake编译C/C程序。 二、方法 在.vscode/目录下新建settings.json文件&#xff0c;并将待传底的参数写在 cmake.debugConfig里。 下面介绍了一个示例&a…

基于单片机+物联网控制的校园空气净化计划系统设计

摘要: 近年来,包含现代物联网技术概念的新型空气质量净化器技术原型在国内市场上已经具有一定雏形,主要还是存在以下几个不足:室内空气中的流动量和速度基本是固定的,不管室内空气系统中的任何污染物和室内空气质量如何,空气质量净化器按照所设定的作业负荷进行运转,这种…

selenium元素定位问题

一、按钮点击 具体网页信息如下&#xff1a; 定位的时候driver.find_element(By.CLASS_NAME, 方法搞不定。 定位方法&#xff1a; 方法一&#xff1a;通过文本定位 driver.find_element(By.XPATH, "//*[text()高分一号]").click() time.sleep(3) 如果是部分文字…

html5cssjs代码 005 小学数学四则运算练习

html5&css&js代码 005 小学数学四则运算练习 一、代码二、解释 这段代码定义了一个页面&#xff0c;用于小学数学四则运算的练习。这可能有点难&#xff0c;实际如果需要可以通过更改代码来达到要求。 一、代码 <!DOCTYPE html> <html lang"zh">…

抗生素净化提纯大孔吸附树脂

一、介绍 ADS-800级吸附树脂 ADS-800是一款功能强大的&#xff0c;大孔&#xff0c;湿润的球形交联聚合物吸附型树脂。 ADS-800 具有优良的物理特性&#xff0c;化学和热稳定性。它的特定的多孔性和其表面积使的本产品适合于分离技术的应用。 ADS-800 是为了流程工业中的专业…

2024第八届通信与未来互联网国际会议(ICCFI 2024)即将召开!

2024年第8届通信与未来互联网国际会议&#xff08;ICCFI 2024&#xff09; 日本鹿儿岛 | 2024年7月19-21日 ICCFI 2024 | Communications and Future Internet | Kagoshima-shi, Japanhttps://www.iccfi.org/ 主办单位&#xff1a; ◆ 出版 ▪ 会议论文集 投稿论文将经过严…

honle电源维修UV电源控制器维修EVG EPS60

好乐UV电源控制器维修&#xff1b;honle控制器维修&#xff1b;UV电源维修MUC-Steuermodul 2 LΛmpen D-82166 主要维修型号&#xff1a; EVG EPS 60/120、EVG EPS 100、EVG EPS200、EVG EPS 220、EVG EPS 340、EVG EPS40C-HMI、EVG EPS60 HONLE好乐uv电源维修故障包括&#…

DARTS: DIFFERENTIABLE ARCHITECTURE SEARCH

DARTS&#xff1a;可微架构搜索 论文链接&#xff1a;https://arxiv.org/abs/1806.09055 项目链接&#xff1a;https://github.com/quark0/darts ABSTRACT 本文通过以可微分的方式表述任务&#xff0c;解决了架构搜索的可扩展性挑战。与在离散和不可微搜索空间上应用进化或强…

Linux fork函数详解

文章目录 1 基本介绍2 fork实例2.1 多个fork返回值2.2 C语言 fork与输出2.3 fork &#x1f4a3; 1 基本介绍 #include <sys/types.h> #include <unistd.h>pid_t fork(void)描述 fork用于创建一个子进程&#xff0c;它与父进程的唯一区别在于其PID和PPID&#xff0…

频繁Full GC如何排查

频繁的Full GC可能会影响应用程序的性能和稳定性&#xff0c;因此需要进行排查和解决。下面是一些可能的排查方法&#xff1a; GC日志分析&#xff1a; 启用GC日志&#xff0c;并分析GC日志以了解Full GC的触发情况和频率。GC日志会提供有关GC事件的详细信息&#xff0c;包括GC…

2024年PHP伪协议详解

【2024年PHP伪协议详解】 嘿&#xff0c;亲爱的编程新手们&#xff01;今天我们要一起探索PHP伪协议的奇妙世界。想象一下&#xff0c;PHP伪协议就像是一个神秘的传送门&#xff0c;能让我们在PHP的海洋中畅游无阻。准备好了吗&#xff1f;让我们开始这段冒险之旅吧&#xff01…

C语言--sprintf()函数的用法

一.sprintf()语法 sprintf&#xff08;&#xff09; 是一个 C 语言中的函数&#xff0c;用于将格式化的数据写入一个字符串中。它的用法与 printf() 函数相似&#xff0c;printf&#xff08;&#xff09;函数是将内容输出到屏幕上&#xff0c;而sprintf()函数是将格式化的内容输…

蓝桥杯java组 测试次数

题目描述 x星球的居民脾气不太好&#xff0c;但好在他们生气的时候唯一的异常举动是&#xff1a;摔手机。 各大厂商也就纷纷推出各种耐摔型手机。x星球的质监局规定了手机必须经过耐摔测试&#xff0c;并且评定出一个耐摔指数来&#xff0c;之后才允许上市流通。 x星球有很多…

设计模式一 ---单例设计模式(动力节点,JavaSE基础)

设计模式 1.什么是设计模式&#xff1f; 2.设计模式的分类 单例设计模式就是GoF模式中的一种。 3.GoF设计模式的分类&#xff1a; 单例设计模式&#xff1a; 顾名思义&#xff1a;单个实例的设计模式&#xff01;

Arco 部署项目后部分样式未生效

文章目录 问题分析 问题 在更改 arco 的原始样式后&#xff0c;发现部分样式并未被更改 分析 如下所示&#xff0c;通过元素查看器可以看到原生的绑定的 class 类名和样式 而我将整个的设置了的样式做了替换 :deep(.arco-menu-light.arco-menu-horizontal .arco-menu-ite…

【力扣精选算法100道】——二进制求和

LCR 002. 二进制求和 - 力扣&#xff08;LeetCode&#xff09; 目录 &#x1f388;了解题意 &#x1f388;算法分析 &#x1f6a9;cur1>0 &#x1f6a9;cur2>0 &#x1f6a9;t &#x1f388;实现代码 &#x1f388;了解题意 遵循二进制加法法则&#xff0c;如果俩…