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

SpringBoot Day_03

目录

一、数据校验

二、统一异常处理

1、局部异常处理(少)

2、全局异常处理(多)

三、定时器

四、springboot日志

五、swagger

六、springboot自动装配原理

总结 

1、如何实现参数校验功能(掌握)

针对方法、参数,单独校验如何实现?针对接收的bean对象,如何整体校验?

相关的注解有哪些?

2、springmvc异常处理的两种方式?(掌握)

1、局部异常处理(少)

2、全局异常处理(多)

           3、log4j、logback、lombok常见的日志框架对应的日志级别有哪些?(掌握)

4、定时器 相关的注解,如何定时功能(掌握)

5、swagger 接口工具 了解

6、springboot自动装配原理(看面试题,按照面试题背 )


一、数据校验

1、引入jar包支持

<!--数据校验 针对控制层参数进行校验 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency

常用注解
1. @NotNull:用于检查被注解的元素值是否为null。适用于字符串、集合、Map等任何对象类型,
但不适用于基本数据类型(如int、long等)。
2. @NotBlank:用于检查被注解的字符串元素是否不为null且去除两端空白字符后长度大于0。只适
用于字符串类型。
3. @NotEmpty:用于检查被注解的元素不为null且不为空。适用于字符串、集合、Map等。如果是
字符串,相当于同时检查null和长度大于0。
4. @Size:用于指定字段的长度范围。可以指定最小长度(min)和最大长度(max)。
5. @Email:用于检查被注解的字符串是否为有效的电子邮件地址。
6. @Pattern:用于检查被注解的字符串是否符合指定的正则表达式。
7. @Min 和 @Max:分别用于检查被注解的数值是否大于等于最小值和小于等于最大值。
8. @DecimalMin 和 @DecimalMax:分别用于检查被注解的小数是否大于等于最小值和小于等于
最大值。
9. @Range 是 Hibernate Validator 提供的一个用于数据校验的注解,它主要用于对数值类型(如
int 、 long 、 BigDecimal 等)的属性进行范围校验,确保属性值在指定的最小值和最大值之
间。
使用方式
1. 引入依赖:在Spring Boot项目中,首先需要引入 spring-boot-starter-validation 依赖。
2. 在实体类中使用注解:在需要校验的实体类属性上添加相应的校验注解。
3. 在Controller中使用注解:在Controller的方法参数上使用 @Valid 或 @Validated 注解来触发校
验。 @Valid 通常用于方法、参数,而 @Validated 可以用于方法、参数或类上。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@NotNull
@Min(value = 1)
private int id;
@NotEmpty
@Size(min = 3, max = 6)
private String name;
@Min(value = 1)
@Max(value = 100)
private int age;
@ExectionHanlder
@Email
private String email;
}
@RestController
@RequestMapping("/user")
@Validated //触发校验
public class UserController {
@RequestMapping("/m1")
public R m1(@NotNull Integer id,
@NotBlank @Size(min = 3) String name,
@Range(min = 1,max = 100) Integer age,
@Min(value = 0) Integer money,
@Email String email){
System.out.println(id+"---"+name+"--"+age+"---"+money);
return R.ok();
}
@RequestMapping("/m2")
public R m2(@Valid User user){
return R.ok(user);
}
}

二、统一异常处理

控制层异常处理

1、局部异常处理(少)

只针对当前controller方法中的异常进行处理@ExectionHanlder

public class UserController{
@RequestMapping("/m3")
public R m3(Integer id){
System.out.println(1/0);
return R.ok(id);
}
// //异常处理器
// @ExceptionHandler(Exception.class)
// public R exception(Exception e){
// e.printStackTrace();
// return R.fail("服务器繁忙,稍后访问!");
// }
}

2、全局异常处理(多)

可以对所有controller方法中的异常进行处理(也可以限制处理部分包,部分类或者特定的异常)

@ExectionHanlder
@ControllerAdvice @RestControllerAdvice 

package com.hl.springboot3.web;
import com.hl.springboot3.pojo.R;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/*
@ControllerAdvice
@ResponseBody
*/
/*
全局异常处理:可以限制特定的包、特定的类、使用了特定注解的类,
还可以限制只处理特定的异常
*/
@RestControllerAdvice(annotations = RestController.class,
basePackages = "com.hl.springboot3.web",
basePackageClasses = {UserController.class})
//@RestControllerAdvice
public class GlobalExceptionHandler {
//异常处理器
@ExceptionHandler(Exception.class)
public R exception(Exception e){
e.printStackTrace();
return R.fail("服务器繁忙,稍后访问!");
}
}

三、定时器

在Spring Boot中,定时器是一种用于在特定时间点或按照预定时间间隔自动执行任务的机制。
周报表、月报表、年报表

1. 在启动类开启定时@EnableScheduling

@SpringBootApplication
//开启定时
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

2. 创建定时任务实现类@Scheduled

