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

Spring Boot 2.x基础教程

Spring Boot 2.x基础教程

  • 一、简介
    • 1. Spring Boot 2.x 简介
    • 2. Spring Boot 2.x 特点
    • 3. Spring Boot 2.x 与 Spring Framework 的关系
  • 二、Spring Boot 2.x 环境搭建
    • 1. JDK环境安装与配置
    • 2. Maven环境安装与配置
    • 3. Spring Boot 2.x 项目创建
  • 三、核心功能
    • 1. 配置文件及其加载顺序
      • a. YAML 文件格式
      • b. 属性配置文件( .properties )
    • 2. 日志管理
      • a. Spring Boot 日志框架选用
      • b. 自定义日志
    • 3. Spring Boot 2 热部署实现
      • a. devtools的引入
      • b. 使用方法与注意事项
    • 4. Spring Boot 2.x 中的 AOP
      • a. 切面的定义和使用
  • 四、数据访问
    • 1. Spring Boot 2.x 与 JPA
      • a. JPA简介
      • b. Spring Boot 2.x 使用JPA基本配置
    • 2. Spring Boot 2.x 与 MyBatis
      • a. MyBatis 简介
      • b. Spring Boot 2.x 整合 MyBatis
    • 3. Spring Boot 2.x 与 Druid 数据源
      • a. Druid 简介
      • b. Spring Boot 2.x 整合 Druid
  • 五、Spring Boot 2.x 与 Web
    • 1. Spring Boot 2.x Web 封装
      • a. Spring Boot 自带web应用服务器
      • b. 四种常见的响应方式
        • 1. 返回 Model 层数据
        • 2. 直接返回字符串
        • 3. 返回 JSON 数据
        • 4. 返回 HTTP 状态码
    • 2. Spring Boot 2.x 与 JSP
      • a. JSP 简介
      • b. Spring Boot 2.x使用JSP
    • 3. Spring Boot 2.x 静态资源处理
      • a. 静态资源访问
  • 六、Spring Boot 2.x 高级特性
    • 1. Spring Boot 2.x Actuator 扩展
      • a. actuator 的作用
      • b. actuator 的使用方法
    • 2. Spring Boot 2.x 多环境配置
      • a. 执行环境分类
      • b. 配置文件的优先级
    • 3. Spring Boot 2.x 集成 Quartz
      • a. Quartz 的简介
      • b. Spring Boot 2.x 集成 Quartz

一、简介

1. Spring Boot 2.x 简介

Spring Boot是一个基于Spring框架的快速Web开发框架,采用约定大于配置的方式进行构建。简化了Spring应用程序的开发过程,并持续推出新的版本以满足当下开发的需要。

2. Spring Boot 2.x 特点

  • 简化Spring应用程序开发流程
  • 自动配置Spring应用程序
  • 内嵌Servlet容器,无需部署war包
  • 提供管理端点,便于监控应用程序运行状况
  • 支持各类组件的集成,如ORM、模板引擎等

3. Spring Boot 2.x 与 Spring Framework 的关系

Spring Boot是构建在Spring Framework之上的框架。其中,Spring Framework提供了基础的IoC、AOP、事件、数据访问、Web框架和测试等支持;而Spring Boot则对Spring Framework进行了封装,进一步简化了Spring应用程序的构建。

二、Spring Boot 2.x 环境搭建

1. JDK环境安装与配置

首先,需要安装Java Development Kit(JDK)。可以通过Oracle官网下载并安装最新版的JDK,然后在环境变量中配置JDK的安装路径。

     <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.5.0</version></dependency>

2. Maven环境安装与配置

接下来,需要安装Maven。可以通过Apache官网下载并安装最新版的Maven,然后在环境变量中配置Maven的安装路径。

3. Spring Boot 2.x 项目创建

