Spring Boot基础篇

快速上手

        SpringBoot是由Pivotal团队提高的全新框架,其设计目的是用来简化Spring应用的初始化搭建以及开发过程

入门案例

在Idea创建

        创建时要选择Spring Initializr。

        Server URL为要连接的网站,默认为官网start.spring.io(访问速度慢,可能会经常失败),可以使用阿里云的start/aliyun.com

        name为项目名,Language选择Java,Type选择Maven,JDK版本要与Java版本相对应(java >= JDK),打包方式选择jar包

        Spring Boot为使用的版本,创建后还可以更改,可以直接选择所要加入的依赖。现在创建一个最简单的案例,只需要勾选Spring Web即可

        创建后工程只需要创建一个Controller类,加上注解即可直接运行

@RestController
@RequestMapping("/hero")
public class HeroController {@RequestMapping("/index")public String index(){return "index";}}

在网站创建

        工程除了可以在Idea创建,还可以在网站创建。访问Spring Boot官网https://start.spring.io(访问速度可能会比较慢)或访问阿里云的https://start.aliyun.com

         Java版本可以在高级选项里选择。获取代码后将其解压后即可使用Idea打开

 创建工程后导入

        导入坐标

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.GLATY</groupId><artifactId>StudySpringBoot</artifactId><version>0.0.1-SNAPSHOT</version><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement></project>

        写引导类

        类上要加@SpringBootApplication注解

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

入门案例解析

parent

        开发SpringBoot程序要继承spring-boot-starter-parent

        spring-boot-starter-parent中定义了若干个依赖管理

        继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突

        继承parent的形式也可以采用引入依赖的形式实现效果

        parent是SpringBoot中常见项目名称,定义了当前项目使用的所有依赖坐标,以达到减少依赖配置的目的。也就是配置好版本,可以直接使用

        spring-boot-starter-parent各版本间存在着诸多坐标版本不同,如发生坐标错误,再指定Version(要小心版本冲突)

starter

        使用starter可以实现快速配置的效果,达到简化配置的目的

        starter是所有SpringBoot项目要继承的项目,定义了若干个坐标版本号(依赖管理,而非依赖),以达到减少依赖冲突的目的。也就是在导入坐标时会帮你调用parent中的版本

        使用任意坐标时,仅书写GAV中的G和A,V由SpringBoot提供,除非SpringBoot未提供对应版本V

引导类

        SpringBoot的引导类是Boot工程的执行入口,运行main方法就可以启动项目

        SpringBoot工程运行后初始化Spring容器,扫描引导类所在包加载bean

内嵌Tomcat

        内嵌Tomcat服务器是SpringBoot辅助功能之一

        在Spring中内嵌了Tomcat,其运行原理是将Tomcat服务器作为对象运行,并将该对象交给Spring容器管理。同时也方便更改服务器。

        变更内嵌服务器思想是去除现有服务器,添加全新的服务 器
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><!--排除Tomcat服务器--><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><!--添加Jetty起步依赖,版本由SpringBoot的starter控制--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId></dependency>
</dependencies>

        内置服务器除了tomcat还有jetty和undertow

tomcat:apache出品,应用面广,负载了若干较重的组件

jetty:更轻量级、负载性能远不及tomcat

undertow:undertow,负载性能勉强跑赢tomcat

基础配置

属性配置

        SpringBoot默认配置文件application.properties,通过键值对配置对应属性

修改服务器端口
server.port=80

 关闭运行日志图标(banner) 

spring.main.banner-mode=off

设置日志相关

logging.level.root=debug
        pringBoot内置属性查询,参考  官方文档

SpringBoot中导入对应starter后,提供对应配置属性

书写SpringBoot配置采用关键字+提示形式书写

配置文件分类

        SpringBoot提供了多种属性配置方式

        1.application.properties(传统格式/默认格式):

server.port=80

        2.application.yml(主流格式):

server:
  port: 81

        3.application.yaml:

server:
  port: 82

        配置文件间的加载优先级properties最高,yaml最低。不同配置文件中相同配置按照加载优先级相互覆盖,不同 配置文件中不同配置全部保留

yaml文件

        yaml

        YAML(YAML Ain't Markup Language),一种数据序列化格式
                优点:
                        容易阅读
                        容易与脚本语言交互
                        以数据为核心,重数据轻格式
        YAML文件扩展名
                .yml(主流)
                .yaml

        yaml语法规则

        大小写敏感

        属性层级关系使用多行描述,每行结尾使用冒号结束

        使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)

        属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)

        # 表示注释

        核心规则:数据前面要加空格与冒号隔开

         字面值表示方式