/**
* 定时任务类1
*/
//要声明为bean,没有声明启动类启动无法实现定时效果
@Component
public class SchedulerTask {
//表示每隔6秒打印一次
@Scheduled(cron = "*/6 * * * * ?")
public void proces(){
System.out.println("this is a scheduler task running");
}
}
/**
* 定时任务类2
*/
@Component
public class Scheduler2Task {
//表示每隔6秒打印一次
@Scheduled(fixedRate = 6000)
public void reportCurrentTime(){
System.out.println("现在时间:"+new Date());
}
}
@Component
public class MyScheduler {
//    @Scheduled(cron = "*/6 * * * * *") // 第一个星每隔6秒执行一次  分钟 小时 日 月 周@Scheduled(initialDelay = 5000, fixedRate = 10000) // 第一个参数延迟1秒执行,第二个参数每隔5秒执行一次
public void print(){
System.out.println("MyScheduler...."+new Date());
}
}

3. 启动类启动即可

参数说明
@Scheduled 参数可以接受两种定时的设置,一种是我们常用的 cron="*/6 * * * * ?" ,一种是
fixedRate = 6000 ,两种都表示每隔六秒打印一下内容。
fixedRate 说明

  • @Scheduled(fixedRate = 6000) :上一次开始执行时间点之后6秒再执行
  • @Scheduled(fixedDelay = 6000) :上一次执行完毕时间点之后6秒再执行
  • @Scheduled(initialDelay=1000, fixedRate=6000) :第一次延迟1秒后执行,之后按fixedRate的规则每6秒执行一次

四、springboot日志

日志级别
info 重要信息
warn 警告信息
error 错误信息
trace < debug< info < warn < error
默认级别为info,只有 >=info 级别的日志,才能输出。

输出日志

@Slf4j // --- lombok
@RestController
public class LoggingController {
@RequestMapping("/test2")
public R test1() {
log.error("我是error");
log.warn("我是warning");
log.info("我是info");
log.debug("我是degu");
log.trace("我是trace");
return R.ok("日志测试");
}
}

调整日志级别

logging:
level:
# root: trace #最低跟踪级别
root: info # 统一定义日志级别 全局
com.hl.springboot3.web: trace #局部日志级,在包名下trace是此包的全局日志,从整体来看是局部日志级

日志框架关系

使用logback日志

 logback.xml文件如下所示,<!-- 定义日志的根目录 -->时要更改为自己的磁盘地址

<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒当scan为
true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为
false。
-->
<configuration scan="false" scanPeriod="60 seconds" debug="false">
<!-- 定义日志的根目录 -->
<property name="LOG_HOME" value="F:/upload/log" />
<!-- 定义日志文件名称 -->
<property name="appName" value="springboot"></property>
<!-- ch.qos.logback.core.ConsoleAppender 表示控制台输出 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!--
日志输出格式:
%d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}
- %msg%n</pattern>
</layout>
</appender>
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
<appender name="appLogAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 指定日志文件的名称 -->
<file>${LOG_HOME}/${appName}.log</file>
<!--
当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名
TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负
责出发滚动。
-->
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--
滚动时产生的文件的存放位置及文件名称 %d{yyyy-MM-dd}:按天进行日志滚动
%i:当文件大小超过maxFileSize时,按照i进行文件滚动
-->
<fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-
%i.log</fileNamePattern>
<!--
可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每天滚动,
且maxHistory是365,则只保存最近365天的文件,删除之前的旧文件。注意,删除旧文件
是,
那些为了归档而创建的目录也会被删除。
-->
<MaxHistory>365</MaxHistory>
<!--
当日志文件超过maxFileSize指定的大小是,根据上面提到的%i进行日志文件滚动 注意此处
配置SizeBasedTriggeringPolicy是无法实现按文件大小进行滚动的,必须配置
timeBasedFileNamingAndTriggeringPolicy
-->
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 日志输出格式: -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [
%logger{50} : %line ] - %msg%n</pattern>
</layout>
</appender>
<!--
logger主要用于存放日志对象,也可以定义日志类型、级别
name:表示匹配的logger类型前缀,也就是包的前半部分
level:要记录的日志级别,包括 TRACE < DEBUG < INFO < WARN < ERROR
additivity:作用在于children-logger是否使用 rootLogger配置的appender进行输出,
false:表示只用当前logger的appender-ref,true:
表示当前logger的appender-ref和rootLogger的appender-ref都有效
-->
<!--******************* name需要修改为当前项目的包名 *********************-->
<logger name="com.hl.springboot3.web" level="debug" />
<!-- Spring framework logger -->
<logger name="org.springframework" level="debug" additivity="false">
</logger>
<!--
root与logger是父子关系,没有特别定义则默认为root,任何一个类只会和一个logger对应,
要么是定义的logger,要么是root,判断的关键在于找到这个logger,然后判断这个logger的
appender和level。
-->
<root level="info">
<appender-ref ref="stdout" />
<appender-ref ref="appLogAppender" />
</root>
</configuration

五、swagger

swagger 文档简略
apifox 文档详细

1、引入jar包

<!-- swagger包 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency

2、配置 2.6 ,2.7需要配置
如果你使用的是 Springboot 2.6 / 2.7 版本,需要配置,否则报错,如果是Springboot2.5.8则省略

spring:mvc:pathmatch:matching-strategy: ant_path_match

3、编写配置

在项目中新建 SwaggerConfig配置类:
 

