springboot核心注解示例详解

文章简介

本文主要介绍springboot框架学习和工作中常用的核心注解,对注解进行了清晰地分类,配以简易代码和易懂的解释,能够让你掌握每个核心注解的用法,并可以迁移到学习和工作中加以使用。本文注解偏向于实用性。

springboot一大特点在于约定大于配置,这使得该框架不需要繁杂的配置而简单易上手,集中体现在通过注解实现各种功能代替配置和冗余代码,因此掌握核心注解的用法,就相当于掌握该框架的基本使用。本文使用了用户/书本查询这一简单功能逻辑作为注解说明示例。

文章目录

  • 一、Http请求/SpringMVC注解
    • @RequestMapping、@GetMapping、@PostMapping、@PutMapping、@DeleteMapping
  • 二、参数传递类注解
    • 1.@RequestParam
    • 2.@PathVariable
    • 3.@RequestBody
    • 4.@ResponseBody
  • 三、Bean处理注解
    • @Autowired、@Qualifier、@Resource
  • 四、配置读取
    • @Value
    • @ConfigurationProperties + @ProperySource
  • 五、参数校验注解
    • @Valid 、@Validated、@NotEmpty等
  • 六、统一异常处理注解
    • @ControllerAdvice、@ExceptionHandler、@ResponseStatus
  • 七、JSON相关注解
    • @JsonProperty
    • @JsonInclude
    • @JsonIgnore
    • @JsonIgnoreProperties
  • 八、其他核心注解
    • @SpringBootApplication
  • 九、注解快速一览回顾

一、Http请求/SpringMVC注解

@RequestMapping、@GetMapping、@PostMapping、@PutMapping、@DeleteMapping

注解说明
@RequestMapping将Web请求与请求处理类中的方法进行映射,常用配置属性有value和method,分别指代映射的请求URL和HTTP的方法名
@GetMapping用于处理HTTP GET请求,等同于@RequestMapping(method=RequestMethod.GET)
@PostMapping用于处理HTTP POST请求等同于@RequestMapping(method=RequestMethod.POST)
@PutMapping用于处理HTTP PUT请求 等同于@RequestMapping(method=RequestMethod.PUT)
@DeleteMapping用于处理HTTP DELETE请求等同于@RequestMapping(method=RequestMethod.DELETE)

使用示例:
@RequestMapping

    @RequestMapping(value = "/get_name", method = RequestMethod.GET)
    public ResponseEntity<String> getUserName() {
        return ResponseEntity.status(HttpStatus.OK).body("zhangsan");
    }

@GetMapping

    @GetMapping(value = "/get_name")
    public ResponseEntity<String> getUserName() {
        return ResponseEntity.status(HttpStatus.OK).body("zhangsan");
    }

以上请求的URL和结果均如下所示:
————————————————————————————————————
在这里插入图片描述
————————————————————————————————————
小结:从以上可以看到,@RequestMapping通过配置method属性,可以与其余四类等价使用。

二、参数传递类注解

注解说明
@RequestParam用于将方法的参数与Web请求的传递的参数进行绑定
@PathVariable将方法中的参数绑定到请求URI中的模板变量上
@RequestBody在处理请求方法的参数列表中使用,它可以将请求主体中的参数绑定到一个对象中
@ResponseBody自动将控制器中方法的返回值写入到HTTP响应中。一般是将java对象转为json格式的数据,然后直接写入HTTP response 的body中

1.@RequestParam

用于将方法的参数与Web请求的传递的参数进行绑定

    @RequestMapping(value = "/get_id", method = RequestMethod.GET)
    public ResponseEntity<User> getUserById(@RequestParam(value = "id") String userId) {
        User user = new User();
        user.setId(Integer.valueOf(userId));
        return ResponseEntity.status(HttpStatus.OK).body(user);
    }

对应前端的URL请求为

http://localhost:8081/get_id?id=1

故该注解从前端请求的URL中获取查询参数的值,并作为传参赋给userId。