boolean: TRUE                        #TRUE,true,True,FALSE,false,False均可
float: 3.14                          #6.8523015e+5 #支持科学计数法
int: 123                             #0b1010_0111_0100_1010_1110 #支持二进制、八进制、十六进制
null: ~                              #使用~表示null
string: HelloWorld                   #字符串可以直接书写
string2: "Hello World"               #可以使用双引号包裹特殊字符
date: 2018-02-17                     #日期必须使用yyyy-MM-dd格式
datetime: 2018-02-17T15:02:31+08:00  #时间和日期之间使用T连接,最后使用+代表时区

        数组表示方式:在属性名书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔

subject:- Java- 前端- 大数据
enterprise:name: itcastage: 16subject:- Java- 前端- 大数据
# 数组书写缩略格式
likes: [ 永劫无间,植物大战僵尸 ]# 对象数组格式
user1:- name: Tomage: 4- name: Jerryage: 5
# 对象数组格式二
user2:-name: Tomage: 4-name: Jerryage: 5
# 对象数组缩略格式
users: [ { name:Tom , age:4 } , { name:Jerry , age:5 } ]

 yaml数据读取

        使用@Value配合SpEL读取单个数据,属性名引用方式:${一级属性名.二级属性名……}

@Value("${user1.name}")
int name;@Value("${like[1]}")
String like;

        在配置文件中可以使用属性名引用方式引用属性

baseDir: /usr/local/fire
center:dataDir: ${baseDir}/datatmpDir: ${baseDir}/tmplogDir: ${baseDir}/logmsgDir: ${baseDir}/msgDir

        属性值中如果出现转移字符,需要使用双引号包裹

lesson: "Spring\tboot\nlesson"
        将全部数据封装到Environment对象,使用时调用该对象的getProperty()方法
//作用自动装配将所有数据封装到一个对象中
@Autowired
Environment environment;@RequestMapping("/index")
public String index(){System.out.println(environment.getProperty("server.port"));return "index";
}
        自定义对象封装指定数据
@Component  //将对象交给bean管理
@ConfigurationProperties(prefix = "datasource")  //指定加载的数据
public class UseDataSource {private String drive;private String url;private String username;private String password;// ......
}

整合第三方技术

        通用方式:先导入对应的starter,然后根据提供的配置格式配置非默认值对应的配置项

整合JUnit

        1.导入测试对应的starter

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>

        2.测试类使用@SpringBootTest修饰

@SpringBootTest(classes = StudySpringBootApplication.class)
class StudySpringBootApplicationTests {@Testvoid contextLoads() {}}

*创建项目时就将junit到入的话测试类会自动创建好

*如果测试类在SpringBoot启动类的包或子包中,可以省略启动类的设置,也就是省略classes的设定

整合MyBatis

        1.导坐标(如果在创建工程的时候勾选后SpringBoot会将坐标自动导入)

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>

        2.配置application文件

spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/secondtable?serverTimezone=UTCusername: rootpassword: 123456

        3.在mapper接口上加上@Mapper注解

@Mapper
public interface HeroMapper {public Hero selectById(@Param("id") Integer id);}

整合MyBatis-Plus

        MyBatis-Plus简称mp,在中国人自己制造的技术。

        MyBatis-Plus与MyBatis的区别:导入坐标不同、数据层实现简化

        SpringBoot中未收录MyBatis-Plus的坐标版本,需要指定对应的Version

        1.导入坐标

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>

       2. 定义数据层接口与映射配置,继承BaseMapper(源码注释是汉语)

@Mapper
public interface HeroMapper extends BaseMapper<Hero> {}

        其他同SpringBoot整合MyBatis

        MyBatis-Plus相关配置可以在application设置

#设置MyBatis-Plus相关配置
mybatis-plus:global-config:db-config:table-prefix: 

整合Druid

        导入坐标

<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.6</version>
</dependency>

        配置application文件

#数据源通用配法
#spring:
#  datasource:
#    driver-class-name: com.mysql.cj.jdbc.Driver
#    url: jdbc:mysql://localhost:3306/secondtable?serverTimezone=UTC
#    username: root
#    password: 123456
#    type: com.alibaba.druid.pool.DruidDataSource#专用配发,建议使用
spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/secondtable?serverTimezone=UTCusername: rootpassword: 123456

SSMP整合

实体类快速开发(lombok)

        使用lombok可以快速开发实体类

        导入lombok坐标(lombok版本由SpringBoot提供,无需指定版本)