<!-- swagger包 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
spring:
mvc:
pathmatch:
matching-strategy: ant_path_matcher
import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
@Configuration
@EnableOpenApi
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30)
.groupName("后端API分组")
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build();
}
/**
* API 页面展示信息
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("测试文档")
.description("xxxx软件接口文档")
.contact(new Contact("admin","http://www.baidu.com", "*"))
.version("1.0.0")
.build();
}
}

4、浏览器访问
http://localhost:8080/swagger-ui/index.html
5、Swagger3注解
@Api:用在请求的类上,表示对类的说明

  • tags="说明该类的作用,可以在UI界面上看到的注解";
  • value="该参数没什么意义,在UI界面上也看到,所以不需要配置";

@ApiOperation:用在请求的方法上,说明方法的用途、作用

  • value="说明方法的用途、作用";
  • notes="方法的备注说明";

@ApiImplicitParams:用在请求的方法上,表示一组参数说明

  • @ApiImplicitParam:用在@ApiImplicitParams注解中,指定一个请求参数的各个方面
  • name:参数名
  • value:参数的汉字说明、解释
  • required:参数是否必须传
  • paramType:参数放在哪个地方
    header --> 请求参数的获取:@RequestHeader
    query --> 请求参数的获取:@RequestParam
    path(用于restful接口)--> 请求参数的获取:@PathVariable
    body(不常用)
    form(不常用)
  • dataType:参数类型,默认String,其它值dataType="Integer"
  • defaultValue:参数的默认值

@ApiResponses:用在请求的方法上,表示一组响应

  • @ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息
    code:数字,例如400
    message:信息,例如"请求参数没填好"
    response:抛出异常的类

  • 这种一般用在post创建的时候,使用@RequestBody这样的场景,请求参数无法使用
  • @ApiImplicitParam注解进行描述的时候
  • @ApiModelProperty:用在属性上,描述响应类的属性

示例代码:
第一种方式:多参数方式

@RestController
@RequestMapping("emp")
@Api(tags = "员工管理接口")
public class EmployeeController {
@ApiOperation(value = "添加员工信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "name", value = "姓名", required = true,
paramType = "query", dataType = "String"),
@ApiImplicitParam(name = "age", value = "年龄", required = true,
paramType = "query", dataType = "int"),
@ApiImplicitParam(name = "tel", value = "电话", required = true,
paramType = "query", dataType = "String"),
@ApiImplicitParam(name = "email", value = "邮箱", required = true,
paramType = "query", dataType = "String")
})
@ApiResponses({
@ApiResponse(code = 200, message = "成功"),
@ApiResponse(code = 400, message = "参数错误"),
@ApiResponse(code = 500, message = "服务器内部错误")
})
@RequestMapping("add")
public R test1(String name,int age,String tel, String email) {
System.out.println(name+age+tel+email);
return R.ok("添加成功");
}
}

第二种方式:实体类方式

@Data
@ApiModel
public class Employee {
@ApiModelProperty(value = "编号",required = true)
private int id;
@ApiModelProperty(value = "用户名",required = true)
private String name;
@ApiModelProperty(value = "年龄",required = true)
private int age;
@ApiModelProperty(value = "电话",required = true)
private String tel;
@ApiModelProperty(value = "邮箱",required = true)
private String email;
}
@RequestMapping("add2")
public R test1(Employee emp) {
System.out.println(emp.toString());
return R.ok("添加成功");
}

六、springboot自动装配原理

@SpringbooApplication
底层包含元注解和其他注解

TYPE类型, FIELD属性, METHOD方法, PARAMETER参数,CONSTRUCTO构造方法

@Target() 目标位置
ElementType.
TYPE, FIELD, METHOD, PARAMETER,CONSTRUCTO
@Retention(RetentionPolicy.RUNTIME)
SOURCE,
CLASS,
RUNTIM
@SpringBootConfiguration
@Configuration 创建ioc容器
@EnableAutoConfiguration 自动配置 自动装配核心注解
meta-inf/spring.factoies
找到自动配置的类
@ComponentScan
默认扫描的包 com.hl.springboot3
加载自动配置的类,看是否满足条件,满足条件了,就创建对象,不满足不创建
@AutoConfiguration(
after = {DataSourceAutoConfiguration.class}
)
@ConditionalOnClass({DataSource.class, JdbcTemplate.class}) 当某个类存在时
@ConditionalOnMissingClass 当某个类不存在
@ConditionalOnBean() 当某个对象存在时
@ConditionalOnMissingBean 当某个丢下不存在
@ConditionalOnSingleCandidate(DataSource.class) 存在某个唯一对象时
@EnableConfigurationProperties({JdbcProperties.class})
@Import({DatabaseInitializationDependencyConfigurer.class,
JdbcTemplateConfiguration.class, NamedParameterJdbcTemplateConfiguration.class})

 

总结 

1、如何实现参数校验功能(掌握)

spring-boot-starter-validation

使用方式
1. 引入依赖:在Spring Boot项目中,首先需要引入 spring-boot-starter-validation 依赖。
2. 在实体类中使用注解:在需要校验的实体类属性上添加相应的校验注解。
3. 在Controller中使用注解:在Controller的方法参数上使用 @Valid 或 @Validated 注解来触发校验。

针对方法、参数,单独校验如何实现?
针对接收的bean对象,如何整体校验?

  • @Valid 通常用于方法、参数
  • @Validated 可以用于方法、参数上。

相关的注解有哪些?

1. @NotNull:用于检查被注解的元素值是否为null。适用于字符串、集合、Map等任何对象类型,
但不适用于基本数据类型(如int、long等)。
2. @NotBlank:用于检查被注解的字符串元素是否不为null且去除两端空白字符后长度大于0。只适
用于字符串类型。
3. @NotEmpty:用于检查被注解的元素不为null且不为空。适用于字符串、集合、Map等。如果是
字符串,相当于同时检查null和长度大于0。
4. @Size:用于指定字段的长度范围。可以指定最小长度(min)和最大长度(max)。
5. @Email:用于检查被注解的字符串是否为有效的电子邮件地址。
6. @Pattern:用于检查被注解的字符串是否符合指定的正则表达式。
7. @Min 和 @Max:分别用于检查被注解的数值是否大于等于最小值和小于等于最大值。
8. @DecimalMin 和 @DecimalMax:分别用于检查被注解的小数是否大于等于最小值和小于等于
最大值。
9. @Range 是 Hibernate Validator 提供的一个用于数据校验的注解,它主要用于对数值类型(如
int 、 long 、 BigDecimal 等)的属性进行范围校验,确保属性值在指定的最小值和最大值之
间。

注解适用类型功能说明
@NotNull对象类型(非基本数据类型)检查被注解的元素值是否为 非 null。不适用于 int、long 等基本类型。
@NotBlankString检查字符串是否 非 null 且去除两端空白后长度大于 0。
@NotEmptyString、Collection、Map、数组等检查被注解的元素是否 非 null 且 非空(如字符串长度 > 0)。
@Size(min, max)String、Collection、Map、数组等指定字段的长度或大小在指定范围内(min 和 max)。
@EmailString检查字符串是否为一个 有效的电子邮件地址
@Pattern(regex)String检查字符串是否符合指定的 正则表达式
@Min(value)数值类型(int、long、BigDecimal 等)检查数值是否 大于等于 指定的最小值。
@Max(value)数值类型检查数值是否 小于等于 指定的最大值。
@DecimalMin(value)小数类型(BigDecimal、double 等)检查小数值是否 大于等于 指定的最小值(支持字符串表示的小数)。
@DecimalMax(value)小数类型检查小数值是否 小于等于 指定的最大值(支持字符串表示的小数)。
@Range(min, max)数值类型(Hibernate Validator)检查数值是否在指定的最小值和最大值之间(属于 Hibernate 提供的扩展注解)。

2、springmvc异常处理的两种方式?(掌握)

控制层异常处理

1、局部异常处理(少)

只针对当前controller方法中的异常进行处理@ExectionHanlder

public class UserController{
@RequestMapping("/m3")
public R m3(Integer id){
System.out.println(1/0);
return R.ok(id);
}
// //异常处理器
// @ExceptionHandler(Exception.class)
// public R exception(Exception e){
// e.printStackTrace();
// return R.fail("服务器繁忙,稍后访问!");
// }
}

2、全局异常处理(多)

可以对所有controller方法中的异常进行处理(也可以限制处理部分包,部分类或者特定的异常)

@ExectionHanlder
@ControllerAdvice @RestControllerAdvice 

package com.hl.springboot3.web;
import com.hl.springboot3.pojo.R;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/*
@ControllerAdvice
@ResponseBody
*/
/*
全局异常处理:可以限制特定的包、特定的类、使用了特定注解的类,
还可以限制只处理特定的异常
*/
@RestControllerAdvice(annotations = RestController.class,
basePackages = "com.hl.springboot3.web",
basePackageClasses = {UserController.class})
//@RestControllerAdvice
public class GlobalExceptionHandler {
//异常处理器
@ExceptionHandler(Exception.class)
public R exception(Exception e){
e.printStackTrace();
return R.fail("服务器繁忙,稍后访问!");
}
}