2.@PathVariable

将方法中的参数绑定到请求URI中的模板变量上

    @RequestMapping(value = "/get_id/{id}", method = RequestMethod.GET)
    public ResponseEntity<User> getUserByPathId(@PathVariable("id") String userId) {
        User user = new User();
        user.setId(Integer.valueOf(userId));
        return ResponseEntity.status(HttpStatus.OK).body(user);
    }

对应前端的URL请求为

http://localhost:8081/get_id/1

故该注解从前端请求的URL中的路径中获取属性名为id的值,并作为传参赋给userId。

3.@RequestBody

在处理请求方法的参数列表中使用,它可以将请求主体中的参数绑定到一个对象中

    @RequestMapping(value = "/get_user", method = RequestMethod.POST)
    public ResponseEntity<User> getUser(@RequestBody User user) {
        return ResponseEntity.status(HttpStatus.OK).body(user);
    }

对应前端的body体内容为
————————————————————————————————————
在这里插入图片描述
————————————————————————————————————

故该注解可以从前端请求的BODY体中将参数与注解作用处的User对象相绑定。

4.@ResponseBody

自动将控制器中方法的返回值写入到HTTP响应中。一般是将java对象转为json格式的数据,然后直接写入HTTP response 的body中

@Controller
@ResponseBody
public class UserController {
    @RequestMapping(value = "/get_id", method = RequestMethod.GET)
    public ResponseEntity<User> getUserById(@RequestParam(value = "id") String userId) {
        User user = new User();
        user.setId(Integer.valueOf(userId));
        return ResponseEntity.status(HttpStatus.OK).body(user);
    }
}

前端请求后,得到的返回体如下,是一个user对象的JSON体。
————————————————————————————————————
在这里插入图片描述
————————————————————————————————————

三、Bean处理注解

注解说明
@Autowired它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。不适用于一个接口多个实现类的情形,可以通过配合@Qualifier 解决该问题。
@Qualifier用于配合@Autowired注解来指定要注入的具体 Bean 。使用场景:一般是一个接口有多个实现类,这时需要指定使用哪个实现类,如不指明则spring容器会因为不知道装配哪个而报错。
@Resource既可以根据类型注入,也可以根据名称注入。写了name属性,就根据名称注入,不写就根据类型注入。 写name属性的情况等价于@Autowired+@Qualifier。bean的名称,一般如果我们不手动给,就会使用类名,首字母小写作为bean的名称。
@Controller对应 Spring MVC 控制层,一般标注在Controller层的类上
@RestController继承于 @Controller,标注后整个类所有方法将直接返回 JSON 数据,相当于@Controller + @ResponseBody
@Service对应服务层,主要涉及一些复杂的逻辑
@Repository对应持久层即 Dao 层,主要用于数据库相关操作
@Component普通pojo注入spring容器。通用的注解,可标注任意类为 Spring 组件
@Configuration标注是 Java 代码的配置类

@Autowired、@Qualifier、@Resource

@Autowired是最常用的自动注入注解,使用示例:

    @Autowired
    private IUserService userService;

需要注意的是,以上适用于一个接口含一个实现类的情形。如果有两个实现类,例如UserServiceImpl1和UserServiceImpl2,同时实现了IUserService接口,就会编译报错,提升如下:
在这里插入图片描述
解决该办法有两种,以下等价:
1.@Autowired配合@Qualifier注解使用,并在@Qualifier的value属性填上具体实现类的类名,并将首字母改为小写。这样调用的就是UserServiceImpl1实现类中的方法。

    @Autowired
    @Qualifier(value = "userServiceImpl1")
    private IUserService userService;

2.使用@Resource来声明

    @Resource(name = "userServiceImpl1")
    private IUserService userService;

除了上述3个注解,其他Bean注解都是标注在类上,用于被Spring容器管理,整体功能一样,故不再展开,只需要注意对应注解标记在对应层的类上即可,这样更加规范清晰。
例如@Service注解,标注在service层的类上:

@Service
public class UserServiceImpl1 implements IUserService{
    @Override
    public User getUser(String userId) {
        User user = new User();
        user.setId(Integer.valueOf(userId));
        return user;
    }
}

四、配置读取

注解说明
@Value可以在任意 Spring 管理的 Bean 中通过这个注解获取任何来源配置的属性值。用于获取bean的属性,一般用于读取配置文件的数据,作用在变量上
@ConfigurationProperties用于注入Bean属性,然后再通过当前Bean获取注入值,作用在类上 。相对于@Value逐个属性获取,可以通过该注解获取一系列属性值
@ProperySource用来指定读取我们自定义的配置文件

使用示例:

@Value

配置文件application.yaml中配置参数-环境变量

book:
  id: 12
  name: "World"

代码中使用注解并采用${变量}的形式来获取配置文件中的变量,以下为Controller层代码。

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

    @RequestMapping(value = "/book", method = RequestMethod.GET)
    public ResponseEntity<String> getBookName(){
        return ResponseEntity.status(HttpStatus.OK).body(bookName);
    }

以上代码请求最终返回的结果为:“World”

@ConfigurationProperties + @ProperySource

配置文件application.yaml中配置参数,可以看到以book为前缀的变量有一系列,如果使用@Value会导致繁琐,此时可以考虑用以下方式。此处同时演示含多级属性的情况。

book:
  id: "12"
  name: "World"
  address: "Shanghai"
  page: "54"
  size: "20X20"
  publish:
    date: "2024.3.30"
    name: "zhangsan"

新建一个配置类,用于获取配置文件中的属性值。这里我们在注解@ConfigurationProperties的prefix标注变量的共同前缀book,在@PropertySource声明我们的配置文件名。在类中的属性名面要跟环境变量名保持一致。有多级属性则使用静态内部类的形式声明变量。

@Component
@ConfigurationProperties(prefix = "book", ignoreUnknownFields = false)
@PropertySource(value = {"classpath:application.yaml"})
@Data
public class BookConfiguration {

    private String id;
    private String name;
    private String address;
    private String page;
    private String size;
    private Publish publish;

	@Data
    public static class Publish {
        private String date;
        private String name;
    }
}

Controller层代码:

    @Autowired
    private BookConfiguration bookConfiguration;

    @RequestMapping(value = "/book", method = RequestMethod.GET)
    public ResponseEntity<String> getBookPublishName(){
        return ResponseEntity.status(HttpStatus.OK).body(bookConfiguration.getPublish().getName());
    }

以上返回结果为:“zhangsan”
说明:上面出现的@Data注解为lombok框架注解,如未接触过,可以简单理解为该注解代替了bean的所有get/set和构造方法。

五、参数校验注解

注解说明
@Valid可以实现数据的验证,在实体类属性上添加校验规则,从而开启校验功能
@Validated标记在类上,告诉 Spring 去校验方法参数,校验规则可以通过配合以下注解使用
@NotEmpty被注释的字符串的不能为 null 也不能为空
@NotBlank被注释的字符串非 null,并且必须包含一个非空白字符
@Null被注释的元素必须为 null
@NotNull被注释的元素必须不为 null
@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值

@Valid 、@Validated、@NotEmpty等

实体类如下,我们在id和name上标注这两个属性不能为空:

@Data
public class Book {
    @NotBlank
    private String id;

    @NotBlank
    private String name;

    private String publishName;
    private String publishDate;
}

Controller层代码,在传参处增加@Valid注解,实现校验。如果此处使用@Validated注解,结果也是一样的。

    @RequestMapping(value = "/book", method = RequestMethod.POST)
    public ResponseEntity<Book> getBookInfo(@Valid @RequestBody Book book) {
        log.info("book publish name is: " + book.getPublishName());
        return ResponseEntity.status(HttpStatus.OK).body(book);
    }