最后可以使用Spring Initializr创建Spring Boot项目。在Spring Initializr的官网(https://start.spring.io/)中,选择需要的项目配置和依赖项,然后点“生成”即可。生成的项目包含了基础的Spring Boot配置和依赖项,可以直接用于开发。

三、核心功能

1. 配置文件及其加载顺序

a. YAML 文件格式

# YAML配置文件示例
server:port: 8080
spring:datasource:url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword: test

注释:通过YAML文件配置serverspring的相关属性,其中datasource为数据库连接属性配置。

b. 属性配置文件( .properties )

# .properties配置文件示例
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=test

注释:通过.properties配置文件配置serverspring的相关属性,其中datasource为数据库连接属性配置。

2. 日志管理

a. Spring Boot 日志框架选用

Spring Boot默认采用logback进行日志输出,你也可以切换为其他日志框架,比如Log4j2或者JUL等。

b. 自定义日志

使用Slf4j来封装日志内容,并搭配对应的日志框架进行输出。

// 引入Slf4j
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;@Service
@Slf4j
public class UserService {public void login(String username, String password) {log.info("用户{}正在登录...", username);// do something}
}

注释:使用@Slf4j注解引入Slf4j日志封装,在需要输出日志的地方使用log.info等方法进行输出。

3. Spring Boot 2 热部署实现

a. devtools的引入

使用devtools可以实现Spring Boot项目的热部署功能,可以在开发阶段提高调试效率。

<!-- 引入devtools依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional>
</dependency>

注释:通过Maven引入devtools依赖。

b. 使用方法与注意事项

在配置文件中加入如下属性:

# 配置热部署属性
spring.devtools.restart.enabled=true
spring.devtools.restart.exclude=static/**,public/**

注意事项:在使用时,需要手动编译一次代码才能生效。

4. Spring Boot 2.x 中的 AOP

a. 切面的定义和使用

使用@Aspect注解定义切面类,使用@Before@After@Around等注解来定义不同类型的通知,并通过@Pointcut注解定义切点。如下:

// 定义切面类
@Aspect
@Service
@Slf4j
public class LogAspect {// 定义切点@Pointcut("execution(* com.example.demo.service..*.*(..))")public void point() {}// 定义前置通知@Before("point()")public void before() {log.info("before aspect.");}// 定义后置通知@After("point()")public void after() {log.info("after aspect.");}// 定义环绕通知@Around("point()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {log.info("before around aspect.");Object obj = joinPoint.proceed();log.info("after around aspect.");return obj;}
}

使用切面:

@Service
@Slf4j
public class UserService {@Autowiredprivate UserDao userDao;// 使用切面@LogAspectpublic void login(String username, String password) {log.info("用户{}正在登录...", username);// do something}
}

注释:使用@Aspect注解定义切面类,通过@Pointcut注解定义切点,使用@Before@After@Around等注解来定义不同类型的通知,在需要使用切面的方法上加上自定义的注解即可。

四、数据访问

1. Spring Boot 2.x 与 JPA

a. JPA简介

JPA是 Java Persistence API 的缩写,是一套ORM规范,为开发者提供了一个简单优雅的方式来管理Java应用中的关系型数据。

b. Spring Boot 2.x 使用JPA基本配置

在Spring Boot项目中使用JPA,需要添加以下依赖:

<!-- 引入JPA相关依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

同时在配置文件中进行数据库配置:

# jpa 数据库配置
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=test
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

注释:通过Maven引入spring-boot-starter-data-jpa依赖,并在配置文件中进行数据库配置。

2. Spring Boot 2.x 与 MyBatis

a. MyBatis 简介

MyBatis是一种持久层ORM框架,它对JDBC的操作数据库的过程进行封装,提供了更加简单、易读、易维护的方式。

b. Spring Boot 2.x 整合 MyBatis

在Spring Boot项目中整合MyBatis,需要添加以下依赖:

<!-- 引入Mybatis相关依赖 -->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.3</version>
</dependency>

同时在配置文件中进行数据库配置:

# MyBatis及数据库配置
# MyBatis的mapper文件的路径 
mybatis.mapper-locations=classpath:mapper/*.xml
# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=test

注释:通过Maven引入mybatis-spring-boot-starter依赖,并在配置文件中进行数据库配置。

3. Spring Boot 2.x 与 Druid 数据源

a. Druid 简介

Druid 是阿里开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 DB 连接池的优点,同时加入了日志监控。

b. Spring Boot 2.x 整合 Druid

在Spring Boot项目中整合Druid,需要添加以下依赖:

<!-- 引入Druid相关依赖 -->
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.5</version>
</dependency>

同时在配置文件中进行数据库配置:

# druid 数据库配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=test# druid 配置
spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.initial-size=1
spring.datasource.druid.min-idle=1
spring.datasource.druid.max-active=20
spring.datasource.druid.max-wait=60000
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.validation-query=SELECT 1 FROM DUAL
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.filters=stat,wall

注释:通过Maven引入druid-spring-boot-starter依赖,并在配置文件中进行数据库配置。

五、Spring Boot 2.x 与 Web

1. Spring Boot 2.x Web 封装

a. Spring Boot 自带web应用服务器

Spring Boot 默认会使用嵌入式 Tomcat 作为Web 应用服务器,而无需外部部署。当然,你也可以使用 Jetty 或 Undertow 作为替代品。

b. 四种常见的响应方式

在Spring Boot中通常会有以下4种常见的响应方式:

1. 返回 Model 层数据

@GetMapping("/model")
public String model(Model model) {model.addAttribute("name", "John");return "hello";
}

上面代码中,我们将Model对象中的属性"name"设置为"John",然后返回一个名为"hello"的模板。Spring Boot 会自动根据模板渲染出相应的HTML。

2. 直接返回字符串

@GetMapping("/response")
@ResponseBody
public String response() {return "Hello World!";
}

上面代码中,我们直接返回一个字符串"Hello World!",Spring Boot 会将其转化为HTTP Response输出到客户端。

3. 返回 JSON 数据

@GetMapping("/json")
@ResponseBody
public Map<String, Object> json() {Map<String, Object> map = new HashMap<>();map.put("name", "John");map.put("age", 30);map.put("gender", "Male");return map;
}

上面代码中,我们返回一个Map类型的JSON数据,其中包含三个属性:name、age 和 gender。

4. 返回 HTTP 状态码

@GetMapping("/status")
public ResponseEntity<String> status() {return new ResponseEntity<>("Hello World!", HttpStatus.OK);
}

上面代码中,我们返回一个HTTP OK状态并携带"Hello World!"的字符串。

2. Spring Boot 2.x 与 JSP

a. JSP 简介

JSP(Java Server Pages)是一种在HTML(或XML)文档中嵌入Java代码的技术。它是Servlet API之上的一种封装,可用于开发动态Web页面。
JSP 允许您在 HTML 页面中嵌入 Java 代码,这样您就能够在页面显示动态内容。

b. Spring Boot 2.x使用JSP

首先在工程的pom.xml里添加对jsp 支持及Tomcat Embed Jasper 的依赖:

<dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId><scope>provided</scope>
</dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId>
</dependency>

在application.properties里添加以下配置:

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

创建 JSP 文件(/src/main/webapp/WEB-INF/jsp/hello.jsp):

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Hello JSP</title>
</head>
<body><h1>Hello, <%= request.getAttribute("name") %>!</h1>
</body>
</html>

添加Controller代码:

@Controller
public class HelloController {@RequestMapping("/hello")public String hello(Model model) {model.addAttribute("name", "John");return "hello";}}

访问 http://localhost:8080/hello 就可以了。

3. Spring Boot 2.x 静态资源处理

a. 静态资源访问

Spring Boot 2.x默认会在如下路径中查找静态资源:

classpath:/META-INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public/

例如,你可以在src/main/resources/static/目录下创建一个名为logo.png的图片文件,并通过URL http://localhost:8080/logo.png访问它。

六、Spring Boot 2.x 高级特性

1. Spring Boot 2.x Actuator 扩展

a. actuator 的作用

Actuator 用于监控和管理 Spring Boot 应用程序,它提供了很多用于检查应用程序运行状况的功能,包括应用程序健康状况、指标收集和暴露、日志配置等功能。

b. actuator 的使用方法

  1. 在pom.xml中引入 actuator的依赖:

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
  2. 在application.properties文件中开启或关闭 Actuator 功能:

    management.endpoint.health.show-details=always
    

    以上示例表示开启健康状况检查功能,并显示详细信息。

  3. 访问以下 URL 查看 Actuator 的功能列表:

    http://localhost:8080/actuator
    

2. Spring Boot 2.x 多环境配置

a. 执行环境分类

Spring Boot 环境定义有以下 4 种:

  • development
  • testing
  • staging
  • production

b. 配置文件的优先级

Spring Boot 支持多个 profile 的配置文件,文件名必须以 application-{profile}.properties 命名,其中 profile 可以是上述环境分类之一。

当存在多个 profile 时,配置文件的优先级由高到低如下:

  1. application-{profile}.yml
  2. application-{profile}.properties
  3. application.yml
  4. application.properties

3. Spring Boot 2.x 集成 Quartz

a. Quartz 的简介

Quartz 是一个功能强大的作业调度框架,可用于创建简单或复杂的定时任务,支持集群和分布式部署。

b. Spring Boot 2.x 集成 Quartz

  1. 在pom.xml中引入 quartz 和 quartz-jobs 的依赖:

    <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.1</version>
    </dependency>
    <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz-jobs</artifactId><version>2.3.1</version>
    </dependency>
    
  2. 在application.properties文件中配置 Quartz:

    # Quartz 配置
    spring.quartz.job-store-type=jdbc
    spring.quartz.jdbc.initialize-schema=always
    spring.quartz.properties.org.quartz.threadPool.threadCount=10
    
  3. 创建 Job 类:

    @Component
    public class MyJob implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {// 需要执行的任务逻辑}}
    
  4. 创建 JobDetail 和 Trigger,并将它们注册到 Scheduler 中:

    @Configuration
    public class QuartzConfig {@Autowiredprivate MyJob myJob;@Beanpublic JobDetail jobDetail() {return JobBuilder.newJob(myJob.getClass()).withIdentity("myJob").storeDurably().build();}@Beanpublic Trigger trigger(JobDetail job) {return TriggerBuilder.newTrigger().forJob(job).withIdentity("myJobTrigger").withSchedule(CronScheduleBuilder.cronSchedule("0 0 12 * * ?")).build();}@Beanpublic Scheduler scheduler(Trigger trigger, JobDetail job, DataSource dataSource) throws SchedulerException {SchedulerFactory schedulerFactory = new StdSchedulerFactory();Scheduler scheduler = schedulerFactory.getScheduler();scheduler.setDataSource(dataSource);scheduler.scheduleJob(job, trigger);return scheduler;}}
    

相关文章:

Spring Boot 2.x基础教程

Spring Boot 2.x基础教程 一、简介1. Spring Boot 2.x 简介2. Spring Boot 2.x 特点3. Spring Boot 2.x 与 Spring Framework 的关系 二、Spring Boot 2.x 环境搭建1. JDK环境安装与配置2. Maven环境安装与配置3. Spring Boot 2.x 项目创建 三、核心功能1. 配置文件及其加载顺序…...

汽车红外夜视系统行业发展总体概况

汽车红外夜视系统是一种技术&#xff0c;旨在帮助驾驶员在夜间或低光条件下提供更好的视觉能力。它利用红外光谱的特性来检测和显示在正常光线下难以察觉的热能辐射。这使驾驶员能够在夜间或恶劣天气条件下更好地识别和辨别道路上的物体、行人、动物或其他车辆。 汽车红外夜视…...

Java 和 PHP GC 的差异和差异出现的原因

JAVA 的 GC 处理 判断草死掉的两种方式&#xff1a;引用计数和可达性分析 可达性分析对 JAVA 比较好用的原因是 JAVA遵守这面向对象的严格要求&#xff0c;每个变量都被对象包裹&#xff0c;所以每个变量都能通过对象来进行遍历找到&#xff0c;最终判断他们的是否被引用&…...

loguru logger使用

一、基本使用 ①标准使用 from loguru import logger# 在标准输出里面输出一行debug日志 logger.debug("Thats dubug")②设置输出格式 from loguru import loggerlogger.remove(0) # 先删除格式 logger.add(sink./logger.log, format"{time: %Y-%m-%d %H:%M…...

vue-自适应布局-postcss-pxtorem

原理&#xff1a; 比如一个375px设计稿 其中一个320px宽度的元素 如何实现自适应布局呢&#xff1f; 其实可以这样理解&#xff1a; 我们先计算出375屏幕时候320px的大小&#xff0c;在屏幕变化时候&#xff0c;这些元素都会等比例缩放 比如屏幕从375 变为750px时候&#xff0…...

9.12|day 5|day 44 |完全背包| 518. 零钱兑换 II | 377. 组合总和 Ⅳ

● 完全背包 主要是看清01背包和完全背包的区别 //01背包 for(int i 0;i<weight.size();i){ for(int j bagWeight;j>weight[i];j--){dp[j] Math.max(dp[j],dp[j-weight[i]]value[i]); } } //完全背包 for(int i 0;i<weight.size();i){for(int j weight[i];j<…...

C++ 中的原子变量(std::atomic)使用指南

目录 C 中的原子变量&#xff08;std::atomic&#xff09;使用指南基本概念使用方法创建原子变量读取值修改值原子操作 常见应用场景1. 计数器2. 控制标志3. 链表和数据结构 示例代码结论 C 中的原子变量&#xff08;std::atomic&#xff09;使用指南 原子变量&#xff08;std…...

【用unity实现100个游戏之9】使用Unity制作类八方旅人、饥荒风格的俯视角2.5D游戏

前言 2.5D游戏 是一种介于二维和三维之间的游戏形式。它通常在二维平面上展示游戏内容&#xff0c;但利用三维技术来实现更加逼真的图像效果。 在2.5D游戏中&#xff0c;角色和环境通常是以平面的形式呈现&#xff0c;但可以在垂直方向上移动。这意味着玩家可以在一个相对较薄…...

如何在群晖中,正确配置 docker 的 ipv6 地址

参考 2023年9月12日 https://synocommunity.com/ https://github.com/wangliangliang2/fix_synology_docker_ipv6 https://post.smzdm.com/p/an3np8m7/ 正文 关于这个话题&#xff0c;国内搜索引擎得到的结果出奇的一致&#xff0c;且过时。 &#xff08;看的我脑壳痛&#…...

XSS入门 XSS Challenges

level1(直接注入) <script>alert(xss)</script>level2(双引号闭合标签) 测试 <sCr<ScRiPt>IPT>OonN"\/(hrHRefEF)</sCr</ScRiPt>IPT>发现<>"被转换&#xff0c;构造新的语句 "><script>alert(/xss/)</…...

李沐《动手学深度学习》torch.cat() 和 torch.stack()的区别及思考

一、问题引出 好久没更新啦&#xff01;最近在学习沐神《动手学深度学习》6.5节池化层的时候&#xff0c;发现沐神在两处相似的地方使用了两种Python拼接函数torch.cat()和torch.stack()&#xff1a; 百思不得其解&#xff0c;于是查阅相关文档之后终于弄清楚了两者之间的区别…...

【算法与数据结构】235、LeetCode二叉搜索树的最近公共祖先

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题和这道题类似【算法与数据结构】236、LeetCode二叉树的最近公共祖先&#xff0c;相同的算法也能解…...

bboss 流批一体化框架 与 数据采集 ETL

数据采集 ETL 与 流批一体化框架 特性&#xff1a; 高效、稳定、快速、安全 bboss 是一个基于开源协议 Apache License 发布的开源项目&#xff0c;主要由以下三部分构成&#xff1a; Elasticsearch Highlevel Java Restclient &#xff0c; 一个高性能高兼容性的Elasticsea…...

JVM详细教程

JVM 前言 还在完善中先发布 JVM虚拟机厂家多钟多样&#xff0c;具体实现细节可能不一样&#xff0c;这里主要讲的是虚拟机的规范&#xff0c;以下内容融合了各个平台发布的内容和周志明老师的《深入理解java虚拟机》 JVM概述 如何理解jvm跨平台&#xff1f; 编译成汇编代码…...

Smartbi吴华夫:后疫情时代,BI发展趋势的观察与应对

沿着旧地图找不到新大陆&#xff0c;“基于指标体系的可视化分析和增强分析”成为BI发展新阶段。Smartbi V11系列新品与时俱进&#xff0c;以指标为核心&#xff0c;同时融合BI应用&#xff0c;赋能管理者和业务&#xff0c;成为引领数字化运营的新航标&#xff01; ——思迈特…...

软件设计模式系列之三———工厂方法模式

1 模式的定义 工厂方法模式是一种常见的设计模式&#xff0c;属于创建型设计模式之一&#xff0c;它在软件工程中用于对象的创建。该模式的主要思想是将对象的创建过程抽象化&#xff0c;将具体对象的实例化延迟到子类中完成&#xff0c;以便在不同情况下可以创建不同类型的对…...

pytorch 多卡分布式训练 调用all_gather_object 出现阻塞等待死锁的问题

pytorch 多卡分布式训练 torch._C._distributed_c10d中的函数all_gather_object 出现阻塞等待死锁的问题 解决办法就是 在进程通信之前调用torch.cuda.set_device(local_rank) For NCCL-based processed groups, internal tensor representations of objects must be moved …...

SpringMvc增删改查

SpringMvc增删改查 一、前期准备二、逆向生成增删改查2.2.aspect切面层2.3.Mybatis generator逆向生成2.4.根据生成代码编写Biz层与实现类 三、controller层代码编写四、前台代码与分页代码五、案例测试 一、前期准备 1.2.导入pom.xml依赖 <?xml version"1.0" …...

【计算机网络】网络编程接口 Socket API 解读(5)

Socket 是网络协议栈暴露给编程人员的 API&#xff0c;相比复杂的计算机网络协议&#xff0c;API 对关键操作和配置数据进行了抽象&#xff0c;简化了程序编程。 本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍&#xff0c;从而更好的理解 socket 编程。…...

手动实现一个bind函数!

原文地址&#xff1a;手动实现一个bind函数&#xff01; - 知乎 1.bind函数用法 bind()方法用于创建一个新的函数&#xff0c;这个新函数接收的第一个参数代表的就是this&#xff0c;利用bind()函数我就就可以任意改变函数内部的this指向了。 官网的解释&#xff1a; bind()…...

数据结构-时间复杂度/空间复杂度

Hello&#xff0c;好久没有更新了哦&#xff0c;已经开始学习数据结构了&#xff0c;这篇文章呢就是对刚学数据结构所接触到的时间复杂度进行一个分享哦&#xff0c;如果有错误之处&#xff0c;大家记得拍拍我哦~ 既然要讨论时间/空间复杂度&#xff0c;那我们就得知道时间/空…...

英语写作中“展示”、“表明”demonstrate、show、indicate、illustrate的用法

一、demonstrate、show、indicate在论文写作中主要用法是&#xff1a;demonstrate/show/indicate 从句&#xff1a; Sb./Sth. demonstrates/shows/indicates that ……从句中一般表达事实、观点和结论等。 例句&#xff1a; The authors demonstrated/showed/indicated that…...

Redis的java客户端

在Redis官网中提供了各种语言的客户端&#xff0c;地址&#xff1a;https://redis.io/resources/clients/ redis的java客户端 https://redis.io/resources/clients/#java 1.jedis使用 引入依赖 <dependency><groupId>redis.clients</groupId><artifac…...

Android环境配置笔记

文章目录 一、各环境文档二、参考 一、各环境文档 Gradle官方的兼容性文档&#xff1a;Java Compatibility 更新日期&#xff1a;2023.9.12 Android Gradle插件版本&#xff1a;Android Gradle Plugin 二、参考 参考文章&#xff1a;Android问题记录...

element-table 行的拖拽更改顺序(无需下载sortableJs

样例展示&#xff1a;vueelement 通过阅读element文档我们发现element并不提供拖拽相关的api 本博客通过element提供的行类名 注册函数 实现行与行的拖拽 1.设置el-table 的行样式类名 这里是用的是 function <el-table:data"outputData":row-class-name&qu…...

Docker部署jenkins

目录 一、jenkins原理二、Docker部署jenkins1.下载jenkins镜像文件2.查看下载的jenkins镜像3.创建Jenkins挂载目录并授权权限4.创建并启动Jenkins容器5.查看jenkins是否启动成功6.查看docker容器日志7.配置镜像加速8.访问Jenkins页面&#xff0c;输入ip地址加上9000端口9.获取管…...

从0到1学会Git(第三部分):Git的远程仓库链接与操作

写在前面:前面两篇文章我们已经学会了git如何在本地进行使用&#xff0c;这篇文章将讲解如何将本地的git仓库和云端的远程仓库链接起来并使用 为什么要使用远程仓库:因为我们需要拷贝我们的代码给别人以及进行协同开发&#xff0c;就需要有一个云端仓库进行代码的存储和同步&a…...

虚拟机Ubuntu操作系统常用终端命令(1)(详细解释+详细演示)

虚拟机Ubuntu操作系统常用终端命令 本篇讲述了Ubuntu操作系统常用的三个功能&#xff0c;即归档&#xff0c;软链接和用户管理方面的相关知识。希望能够得到大家的支持。 文章目录 虚拟机Ubuntu操作系统常用终端命令二、使用步骤1.归档1.1创建档案包1.2还原档案包1.3归档并压缩…...

redis实战-redis实现异步秒杀优化

秒杀优化-异步秒杀思路 未优化的思路 当用户发起请求&#xff0c;此时会请求nginx&#xff0c;nginx会访问到tomcat&#xff0c;而tomcat中的程序&#xff0c;会进行串行操作&#xff0c;分成如下几个步骤 1、查询优惠卷 2、判断秒杀库存是否足够 3、查询订单 4、校验是否是一…...

Python爬虫-IP隐藏技术与代理爬取

前言 在进行爬虫程序开发和运行时&#xff0c;常常会遇到目标网站的反爬虫机制&#xff0c;最常见的就是IP封禁&#xff0c;这时需要使用IP隐藏技术和代理爬取。 一、IP隐藏技术 IP隐藏技术&#xff0c;即伪装IP地址&#xff0c;使得爬虫请求的IP地址不被目标网站识别为爬虫。…...

做网站来钱快/医院线上预约

#include #include #include #include //#include /*屏幕操作函数*/#define MAX 50//#define NULL 0typedef struct node1{int school; /*学校编号*/int record; /*项目成绩*/struct node1 *next; /*链域*/}Schools;typedef struct {int item; /*项目编号*/Schools *firstschoo…...

昆明网上房地产官网/百度惠生活怎么优化排名

0x01 起因及想法 起因:好久没更新博客了&#xff0c;我在乌云社区看到一篇代码审计的整体学习思想如下&#xff1a; 学习代码审计目标&#xff1a;能独立完成对一个CMS代码安全的监测 思路&#xff1a; A、通读全文代码&#xff0c;从功能函数代码开始阅读&#xff0c;例如incl…...

ps做图 游戏下载网站/网上哪里接app推广单

今天在公开课里看到直接用get_page函数来获取网页的代码 可自己尝试了下发旋无论是在python2还是python3里头都并不是预先设定好的函数 解决方案如下&#xff1a; import urllib2 def get_page(url):return urllib2.urlopen(url).read()def get_next_target(page):start_lin…...

工商网站做企业公示/抖音seo怎么做的

删除 ctrl d 删除光标所在位置上的字符相当于VIM里x或者dl ctrl h 删除光标所在位置前的字符相当于VIM里hx或者dh ctrl k 删除光标后面所有字符相当于VIM里d shift$ ctrl u 删除光标前面所有字符相当于VIM里d shift^ ctrl w 删除光标前一个单词相当于VIM里db ctrl y 恢复…...

重庆本地建站/郑州seo外包阿亮

1.首先你要有一个github账号,如果没有的话,登录网址注册&#xff1a;https://github.com/ 2.进入你的github 点击右上角的号 选择 New repository 3.取一个Repository name&#xff0c;不能和自己的其他项目冲突 PS&#xff1a;Repository name: 仓库名称Description(可选…...

成立公司注册资金可以随便写吗/百度seo新规则

内容出自极客时间专栏《Linux 性能优化实战》 CPU 的性能指标那么多&#xff0c;CPU 性能分析工具一抓一大把&#xff0c;换成实际的工作场景&#xff0c;该观察什么指标、选择哪个性能工具呢&#xff1f; 不要担心&#xff0c;今天我就以多年的性能优化经验&#xff0c;为你总…...