3、log4j、logback、lombok常见的日志框架对应的日志级别有哪些?(掌握)

 如何修改日志级别:
logging.level.root=debug
logging.level.包名=debug

常见的日志框架对应的日志级别:

  • info 重要信息
  • warn 警告信息
  • error 错误信息

trace < debug< info < warn < error
默认级别为info,只有 >=info 级别的日志,才能输出。
各框架的支持情况

  • Log4j: 支持上述所有的日志级别(ALL, TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF)。可以通过配置文件设置全局或特定包下的日志级别。

  • Logback: 作为Log4j的精神继承者,支持相同的日志级别(ALL, TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF),并且提供了更加灵活和高效的配置选项。

  • Lombok: Lombok不是一个日志框架,而是一个Java库,它通过注解简化了代码。Lombok提供@Slf4j, @Log4j, @Log4j2, @CommonsLog等注解,可以自动生成日志对象,从而方便地使用SLF4J、Log4j、Log4j2或Apache Commons Logging提供的日志功能。因此,Lombok自身并不定义日志级别,而是依赖于所使用的具体日志实现(如Logback或Log4j)。

4、定时器 相关的注解,如何定时功能(掌握)

在Spring Boot中,定时器是一种用于在特定时间点或按照预定时间间隔自动执行任务的机制。
周报表、月报表、年报表

1. 在启动类开启定时@EnableScheduling

@SpringBootApplication
//开启定时
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

2. 创建定时任务实现类@Scheduled