<!--lombok坐标,用于快速创建实体类-->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>

        创建实体类,加注解

@Data  //@Data注解为实体类在编译时期设置对应的get方法,set方法,toString方法,hashCode方法,equals方法等
@AllArgsConstructor
@NoArgsConstructor
public class Hero {private String name;private Integer id;private String codeName;private Integer ability;
}

数据层标准开发(基于CRUD)

搭建环境

        导入MyBatisPlus与Druid对应的starter

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.6</version>
</dependency>

        配置数据源与MyBatisPlus对应的基础配置(id生成策略使用数据库自增策略)

spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/secondtable?serverTimezone=UTCusername: rootpassword: 123456mybatis-plus:global-config:db-config:id-type: auto

        mapper接口继承BaseMapper并指定泛型

@Mapper
public interface HeroMapper extends BaseMapper<Hero> {}

*开启MP日志

mybatis-plus:global-config:db-config:id-type: autoconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

分页查询

        分页操作是在MyBatisPlus的常规操作基础上增强得到,内部是动态的拼写SQL语句,因此需要增强对应的功能,使用MyBatisPlus拦截器实现

        创建类编辑连接器

@Configuration
public class MPConfig {@Beanpublic MybatisPlusInterceptor mpInterceptor() {//1.定义Mp拦截器MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();//2.添加具体的拦截器mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());return mpInterceptor;}
}

        测试分页

@Test
void Testpage() {IPage page = new Page(1, 5);heroMapper.selectPage(page, null);System.out.println(page.getRecords());page.setCurrent(2);heroMapper.selectPage(page, null);System.out.println(page.getRecords());
}

条件查询

        使用QueryWrapper对象封装查询条件,推荐使用LambdaQueryWrapper对象,所有查询操作封装成方法调用

@Test
void Test2() {String name = "天";QueryWrapper<Hero> queryWrapper = new QueryWrapper<>();queryWrapper.like(name != null,"name", name);System.out.println(heroMapper.selectList(queryWrapper));
}
@Test
void Test3() {String name = "天";LambdaQueryWrapper<Hero> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.like(name != null,Hero::getName, name);System.out.println(heroMapper.selectList(queryWrapper));
}

业务层标准开发

基础CRUD

        Service层接口定义与数据层接口定义具有较大区别,不要混用

        定义接口

public interface HeroService {public boolean save(Hero hero);public boolean update(Hero hero);public boolean deleteById(Integer id);public Hero searchById(Integer id);public List<Hero> searchAllHero();public IPage<Hero> searchByPage(int currentPage, int pageSide);
}

        实现类定义

import java.util.List;@Service
public class HeroServiceImpl implements HeroService {@Autowiredprivate HeroMapper mapper;@Overridepublic boolean save(Hero hero) {return mapper.insert(hero) > 0;}@Overridepublic boolean update(Hero hero) {return mapper.updateById(hero) > 0;}@Overridepublic boolean deleteById(Integer id) {return mapper.deleteById(id) > 0;}@Overridepublic Hero searchById(Integer id) {return mapper.selectById(id);}@Overridepublic List<Hero> searchAllHero() {return mapper.selectList(null);}@Overridepublic IPage<Hero> searchByPage(int currentPage, int pageSide) {return mapper.selectPage(new Page<>(currentPage, pageSide), null);}}

基于MyBatisPuls构建

        使用MyBatisPlus提供有业务层通用接口(ISerivce<T>)与业务层通用实现类(ServiceImpl<M,T>)

        在通用类基础上做功能重载或功能追加

        注意重载时不要覆盖原始操作,避免原始提供的功能丢失

        定义接口

public interface IHeroService extends IService<Hero> {}

        定义实现类

public class HeroServiceImplMp extends ServiceImpl<HeroMapper, Hero> implements IHeroService {}

表现层标准开发

表现层接口开发

@RestController
@RequestMapping("/hero")
public class HeroController {@AutowiredHeroServiceImpl heroServiceImpl;@GetMapping("/{id}")public Hero getById(@PathVariable Integer id) {return heroServiceImpl.searchById(id);}@GetMapping("/")public List<Hero> getAllHero() {return heroServiceImpl.searchAllHero();}@PostMapping("/")public void saveHero(@RequestBody Hero hero) {heroServiceImpl.save(hero);}@DeleteMapping("/{id}")public void deleteById(@PathVariable Integer id) {heroServiceImpl.deleteById(id);}@PutMapping("/")public void update(@RequestBody Hero hero) {heroServiceImpl.update(hero);}@GetMapping("/{currentPage}/{pageSide}")public List<Hero> searchByPage(@PathVariable Integer currentPage,@PathVariable Integer pageSide) {return heroServiceImpl.searchByPage(currentPage, pageSide).getRecords();}
}

消息一致性处理