模拟前端请求,传入body体如下

{
  "id":"12",
  "name":"",
  "publish_name":null,
  "publish_date":null
}

请求后,后端发生报错,提示name不能为空,符合校验预期

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.NotBlank' validating type 'java.lang.String'.

@Validated还可以标注在类上,以下通过正则校验来检查前端传入的bookId是否符合规则。

@RestController
@Validated
public class TestController {
    @RequestMapping(value = "/book/{bookId}", method = RequestMethod.GET)
    public ResponseEntity<String> getBook(@Pattern(regexp = "^[0-9]{2}$", message = "书本编号不正确") @PathVariable("bookId") String bookId) {
        return ResponseEntity.status(HttpStatus.OK).body(bookId);
    }
}

前端请求“/book/123”时,后端报错,符合预期,因为我们id限制为2位数。报错如下

javax.validation.ConstraintViolationException: getBook.bookId: 书本编号不正确

@Valid与@Validated的区别:
1.@Validated是对@Valid的拓展,相对于@Valid来说,提供了分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制。
2.在Controller中校验方法参数时,使用@Valid和@Validated并无特殊差异(若不需要分组校验的话)
3.@Validated注解可以用于类级别,用于支持Spring进行方法级别的参数校验。@Valid可以用在属性级别约束,用来表示级联校验。
4.@Validated只能用在类、方法和参数上,而@Valid可用于方法、字段、构造器和参数上

其他注解如@NotBlank 、@NotNull 、@Min(value)、@Max(value)使用规则与上面@NotEmpty相似,不再赘述。

六、统一异常处理注解

注解说明
@ControllerAdvice定义全局异常处理类
@ExceptionHandler声明异常处理方法,表示遇到这个异常,就执行标注的方法
@ResponseStatus通过在自定义的异常类上使用@ResponseStatus注解来设置HTTP状态
@RestControlAdvice等同于@ControllerAdvice + @ResponseBody

@ControllerAdvice、@ExceptionHandler、@ResponseStatus

注解使用示例如下,一般我们会建一个GlobalExceptionHandler类,用于捕获全局异常,即所有异常都可以走到该类中,并在处理后返回一个统一的异常格式给前端。
@ControllerAdvice用于声明者是一个全局异常处理类。
@ExceptionHandler则相当于一个筛选器,内部定义相关异常类,当程序抛出对应异常时,就会进入该方法中。
@ResponseStatus则是用于自定义设置要返回的HTTP状态。
例如此处我们自定义了一个校验类异常,并且返回的是BAD_REQUEST状态给前端。