/**
* 定时任务类1
*/
//要声明为bean,没有声明启动类启动无法实现定时效果
@Component
public class SchedulerTask {
//表示每隔6秒打印一次
@Scheduled(cron = "*/6 * * * * ?")
public void proces(){
System.out.println("this is a scheduler task running");
}
}
/**
* 定时任务类2
*/
@Component
public class Scheduler2Task {
//表示每隔6秒打印一次
@Scheduled(fixedRate = 6000)
public void reportCurrentTime(){
System.out.println("现在时间:"+new Date());
}
}
@Component
public class MyScheduler {
//    @Scheduled(cron = "*/6 * * * * *") // 第一个星每隔6秒执行一次  分钟 小时 日 月 周@Scheduled(initialDelay = 5000, fixedRate = 10000) // 第一个参数延迟1秒执行,第二个参数每隔5秒执行一次
public void print(){
System.out.println("MyScheduler...."+new Date());
}
}

3. 启动类启动即可

参数说明
@Scheduled 参数可以接受两种定时的设置,一种是我们常用的 cron="*/6 * * * * ?" ,一种是
fixedRate = 6000 ,两种都表示每隔六秒打印一下内容。


fixedRate 说明

  • @Scheduled(fixedRate = 6000) :上一次开始执行时间点之后6秒再执行
  • @Scheduled(fixedDelay = 6000) :上一次执行完毕时间点之后6秒再执行
  • @Scheduled(initialDelay=1000, fixedRate=6000) :第一次延迟1秒后执行,之后按fixedRate的规则每6秒执行一次

5、swagger 接口工具 了解


6、springboot自动装配原理(看面试题,按照面试题背 )


@EnableAutoConfiguration
条件装配注解

@ConditionalOnProperty
@ConditionalOnMissingClass
@ConditionalOnClass
@ConditionalOnBean
@ConditionalOnMissingBean
@AutoConfiguration(
after = {JdbcTemplateAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class}
)


 

相关文章:

SpringBoot Day_03

目录 一、数据校验 二、统一异常处理 1、局部异常处理&#xff08;少&#xff09; 2、全局异常处理&#xff08;多&#xff09; 三、定时器 四、springboot日志 五、swagger 六、springboot自动装配原理 总结 1、如何实现参数校验功能&#xff08;掌握&#xff09; …...

Ubuntu 新建用户

在 Ubuntu 22.04 中创建新用户并赋予 root 权限的步骤如下&#xff0c;综合多篇文档推荐的安全方法&#xff1a; 一、创建新用户 使用 adduser 命令创建用户 sudo adduser your_username系统会提示设置密码及填写用户信息&#xff08;全名、电话等&#xff0c;可直接回车跳过&a…...

从法律视角看湖北理元理律师事务所的债务优化实践

债务问题解决需要专业法律支持。本文将从实务角度&#xff0c;解析湖北理元理律师事务所在债务优化领域的工作方法&#xff0c;为有需要的读者提供参考。 一、法律框架下的债务重组 利率合法性审查 识别超过法定上限的利息部分 收集相关证据材料 启动协商或诉讼程序 还款…...

# JavaSE核心知识点02面向对象编程

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 JavaSE核心知识点02面向对象编程JavaSE核心知…...

从原理到实践:一文详解残差网络

在深度学习的发展历程中&#xff0c;神经网络的深度一直是提升模型性能的关键因素之一。随着网络层数的增加&#xff0c;模型理论上可以学习到更复杂、更抽象的特征表示。然而&#xff0c;在实际训练过程中&#xff0c;研究人员发现&#xff0c;当网络深度达到一定程度后&#…...

把银河装进镜头里!动态星轨素材使用实录

仰望夜空时&#xff0c;神秘的银河与闪烁繁星总令人向往。如今&#xff0c;无需复杂拍摄&#xff0c;借助素材平台就能将绝美星轨融入创作&#xff0c;今天重点安利 制片帮素材&#xff01; 动态星轨&#xff1a;宇宙的浪漫印记 星轨是地球自转时&#xff0c;星星运动留下的轨…...

C++23中std::span和std::basic_string_view可平凡复制提案解析

文章目录 一、引言二、相关概念解释2.1 平凡复制&#xff08;Trivially Copyable&#xff09;2.2 std::span2.3 std::basic_string_view 三、std::span和std::basic_string_view的应用场景3.1 std::span的应用场景3.2 std::basic_string_view的应用场景 四、P2251R1提案对std::…...

【KWDB 2025 创作者计划】_KWDB时序数据库特性及跨模查询

一、概述 数据库的类型多种多样&#xff0c;关系型数据库、时序型数据库、非关系型数据库、内存数据库、分布式数据库、图数据库等等&#xff0c;每种类型都有其特定的使用场景和优势&#xff0c;KaiwuDB 是一款面向 AIoT 场景的分布式、多模融合、支持原生 AI 的数据库…...

树 Part 9

二叉树的建立 了解了二叉树的遍历方法&#xff0c;我们如何在内存中生成一棵二叉链表的二叉树呢&#xff1f;树都没有&#xff0c;哪来遍历。所以我们还得来谈谈关于二叉树建立的问题。 如果要在内存中建立一个如左图这样的树&#xff0c;为了能让每个结点确认是否有左右孩子…...