        设计表现层返回结果的模型类,用于后端与前端进行数据格式统一,也称为前后端数据协议。表现层接口统一返回值类型结果

@Data
@Component
public class Res {private int code;//类似于状态码private Object data;//储存前端所需要的数据private String msg;//信息说明public Res() {}public Res(int code, Object data, String msg) {this.code = code;this.data = data;this.msg = msg;}
}

异常消息处理

        如果服务器出现异常,返回给前端的数据将时默认的,需要添加异常处理器来处理异常。

//作为SpringMVC的异常处理器
//@ControllerAdvice
@RestControllerAdvice
public class ProjectExceptionAdvice {@ExceptionHandlerpublic Res doException1(Exception e) {// 记录日志// 通知运维// 通知开发e.printStackTrace();return new Res(500, null, "error");}// 还可以处理指定异常类型@ExceptionHandler(Exception.class)public Res doException2(Exception e) {// 记录日志// 通知运维// 通知开发e.printStackTrace();return new Res(500, null, "error");}
}

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

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

相关文章

【教程】新的Selenium!整合了隐藏浏览器指纹等功能

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 前景提要 driver Driver() 常用driver 接口 最后的话 前景提要 新的selenium&#xff0c;整合了隐藏浏览器指纹&#xff0c;非常好用&#x…

树状数组求三元上升子序列

分析一下&#xff0c;感觉没什么思路&#xff0c;再想一下&#xff0c;结果不就是每一位的数小于它的数乘以大于大于这位数的相乘之和吗&#xff0c;我们可以利用逆序对的思维求得 关键点在于求解逆序对的时候值相同的时候&#xff0c;位置大的优先级更高处理 #define _CRT_SEC…

大型能源电力集团需要什么样的总部数据下发系统?

能源电力集团的组织结构是一个复杂的系统&#xff0c;包括多个职能部门和子分公司。这些子分公司负责具体的电力生产、销售、运维等业务。这些部门和公司协同工作&#xff0c;确保电力生产的顺利进行&#xff0c;同时关注公司的长期发展、市场拓展、人力资源管理、财务管理和公…

算法 —— 滑动窗口

目录 长度最小的子数组 无重复字符的最长子串 最大连续1的个数 将x减到0的最小操作数 找到字符串中所有字母异位词 最小覆盖子串 长度最小的子数组 sum比target小就进窗口&#xff0c;sum比target大就出窗口&#xff0c;由于数组是正数&#xff0c;所以相加会使sum变大&…

数据结构基础--------【二叉树基础】

二叉树基础 二叉树是一种常见的数据结构&#xff0c;由节点组成&#xff0c;每个节点最多有两个子节点&#xff0c;左子节点和右子节点。二叉树可以用来表示许多实际问题&#xff0c;如计算机程序中的表达式、组织结构等。以下是一些二叉树的概念&#xff1a; 二叉树的深度&a…

Ubuntu 20.04下多版本CUDA的安装与切换 超详细教程

目录 前言一、安装 CUDA1.找到所需版本对应命令2.下载 .run 文件3.安装 CUDA4.配置环境变量4.1 写入环境变量4.2 软连接 5.验证安装 二、安装 cudnn1.下载 cudnn2.解压文件3.替换文件4.验证安装 三、切换 CUDA 版本1.切换版本2.检查版本 前言 当我们复现代码时&#xff0c;总会…

计算机如何存储浮点数

浮点数组成 在计算机中浮点数通常由三部分组成&#xff1a;符号位、指数位、尾数位。IEEE-754中32位浮点数如下&#xff1a; 上图32bit浮点数包含1bit的符号位&#xff0c;8比特的指数位和23bit的尾数位。对于一个常规浮点数&#xff0c;我们来看看它是如何存储和计算的。这里…

数据库系统原理 | 查询作业2

整理自博主本科《数据库系统原理》专业课自己完成的实验课查询作业&#xff0c;以便各位学习数据库系统概论的小伙伴们参考、学习。 *文中若存在书写不合理的地方&#xff0c;欢迎各位斧正。 专业课本&#xff1a; ​ ​ ———— 本次实验使用到的图形化工具&#xff1a;Heidi…

CTF常用sql注入(一)联合注入和宽字节

0x01 前言 给自己总结一下sql注入的常用姿势吧&#xff0c;记录一下学习 0x02 联合 联合注入的关键词是union SQL的union联合注入原理是联合两个表进行注入攻击&#xff0c;使用union select关键词来进行联合查询。 那么为什么我们在题目中一般是只写一个呢 因为 $sql &quo…

SwiftData 模型对象的多个实例在 SwiftUI 中不能及时同步的解决

概览 我们已经知道,用 CoreData 在背后默默支持的 SwiftUI 视图在使用 @FetchRequest 来查询托管对象集合时,若查询结果中的托管对象在别处被改变将不会在 FetchedResults 中得到及时的刷新。 那么这一“囧境”在 SwiftData 里是否也会“卷土重来”呢?空说无益,就让我们在…

redis 如何使用 scan, go语言

建议用方案乙 文章目录 场景方案方案甲方案乙 拓展 场景 redis 中存在大量 key。 其中有一部分是用户登陆的 session_id&#xff0c; 结构是 &#xff1a; session_id:1session_id:2session_id:3需求&#xff1a; 有多少用户在线 方案 方案甲 keys session_id:*这种方式简…

FlinkSQL 开发经验分享

作者&#xff1a;汤包 最近做了几个实时数据开发需求&#xff0c;也不可避免地在使用 Flink 的过程中遇到了一些问题&#xff0c;比如数据倾斜导致的反压、interval join、开窗导致的水位线失效等问题&#xff0c;通过思考并解决这些问题&#xff0c;加深了我对 Flink 原理与机…

华为云简介

前言 华为云是华为的云服务品牌&#xff0c;将华为30多年在ICT领域的技术积累和产品解决方案开放给客户&#xff0c;致力于提供稳定可靠、安全可信、可持续创新的云服务&#xff0c;赋能应用、使能数据、做智能世界的“黑土地”&#xff0c;推进实现“用得起、用得好、用得放心…

鸿蒙应用笔记

安装就跳过了&#xff0c;一直点点就可以了 配置跳过&#xff0c;就自动下了点东西。 鸿蒙那个下载要12g个内存&#xff0c;大的有点吓人。 里面跟idea没区别 模拟器或者真机运行 真机要鸿蒙4.0&#xff0c;就可以实机调试 直接在手机里面跑&#xff0c;这个牛逼&#xf…

深度学习与CV入门

文章目录 前言历史 前言 历史 tensorflow可以安装Tensorboard第三方库用于展示效果 TensorFlow工作流程&#xff1a;p6-4:20 使用tf.data加载数据。使用tf.data实例化读取训练数据和测试数据模型的建立与调试:使用动态图模式Eager Execution和著名的神经网络高层API框架Ker…

[笔记] 卷积 - 02 滤波器在时域的等效形式

1.讨论 这里主要对时域和频域的卷积运算的特征做了讨论&#xff0c;特别是狄拉克函数的物理意义。 关于狄拉克函数&#xff0c;参考这个帖子&#xff1a;https://zhuanlan.zhihu.com/p/345809392 1.狄拉克函数提到的好函数的基本特征是能够快速衰减&#xff0c;对吧&#xf…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【17】认证服务01—短信/邮件/异常/MD5

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【17】认证服务01 环境搭建验证码倒计时短信服务邮件服务验证码短信形式&#xff1a;邮件形式&#xff1a; 异常机制MD5参考 环境搭建 C:\Windows\System32\drivers\etc\hosts 192.168.…

HackTheBox----Editorial

Editorial 测试过程 1 信息收集 NMAP端口扫描 nmap -sC -sV 10.10.11.20服务器开启了 22、80 端口 80 端口测试 服务器只开启了 22 和 80 端口&#xff0c;先从 80 端口开始进行测试 echo "10.10.11.20 editorial.htb" | sudo tee -a /etc/hostspublish with us…

Scrapy框架的基本使用教程

1、创建scrapy项目 首先在自己的跟目录文件下执行命令&#xff1a; PS D:\BCprogram\python_pro\bigdata> scrapy startproject theridion_grallatorscrapy startproject 项目名 具体执行操作如下&#xff1a;1、创建项目目录&#xff1a;Scrapy会在当前工作目录下创建一…

001,函数指针是一种特殊的指针,它指向的是一个函数地址,可以存储函数并作为参数传递,也可以用于动态绑定和回调函数

函数指针是一种特殊的指针 001&#xff0c;函数指针是一种特殊的指针&#xff0c;它指向的是一个函数地址&#xff0c;可以存储函数并作为参数传递&#xff0c;也可以用于动态绑定和回调函数 文章目录 函数指针是一种特殊的指针前言总结 前言 这是ai回答的标准答案 下面我们…