@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {

    @ExceptionHandler(DateValidationException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public Exception handleBindException(DateValidationException e) {
        // 对异常e进行解析,
        return xxx;
    }
}

这里仅对注解做简洁说明。后续将会专门做一期全局统一异常处理的代码逻辑演示,这样我们的所有异常情况就可以得到完整封装,不会将一些敏感信息或堆栈直接返回给前端。

七、JSON相关注解

注解说明
@JsonProperty作用在属性上,用于起别名,自定义 JSON 属性名称,以及在序列化和反序列化过程中控制属性的包含。通过使用这个注解,可以确保 JSON 数据与 Java 对象之间正确映射。
@JsonInclude注解用于指定仅在某些条件下才包含属性。例如,您可以要求仅在属性具有非空值时才包含它。
@JsonIgnore注解用于在序列化和反序列化过程中忽略某个属性。这在处理敏感数据或不需要序列化的字段时非常有用。
@JsonIgnoreProperties注解用于在类级别忽略一个或多个属性。这对于在处理来自外部系统的 JSON 数据时忽略未知属性很有用。

@JsonProperty

作用在属性上,用于起别名,自定义 JSON 属性名称,以及在序列化和反序列化过程中控制属性的包含。通过使用这个注解,可以确保 JSON 数据与 Java 对象之间正确映射。
这个注解很好地解决了前端传参与后端参数直接的映射,因为前端JSON中的属性一般使用下划线,而后端使用驼峰来表示一个变量。

实体类代码:

@Data
public class Book {
    private String id;
    private String name;
    
    @JsonProperty("publish_name")
    private String publishName;
    @JsonProperty("publish_date")
    private String publishDate;

}

Controller层代码:

    @RequestMapping(value = "/book", method = RequestMethod.POST)
    public ResponseEntity<Book> getBookInfo(@RequestBody Book book) {
        log.info("book publish name is: " + book.getPublishName());
        return ResponseEntity.status(HttpStatus.OK).body(book);
    }

前端请求示例,前端在body体中塞入数据:
在这里插入图片描述
最后日志打印 book publish name is: zhangsan,说明后端成功获取到前端所传入的数据。如果没有@JsonProperty(“publish_name”)注解,那么打印结果为 book publish name is: null,说明后端不识别前端传入的publish_name变量。

@JsonInclude

注解用于指定仅在某些条件下才包含属性。例如,您可以要求仅在属性具有非空值时才包含它。在上面代码的基础上,增加注解@JsonInclude(JsonInclude.Include.NON_NULL),其他代码不动,继续运行测试。

@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Book {
    private String id;
    private String name;
    
    @JsonProperty("publish_name")
    private String publishName;
    @JsonProperty("publish_date")
    private String publishDate;
}

经过Controller层代码的处理,返回Book实体类时受到@JsonInclude(JsonInclude.Include.NON_NULL)的影响,空值不会返回给前端。因此前端收到的数据为:

{
"id": "12",
"name": "World"
}

@JsonIgnore

注解用于在序列化和反序列化过程中忽略某个属性。这在处理敏感数据或不需要序列化的字段时非常有用。
当前端要求返回json格式的数据,后端在转化数据成json格式时,发现实体类属性上贴有@JsonIgnore ,则不转化,且该属性的值不会传递给前端。
继续基于上述的代码做测试,在name属性上加上该注解

    @JsonIgnore
    private String name;

那么返回结果为:

{
"id": "12"
}

@JsonIgnoreProperties

跟上一个注解一样,不过可以一次性标注多个属性不序列化。注解用于在类级别忽略一个或多个属性。这对于在处理来自外部系统的 JSON 数据时忽略未知属性很有用。
继续基于上述的代码做测试,在实体类上加上该注解

@JsonIgnoreProperties({"name", "publish_name", "publish_date"})
public class Book {
// ..
}

返回结果仅剩下一个id属性,其余三个属性不返回。

{
"id": "12"
}

八、其他核心注解

注解说明
@SpringBootApplication= @Configuration + @EnableAutoConfiguration + @ComponentScan
@ComponentScan用来自动扫描被这些注解标识的类,最终生成ioc容器里的bean,默认扫描范围是@ComponentScan注解所在配置类包及子包的类
@SpringBootConfiguration与@Configuration作用相同,都是用来声明当前类是一个配置类,这里表明是springboot主类使用的配置类
@EnableAutoConfiguration是springboot实现自动化配置的核心注解,通过这个注解把spring应用所需的bean注入容器中

@SpringBootApplication

我们经常可以在项目的启动方法中看到该注解

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

后续如果还有其他遗漏的重要注解,会在这里补充。
觉得文章有帮助可以点个赞或者关注支持一下哟~

九、注解快速一览回顾

注解说明
@RequestMapping将Web请求与请求处理类中的方法进行映射,常用配置属性有value和method,分别指代映射的请求URL和HTTP的方法名
@GetMapping用于处理HTTP GET请求,等同于@RequestMapping(method=RequestMethod.GET)
@PostMapping用于处理HTTP POST请求等同于@RequestMapping(method=RequestMethod.POST)
@PutMapping用于处理HTTP PUT请求 等同于@RequestMapping(method=RequestMethod.PUT)
@DeleteMapping用于处理HTTP DELETE请求等同于@RequestMapping(method=RequestMethod.DELETE)
注解说明
@RequestParam用于将方法的参数与Web请求的传递的参数进行绑定
@PathVariable将方法中的参数绑定到请求URI中的模板变量上
@RequestBody在处理请求方法的参数列表中使用,它可以将请求主体中的参数绑定到一个对象中
@ResponseBody自动将控制器中方法的返回值写入到HTTP响应中。一般是将java对象转为json格式的数据,然后直接写入HTTP response 的body中
注解说明
@Autowired它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。不适用于一个接口多个实现类的情形,可以通过配合@Qualifier 解决该问题。
@Qualifier用于配合@Autowired注解来指定要注入的具体 Bean 。使用场景:一般是一个接口有多个实现类,这时需要指定使用哪个实现类,如不指明则spring容器会因为不知道装配哪个而报错。
@Resource既可以根据类型注入,也可以根据名称注入。写了name属性,就根据名称注入,不写就根据类型注入。 写name属性的情况等价于@Autowired+@Qualifier。bean的名称,一般如果我们不手动给,就会使用类名,首字母小写作为bean的名称。
@Controller对应 Spring MVC 控制层,一般标注在Controller层的类上
@RestController继承于 @Controller,标注后整个类所有方法将直接返回 JSON 数据,相当于@Controller + @ResponseBody
@Service对应服务层,主要涉及一些复杂的逻辑
@Repository对应持久层即 Dao 层,主要用于数据库相关操作
@Component普通pojo注入spring容器。通用的注解,可标注任意类为 Spring 组件
@Configuration标注是 Java 代码的配置类
注解说明
@Validated标记在类上,告诉 Spring 去校验方法参数,校验规则可以通过配合以下注解使用
@NotEmpty被注释的字符串的不能为 null 也不能为空
@NotBlank被注释的字符串非 null,并且必须包含一个非空白字符
@Null被注释的元素必须为 null
@NotNull被注释的元素必须不为 null
@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
注解说明
@Value可以在任意 Spring 管理的 Bean 中通过这个注解获取任何来源配置的属性值。用于获取bean的属性,一般用于读取配置文件的数据,作用在变量上
@ConfigurationProperties用于注入Bean属性,然后再通过当前Bean获取注入值,作用在类上 。相对于@Value逐个属性获取,可以通过该注解获取一系列属性值
@ProperySource用来指定读取我们自定义的配置文件
注解说明
@ControllerAdvice定义全局异常处理类
@ExceptionHandler声明异常处理方法,表示遇到这个异常,就执行标注的方法
@ResponseStatus通过在自定义的异常类上使用@ResponseStatus注解来设置HTTP状态
注解说明
@JsonProperty作用在属性上,用于起别名,自定义 JSON 属性名称,以及在序列化和反序列化过程中控制属性的包含。通过使用这个注解,可以确保 JSON 数据与 Java 对象之间正确映射。
@JsonInclude注解用于指定仅在某些条件下才包含属性。例如,您可以要求仅在属性具有非空值时才包含它。
@JsonIgnore注解用于在序列化和反序列化过程中忽略某个属性。这在处理敏感数据或不需要序列化的字段时非常有用。
@JsonIgnoreProperties注解用于在类级别忽略一个或多个属性。这对于在处理来自外部系统的 JSON 数据时忽略未知属性很有用。
注解说明
@SpringBootApplication= @Configuration + @EnableAutoConfiguration + @ComponentScan
@ComponentScan用来自动扫描被这些注解标识的类,最终生成ioc容器里的bean,默认扫描范围是@ComponentScan注解所在配置类包及子包的类
@SpringBootConfiguration与@Configuration作用相同,都是用来声明当前类是一个配置类,这里表明是springboot主类使用的配置类
@EnableAutoConfiguration是springboot实现自动化配置的核心注解,通过这个注解把spring应用所需的bean注入容器中

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2013年认证杯SPSSPRO杯数学建模B题(第一阶段)流行音乐发展简史全过程文档及程序

2013年认证杯SPSSPRO杯数学建模 B题 流行音乐发展简史 原题再现&#xff1a; 随着互联网的发展&#xff0c;流行音乐的主要传播媒介从传统的电台和唱片逐渐过渡到网络下载和网络电台等。网络电台需要根据收听者的已知喜好&#xff0c;自动推荐并播放其它音乐。由于每个人喜好…

武汉星起航:助力跨境电商新手,打造高质量亚马逊产品评价新策略

在今日全球化与数字化浪潮的推动下&#xff0c;跨境电商已成为推动国际贸易发展的新动力。然而&#xff0c;随着市场竞争的日益激烈&#xff0c;如何让自己的产品在亚马逊平台上脱颖而出&#xff0c;成为了众多跨境电商新手面临的重要问题。武汉星起航电子商务有限公司&#xf…

Qt源码调试步骤记录

1.源码&#xff1a; 两种方式&#xff0c;要么安装qt时选择source&#xff0c;要么从官网下载源码&#xff0c;然后在qt creator中设置路径。二选一即可。我选的第二种。 1.1.第一种&#xff0c;安装时选择source&#xff1a; 1.2.第二种&#xff0c;下载源码设置路径&#x…

MySQL数据库(一)

文章目录 1.MySQL8.0安装配置1.安装教程2.启动方法3.启动注意事项4.Navicat使用5.Navicat演示 2.MySQL数据库基本介绍1.三层结构2.SQL语句分类 3.MySQL数据库基本操作1.创建数据库2.不区分大小写的校对规则3.查看、删除数据库4.备份和恢复数据库1.备份数据库db01和db02&#xf…

C++多线程:线程的创建、join、detach、joinable方法(二)

1、线程的开始与结束 程序运行起来&#xff0c;生成一个进程&#xff0c;该进程所持有的主线程开始自动运行&#xff0c;main主线程运行完所有的代码从main函数中返回表示整个进程运行完毕&#xff0c;标志着主线程和进程的死亡&#xff0c;等待操作系统回收资源&#xff0c;因…

简单了解策略模式

什么是策略模式&#xff1f; 策略模式提供生成某一种产品的不同方式 Strategy策略类定义了某个各种算法的公共方法&#xff0c;不同的算法类通过继承Strategy策略类&#xff0c;实现自己的算法 Context的作用是减少客户端和Strategy策略类之间的耦合&#xff0c;客户端只需要…

ubuntu 连接 校园网

​ 认证修改为 Protected EAP(PEAP) CA 证书 勾选 No CA certificate is required 输入用户名和密码 连接成功 ​

【火猫TV】西甲:巴萨中后场大洗牌,两位新人或被放弃!

巴萨本赛季已经来到了最关键的时刻,联赛中他们要想办法缩小与皇马的差距,欧冠联赛则要和大巴黎争夺四强名额。不过球队在转会市场上的操作非常频繁,在转会资金有限的情况下,他们已经准备了多套引援策略,其中对于中后场的打造可能会成为今夏的工作重心。比如后防核心阿劳霍就被多…

二维码门楼牌管理应用平台建设:智能匹配与高效管理

文章目录 前言一、二维码门楼牌管理应用平台的意义二、地址坐标校验的重要性三、对外采数据匹配校验的实现方式四、智能匹配与人工审核的结合五、二维码门楼牌管理应用平台的前景展望 前言 随着城市化进程的加速&#xff0c;门楼牌管理成为城市治理中不可或缺的一环。传统的门…

java电话号码的字母组合(力扣Leetcode17)

电话号码的字母组合 力扣原题链接 问题描述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 示例 1&#xff1a;…

HarmonyOS 应用开发之启动/停止本地PageAbility

启动本地PageAbility PageAbility相关的能力通过featureAbility提供&#xff0c;启动本地Ability通过featureAbility中的startAbility接口实现。 表1 featureAbility接口说明 接口名接口描述startAbility(parameter: StartAbilityParameter)启动Ability。startAbilityForRes…

GPT提示词分享 —— 智能域名生成器

提示词&#x1f447; 我希望你能充当一个聪明的域名生成器。我将告诉你我的公司或想法是什么&#xff0c;你将根据我的提示回复我一份域名备选清单。你只需回复域名列表&#xff0c;而不是其他。域名应该是最多 7-8 个字母&#xff0c;应该简短但独特&#xff0c;可以是朗朗上口…

【物联网项目】基于ESP8266的家庭灯光与火情智能监测系统——文末完整工程资料源码

目录 系统介绍 硬件配置 硬件连接图 系统分析与总体设计 系统硬件设计 ESP8266 WIFI开发板 人体红外传感器模块 光敏电阻传感器模块 火焰传感器模块 可燃气体传感器模块 温湿度传感器模块 OLED显示屏模块 系统软件设计 温湿度检测模块 报警模块 OLED显示模块 …

STM32H743驱动SSD1309(5)

接前一篇文章&#xff1a;STM32H743驱动SSD1309&#xff08;4&#xff09; 三、命令说明 10. 设置BANK0的对比度控制&#xff08;81h&#xff09; 此命令设置显示器的对比度设置。该芯片具有从00h到FFh的256个对比度阶跃。segment输出电流随着对比度阶跃值的增加而增加。 示例…

CMOS逻辑门电路主要技术参数

传输延迟时间 由于电极之间以及电极与衬底之间存在寄生电容&#xff0c;并且输出端通常也存在负载电容。当输入信号跳变时&#xff0c;由于电容的充放电&#xff0c;输出电压的变化必然滞后与输入电压的变化。 门电路传输延迟波形图如下&#xff1a; 通常CMOS逻辑门电路输出端…

哔哩哔哩直播姬有线投屏教程

1 打开哔哩哔哩直播姬客户端并登录(按下图进行操作) 2 用usb连接电脑(若跳出安装驱动的弹窗点击确定或允许),usb的连接方式为仅充电 不要更改usb的连接方式(不然电脑会死机需要重启),此时电脑识别不到该手机设备(因为电脑把它识别为投屏设备) 想要正常连接电脑进行文件传输就按…

日志集中审计系列(4)--- LogAuditor接收IPS设备日志

日志集中审计系列(4)--- LogAuditor接收IPS设备日志 前言拓扑图设备选型组网需求配置思路操作步骤结果验证前言 近期有读者留言:“因华为数通模拟器仅能支持USG6000V的防火墙,无法支持别的安全产品,导致很多网络安全的方案和产品功能无法模拟练习,是否有真机操作的实验或…

Vue3:快速上手路由器

本人在B站上关于vue3的尚硅谷的课程&#xff0c;以下是整理一些笔记。 一.路由器和路由的概念 在 Vue 3 中&#xff0c;路由&#xff08;Router&#xff09;和路由器&#xff08;Router&#xff09;是两个相关但不同的概念。 1. 路由&#xff08;Router&#xff09;&#xff…

Java面试题第二季

一、JUC多线程及高并发 1.谈谈你对volatile的理解 线程安全获得保证 1.volatile是Java虚拟机提供的轻量级的同步机制 保证可见性 不保证原子性 1号和2号线程同时修改各自工作空间中的内容&#xff0c;因为可见性&#xff0c;需要重写入内存&#xff0c;但是1号在写入的时候…

如何保证redis里的数据都是热点数据

MySQL 里有 2000w 数据&#xff0c;Redis 中只存 20w 的数据&#xff0c;如何保证 redis 中的数据都是热点数据&#xff1f; 1.Redis 过期删除策略 1&#xff09;惰性删除:放任键过期不管&#xff0c;但是每次从键空间中获取键时&#xff0c;都检查取得的键是否过期&#xff0c…