leetcode每日一题 -- 3362. 零数组变换 III

思路 题意是要找出[最少的区间]使nums数组变为零数组,并且使用的区间可以不连续 我的第一想法是先给区间按照左边界排序(就像区间合并题的准备工作那样)这样的可以使用最大堆,每次将右区间值最大(也就是区间范围最大)的区间应用到差分数组中但是,后续如何处理还是不太会,遂看…...

PARSCALE:大语言模型的第三种扩展范式

----->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<----- 随着人工智能技术的飞速发展&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为推动机器智能向通用人工智能&#xff08;AGI&#xff09;迈进的核心驱动力。然而&#xff0c;传统的…...

【 开源:跨平台网络数据传输的万能工具libcurl】

在当今这个互联互通的世界中&#xff0c;数据在各种设备和平台之间自由流动&#xff0c;而 libcurl&#xff0c;就像一把跨平台的万能工具&#xff0c;为开发者提供了处理各种网络数据传输任务所需的强大功能。它不仅是一个库&#xff0c;更是一种通用的解决方案&#xff0c;可…...

2025版 JavaScript性能优化实战指南从入门到精通

JavaScript作为现代Web应用的核心技术&#xff0c;其性能直接影响用户体验。本文将深入探讨JavaScript性能优化的各个方面&#xff0c;提供可落地的实战策略。 一、代码层面的优化 1. 减少DOM操作 DOM操作是JavaScript中最昂贵的操作之一&#xff1a; // 不好的做法&#x…...

RAGFlow知识检索原理解析:混合检索架构与工程实践

一、核心架构设计 RAGFlow构建了四阶段处理流水线,其检索系统采用双路召回+重排序的混合架构: S c o r e f i n a l = α ⋅ B M...

leetcode 148. Sort List

148. Sort List 题目描述 代码&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNod…...

C#学习11——集合

一、集合 是一组对象的容器&#xff0c;提供了高效的存储、检索和操作数据的方式。 C# 集合分为泛型集合&#xff08;推荐使用&#xff09;和非泛型集合&#xff0c;主要位于System.Collections和System.Collections.Generic命名空间中。 二、集合有哪些&#xff1f; 1&…...

paddlehub搭建ocr服务

搭建环境&#xff1a; Ubuntu20.041080Ti显卡 由于GPU硬件比较老&#xff0c;是Pascal架构&#xff0c;只能支持到paddle2.4.2版本&#xff0c;更高版本无法支持&#xff1b;同时&#xff0c;因为paddle老版本的依赖发生了变化&#xff0c;有些地方存在冲突&#xff0c;花费了…...

CSS3过渡

一、什么是CSS3过渡 CSS3 过渡&#xff08;transitions&#xff09;是一种效果&#xff0c;它允许你平滑地改变CSS属性的值&#xff0c;从一个状态过渡到另一个状态。是一种动画转换的过程&#xff0c;如渐现、渐弱、动画快慢等。过渡效果可以在用户与页面进行交互时触发&#…...

比斯特自动化|移动电源全自动点焊机:高效点焊助力移动电源制造

在移动电源市场蓬勃发展的当下&#xff0c;电池组合的点焊工艺要求愈发严格。移动电源全自动点焊机应运而生&#xff0c;成为提升生产效率与产品质量的关键设备。 工作原理与结构组成 移动电源全自动点焊机通过瞬间放电产生高温&#xff0c;使电池极耳与镍带等材料在极短时间…...

游戏引擎学习第305天:在平台层中使用内存 Arena 的方法与思路

回顾前一天内容&#xff0c;并为今天的开发工作设定方向 我们正在直播制作完整游戏&#xff0c;当前正在实现一个精灵图&#xff08;sprite graph&#xff09;的排序系统。排序的代码已经写完&#xff0c;过程并不复杂&#xff0c;虽然还没做太多优化&#xff0c;但总体思路比…...

[Java][Leetcode middle] 6. Z 字形变换

法一&#xff0c;自己想的 使用一个复合结构的 List<ArrayList<String>> 来存储每一行的字母&#xff0c;最后按序输出。 使用flag来判断到底放到哪一行上去。flag按照&#xff1a;0–1–2–1–0–1–2这样变化&#xff0c;实现躺着的Z字形。 public String conve…...

零基础设计模式——第二部分:创建型模式 - 原型模式

第二部分&#xff1a;创建型模式 - 5. 原型模式 (Prototype Pattern) 我们已经探讨了单例、工厂方法、抽象工厂和生成器模式。现在&#xff0c;我们来看创建型模式的最后一个主要成员——原型模式。这种模式关注的是通过复制现有对象来创建新对象&#xff0c;而不是通过传统的…...

完整改进RIME算法,基于修正多项式微分学习算子Rime-ice增长优化器,完整MATLAB代码获取

1 简介 为了有效地利用雾状冰生长的物理现象&#xff0c;最近开发了一种优化算法——雾状优化算法&#xff08;RIME&#xff09;。它模拟硬雾状和软雾状过程&#xff0c;构建硬雾状穿刺和软雾状搜索机制。在本研究中&#xff0c;引入了一种增强版本&#xff0c;称为修改的RIME…...

【1——Android端添加隐私协议(unity)1/3】

前言&#xff1a;这篇仅对于unity 发布Android端上架国内应用商店添加隐私协议&#xff0c;隐私协议是很重要的东西&#xff0c;没有这个东西&#xff0c;是不上了应用商店的。 对于仅仅添加隐私协议&#xff0c;我知道有三种方式,第一种和第二种基本一样 1.直接在unity里面新…...

笔记本6GB本地可跑的图生视频项目(FramePack)

文章目录 &#xff08;一&#xff09;简介&#xff08;二&#xff09;本地执行&#xff08;2.1&#xff09;下载&#xff08;2.2&#xff09;更新&#xff08;2.3&#xff09;运行&#xff08;2.4&#xff09;生成 &#xff08;三&#xff09;注意&#xff08;3.1&#xff09;效…...

Android View的事件分发机制

ViewGroup的事件分发逻辑 从Activity传递给Window&#xff0c;再传递给ViewGroup&#xff0c;ViewGroup的dispatchTouchEvent()会被调用&#xff0c;如果onInterceptTouchEvent()返回true 转交自身onTouchEvent()处理,如果返回false继续向子View传递,子View的dispatchTouchEve…...

Python字符串格式化(二): f-string的进化

文章目录 一、Python 3.6&#xff1a;重新发明字符串格式化&#xff08;2016&#xff09;1. 语法糖的诞生&#xff1a;表达式直嵌技术2. 性能与可读性的双重提升3. 奠定现代格式化的基础架构 二、Python 3.7&#xff1a;解锁异步编程新场景&#xff08;2018&#xff09;1. 异步…...

力扣HOT100之二叉树:124. 二叉树中的最大路径和

这道题是困难题&#xff0c;靠自己想还是挺难想的&#xff0c;还是去看的灵神的题解&#xff0c;感觉还是要多复习一下这道题。这道题的思路和之前做的543. 二叉树的直径很像&#xff0c;可以参考之前的这篇博客。这里我们还是用递归来做&#xff0c;定义一个lambda函数来实现递…...

【C++】位图+布隆过滤器

1.位图 概念 所谓位图&#xff0c;就是用每一位来存放某种状态&#xff0c;适用于海量数据&#xff0c;数据无重复的场景。通常是用来判断某个数据存不存在的或是否被标记。 1.二进制位表示 &#xff1a; 位图中的每一位&#xff08;bit&#xff09;代表一个元素的状态。通常&…...

Google Agent Development Kit与MCP初试

Google Agent Development Kit与MCP初试 一、背景知识二、搭建智能大脑 - Ollama服务器2.1 为什么要先搭建Ollama&#xff1f;2.2 搭建ollama服务器2.2.1 安装2.2.2 试着用curl命令"问"AI一个问题&#xff1a; 三、构建智能体工坊 - ADK环境3.1 创建容器3.2 安装核心…...

云原生+大数据

虚拟化&#xff1a; 虚拟化&#xff0c;是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机&#xff0c;每个逻辑计算机可运行不同的操作系统&#xff0c;并且应用程序都可以在相互独立的空间内运行而互不影响&#xff0c;从而显著提…...

基于cornerstone3D的dicom影像浏览器 第二十一章 显示DICOM TAGS

系列文章目录 第一章 下载源码 运行cornerstone3D example 第二章 修改示例crosshairs的图像源 第三章 vitevue3cornerstonejs项目创建 第四章 加载本地文件夹中的dicom文件并归档 第五章 dicom文件生成png&#xff0c;显示检查栏&#xff0c;序列栏 第六章 stack viewport 显…...

【记录】PPT|PPT打开开发工具并支持Quicker VBA运行

文章目录 打开开发者工具支持Quicker VBA运行 打开开发者工具 参考文章&#xff0c;微软文档&#xff1a;显示“开发工具”选项卡&#xff0c;以下直接复制&#xff0c;如侵私删。 适用对象&#xff1a;Microsoft 365 专属 Excel Microsoft 365 专属 Outlook Microsoft 365 专属…...

西门子 S1500 博途软件舞台威亚 3D 控制方案

西门子 S1500 PLC 是工业自动化领域的主流控制器&#xff0c;适合高精度、高可靠性的舞台威亚控制。下面为你提供基于博途 (TIA Portal) 软件的 3D 控制方案设计。 系统架构设计 舞台威亚 3D 控制系统通常包含以下组件&#xff1a; 硬件层&#xff1a; S1500 PLC 主机伺服驱动…...

第三十二天打卡

import pandas as pd from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier # 加载鸢尾花数据集 iris load_iris() df pd.DataFrame(iris.data, columnsiris.feature_names) …...

同步/异步电路;同步/异步复位

同步/异步电路&#xff1b;同步/异步复位 在 FPGA 设计中&#xff0c;同步电路、异步电路、同步复位和异步复位是基础且关键的概念&#xff0c;它们的特性直接影响电路的可靠性、时序性能和设计复杂度。 一、同步电路&#xff08;Synchronous Circuit&#xff09; 定义 同步电…...

spring boot 实现resp视频推流

1、搭建resp服务&#xff08;docker方式&#xff09; docker pull aler9/rtsp-simple-serverdocker run -d --restartalways \--name rtsp-server \-p 8554:8554 \aler9/rtsp-simple-server2、maven依赖 <dependency><groupId>org.bytedeco</groupId><a…...

python、R、shell兼容1

一&#xff0c;兼容方式 1&#xff0c;shell中用R、python&#xff1a; &#xff08;1&#xff09;python3、R/r&#xff08;radian&#xff09;进入 &#xff08;2&#xff09;脚本封装&#xff1a;命令行或者封装到sh脚本中 python xxx.py 自定义参数 Rscript xxx.r 自…...

Oracle 11G RAC重启系统异常

vmware安装centos7环境部署Oracle RAC (11.2.0.4) 部署时所有资源情况都是正常的&#xff0c;关机重启虚拟机后集群资源状态异常&#xff0c;请教CSDN大佬 – 部署规划 域名地址备注rac16192.168.31.16rac17192.168.31.17rac16vip192.168.31.26viprac17vip192.168.31.27vip…...

便捷的电脑自动关机辅助工具

软件介绍 本文介绍的软件是一款电脑上实用的倒计时和关机助手。 软件特性 这款关机助手十分贴心&#xff0c;它是一款无需安装的小软件&#xff0c;体积仅60KB&#xff0c;不用担心占用电脑空间&#xff0c;打开即可直接使用。 操作方法 你只需设置好对应的关机时间&#x…...

巧用 FFmpeg 命令行合并多个视频为一个视频文件教程

你是否曾经遇到过需要将多个视频片段合并成一个连续视频的情况&#xff1f;比如&#xff0c;你拍摄了一段旅行的精彩瞬间&#xff0c;想把它们合成一部短片&#xff1b;或者你在制作教学视频时&#xff0c;希望将不同的部分整合在一起。这时候&#xff0c;FFmpeg 就是你的得力助…...

平时使用电脑,如何去维护

在这个数字化的时代&#xff0c;电脑已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;你是否知道如何正确地维护它&#xff0c;让它始终保持良好的运行状态呢&#xff1f;今天&#xff0c;就让我来为大家揭晓这个谜底。定期清理电脑内部和外部的灰尘是至关重要的。…...

(视觉)分类、检测与分割在不同网络中的设计体现

分类、检测与分割在不同网络中的设计体现 概述 在计算机视觉领域&#xff0c;不同的网络结构在功能和结构上差异显著&#xff0c;同时也共享一些基础设计元素。 卷积神经网络是基石&#xff1a; 卷积层通过特定的卷积核与图像进行卷积运算提取图像中的局部特征&#xff0c;比…...

技术分享 | MySQL大事务导致数据库卡顿

本文为墨天轮数据库管理服务团队第66期技术分享&#xff0c;内容原创&#xff0c;作者为技术顾问孙文龙&#xff0c;如需转载请联系小墨&#xff08;VX&#xff1a;modb666&#xff09;并注明来源。 一、现 象 业务侧反馈连接数据库异常&#xff0c;报错 connection is not av…...

C#在 .NET 9.0 中启用二进制序列化:配置、风险与替代方案

在 .NET 9.0 中启用二进制序列化&#xff1a;配置、风险与替代方案 引言一、启用二进制序列化的步骤二、实现序列化与反序列化三、安全风险与缓解措施四、推荐替代方案五、总结 引言 在 .NET 生态中&#xff0c;二进制序列化&#xff08;Binary Serialization&#xff09;曾是…...

每日Prompt:像素风格插画

提示词 像素风格插画&#xff0c;日式漫画脸&#xff0c;画面主体为一位站在路边的男孩&#xff0c;人物穿着黑色冲锋衣&#xff0c;手里拿着手机&#xff0c;男孩靠坐在机车旁边&#xff0c;脚边依偎着一只带着小摩托车头盔的小小猫&#xff0c;背景是雨中&#xff0c;身旁停…...

Rust 学习笔记:生命周期

Rust 学习笔记&#xff1a;生命周期 Rust 学习笔记&#xff1a;生命周期使用生命周期防止悬空引用借用检查器函数中的泛型生命周期生命周期注释语法函数签名中的生命周期注解从生命周期的角度思考结构定义中的生命周期注解省略生命周期方法定义中的生命周期注释静态生命周期泛型…...

科学标注法:数据治理的未来之路

在数据治理领域,科学标注法是一种系统化、标准化的数据标注方法论,其核心是通过规范化的流程、技术工具和质量控制机制,将原始数据转化为具有语义和结构特征的可用数据资源。以下从定义、技术特征、应用场景、与传统标注方法的区别以及遵循的标准框架等方面展开详细解析: 一…...

小白刷题 之 如何高效计算二进制数组中最大连续 1 的个数

前言 学习如何快速找出二进制数组中最长的连续 1 序列。 这个问题在数据处理、网络传输和算法面试中经常出现&#xff0c;掌握它不仅能提升编程能力&#xff0c;还能加深对数组操作和循环控制的理解。 &#x1f31f; 问题背景 想象你是一位网络工程师&#xff0c;正在分析服…...

中科方德鸳鸯火锅平台使用教程:轻松运行Windows应用!

原文链接&#xff1a;中科方德鸳鸯火锅平台使用教程&#xff1a;轻松运行Windows应用&#xff01; Hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇中科方德鸳鸯火锅平台使用的文章&#xff0c;欢迎大家分享点赞&#xff0c;点个在看和关注吧&#xff01;在信创环境…...