第2章 第一个Spring Boot项目

2023-05-16

开发工具选择

 

工欲善其事必先利其器,我们进行Java项目开发,选择一个好的集成开发工具(IDE)对提高我们的开发调试效率有非常大的帮助。这里我们选择大名鼎鼎的IDEA ,它全称 IntelliJ IDEA。

​IntelliJ IDEA公认最好的Java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析方面功能强大,尤其是其智能化人性化的辅助功能会让你用起来就爱不释手。IDEA是JetBrains公司的产品,我们可以在官网下载。Intellij IDEA有Community和Ultimate两个版本,Community为免费版,Ultimate为收费版,区别就是Ultimate可以开发web项目。

IntelliJ IDEA: IntelliJ IDEA: The Capable & Ergonomic Java IDE by JetBrains

创建Spring Boot项目的2种方法

创建Spring Boot项目一般有两种方法,一种是使用Spring官网提供的在线项目生成向导生成,另一种是使用Intellij IDEA自带的Spring项目生成向导生成。在创建项目之前需要安装JDK,网上教程较多,这里就不再赘述了。

方法1:使用Spring 官网在线生成项目

访问https://start.spring.io/ 出现如下页面。在Project 中选择Maven Project,编程语言Language中选择Java,Spring Boot版本使用默认选项即可。 Project Metadata 中Group为组织机构,一般按com.组织机构名填写,这里我填写了com.cjl , 选项Artifact代表子项目名,Name代表具体项目名称这里我们填写helloworld,描述信息Description请随意填写,Package name会自动生成。填写完毕基本参数之后,点击Generate创建并下载项目压缩包

将下载下来的项目压缩包解压,其中文件目录如下

​使用IDEA导入项目,选择File->Open File or Project,选择前面我们解压后的文件夹,单击OK,这个时候IDEA会提示你使用新的窗口还是在当前窗口,可以根据实际情况选择,选择完毕之后,出现如下项目窗口,其中项目文件结构还未完全显示,同时IDEA右下方有一个小进度条,表面IDEA正在下载项目依赖文件

​当IDEA下载完相关依赖文件之后会出现类似如下的项目结构。具体不同目录和文件的含义我们稍后介绍。

方法2:IDEA自带的Spring项目生成向导生成

选择File->New->Project命令,弹出新建项目对话框。

​左侧选择Spring Initializr,Project SDK根据项目需要选择

选择完毕后点击Next,出现Project Metadata填写页面,参照方法1填写即可

​点击Next 出现和前述导入一样的画面,等待IDEA将依赖文件下载完毕,即可看到项目结构目录。至此项目的初始创建完成。接下来我们介绍一下Spring Boot项目的结构以及如何将其运行起来。

Spring Boot项目基本结构

了解项目的目录结构是理解整个Spring Boot项目的基础,同时对理解项目的部署、维护也很有帮助。Spring Boot的项目结构如下,下面我们对其进行说明

.idea目录,这个目录其实不属于Spring Boot项目,.idea目录是存储IntelliJ IDEA项目的配置信息,主要内容有IntelliJ IDEA项目本身的一些编译配置、文件编码信息、jar包的数据源和相关的插件配置信息。

.mvn目录

​maven-wrapper主要有两个用处:

1.可以为某个Java工程指定特定Maven版本,避免因为Maven版本差异引起的环境错误统一项目的开发环境.

2.不再需要提前安装Maven,简化了开发环境的配置.

接下来的src目录是Spring Boot主目录

​其中

src/main/java: 是程序开发及主程序目录

src/main/resource: 存放配置文件和资源文件,例如一些项目中用到的图片、视频、音频等和项目配置文件application.properties

src/test/java: 是测试程序目录,我们在该目录下编写测试程序

接下来介绍一下其他文件

.gitignore文件 :Git忽略文件.gitignore,我们开发过程中会产生很多中间文件或者一些只有在本地使用的文件,这些文件不需要上传到代码库中,我们可以使用.gitignore进行配置。

pom.xml介绍

pom.xml文件是Maven项目中非常重要的配置文件。Gradle项目的配置文件是build.gradle,主要描述项目包的依赖和项目构建时的配置。由于pom.xml文件非常重要,我们对它进行详细介绍

pom.xml文件头信息

<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>
  • xmlns:命名空间,类似包名,因为xml的标签可自定义,为防止自定义的标签重名,需要命名空间来进行区分

  • xmlns:xsi :xml遵循的标签规范

  • xsi:schemaLocation :用来定义xmlschema的地址,也就是xml书写时需要遵循的语法

  • modelVersion:声明项目描述符遵循哪一个POM模型版本

项目基本信息

<groupId>com.cjl</groupId>
	<artifactId>helloworld</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>helloworld</name>
        <packaging>jar</packaging>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>8</java.version>
	</properties>

上面的配置内容基本是创建项目时定义的有关项目的基本描述信息其中:  
  • groupld:组织名也是项目的包路径。

  • artifactld: 项目名称。

  • version:项目版本号。

  • packaging:一般有jar、war两个值,表示使用Maven打包时是构建成JAR包还是WAR 包,默认是jar。

  • name:项目名称。

  • description:项目描述

项目依赖项信息

Spring Boot项目依赖项信息主要分为两部分parent和dependencies两部分。

parent部分

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.2</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

这部分是配置父级项目的信息,这是Spring Boot的主要优点之一,将需要的依赖项打包在父项目依赖中,Maven支持项目的父子结构,引入后会默认继承父级的配置。此项目中引入spring-boot-starter-parent定义Spring Boot的基础版本。  

dependencies部分

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

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

dependencies:配置项目所需要的依赖包,其中每个dependency标签代表一个依赖项,groupId是该依赖项的公司或者组织的唯一标志,artifacId是某个项目的唯一ID,一个groupId下面可能多个项目。  

项目公共属性

<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

properties标签下定义了一些项目的公共属性,例如源程序文件编码格式,Java版本等等。  

项目构建相关配置

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

build标签下面是项目构建相关配置信息,由于我们选择的是Maven构建Spring Boot项目,所以必须在<plugins>中添加spring-boot-maven-plugin插件,这样项目就能以Maven的方式为应用提供Spring Boot的支持。  

运行第一个项目

好了,前面已经对项目结构、pom.xml文件已经做完了介绍,相信很多读者都迫不及待想把项目运行起来了。下面介绍一下,如何运行我们第一个hello world程序。

在src\main\java\com\cjl\helloworld\目录上右击,选择new pacage创建一个目录

然后在该目录下创建HelloController类,随后添加/helloworld的路由地址和方法,代码如下

package com.cjl.helloworld.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @RequestMapping("/helloworld")
    public String helloworld() {
        return "hello world,你好世界";
    }
}

在上面代码示例中,我们创建了一个HelloController并创建了一个helloworld()方法,最后使用

@RestController 和@RequestMapping 注解实现HTTP路由。

可能有些初学者对注解这个词比较陌生,这里简单介绍一下,注解和注释很像,两者其实本质就差不多,注释是给我们程序员看的,而注解呢其实就是给程序看的,某个注解可以告诉程序要做什么事情。例如这里的 @RestController 标识被它标记的这个Spring中的类HelloController可以接收HTTP请求并返回return中的数据,而@RequestMapping("/helloworld")则提供路由映射,即访问“项目地址XX/helloworld”路径的HTTP请求,都会映射到helloworld()方法上处理。

接下来我们开始运行项目,在左侧项目导航中选中HelloworldApplication文件,可以看到文件中有一个注解@SpringBootApplication表面这是我们Spring项目的入口文件,点击右侧的绿色小三角形箭头,然后选择Run

项目如果成功运行,在IDEA下侧的输出窗口会看到类似如下的输出,其中注意port(s):8080,这表明我们的项目在8080端口监听服务,这个接下来会使用到

成功运行项目之后,我们用地址http://localhost:8080/helloworld 访问项目,出现如下图信息,则说明我们的项目运行成功了

接下来要介绍一下Spring的单元测试,可能很多同学在学校期间编写代码没有做单元测试的习惯,但是在实际开发中,单元测试是一项非常重要的工作,养成良好的单元测试习惯,可以减少大量的bug,让你的项目更加顺利上线,为你节省大量精力。

Spring Boot作为一个专业的开发框架,它对单元测试的支持非常好,要使用单元测试功能,只需要在项目pom.xml文件中添加spring-boot-starter-test测试依赖启动器,然后就可以通过相关的单元测试注解实现单元测试。由于在线生成或者用IDEA生成向导生成的项目默认已经带了测试依赖启动器,无需再添加,如果没有需要在pom.xml中手动添加

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

确认项目中添加了测试依赖启动器之后,就可以开始编写对应的单元测试了

现在我们第一步只是单纯想运行一下单元测试,输出一句“Spring boot单元测试开始”,我们使用@Test 注解 实现。在自动生成的HelloworldApplicationTests类中已经有一个自动生成的单元测试方法实例了

@SpringBootTest
class HelloworldApplicationTests {

	@Test
	void contextLoads() {
	}

}

@SpringBootTest 注解用于标记这是一个测试类,其作用是用于确定如何装载 Spring 应用程序的上下文资源,这样框架会自动将这段程序加载到Spring Boot容器中,@Test 说明这是一个单元测试用例。我们仿照示例编写自己的单元测试程序

	@Test
	public void  helloworld() {
		System.out.println("Spring boot单元测试开始");
	}

单机方法右侧的绿色箭头运行单元测试helloworld()方法,如果一切正常则会看到如下输出,左上角的绿色小勾说明测试通过,左下方会输出单测函数的输出结果  

上面介绍了Spring Boot中最基本的单元测试,在一般开发过程中单元测试应用最多的地方是针对Service和Controller的测试。

测试Service方法

首先在项目中新建一个要测试的Service类,具体方法是。在com.cjl.helloworld目录下新建目录service,在目录中添加HelloService类。我们在该类中定义一个findHelloMsg()的方法,后面我们将测试该方法是否按预期运行

接下来就是生成对于的测试方法,对此IDEA提供了良好的支持,在Service类文件中右击,选择Go To,然后选择Test

随后会弹出如下创建向导,在其中勾选我们需要测试的方法

点击Ok后会在test目录下生成对于的测试类HelloServiceTest,并且其中已经生成了对findHelloMsg()的测试方法,我们在其中添加需要的代码

首先在class声明头部添加@RunWith(SpringRunner.class)注解,在编写代码过程中如果相应的类没有引入IDEA还会提示,我们按照提示操作即可

完整的测试代码如下,我们用@Autowired 注解了一个HelloService 类实例,以便后面测试时调用。然后编写了findHelloMsg()测试函数,里面用Assert.assertEquals方法判断findHelloMsg()运行结果是否符合我们预期

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import static org.junit.jupiter.api.Assertions.*;

@RunWith(SpringRunner.class)
@SpringBootTest
class HelloServiceTest {
    @Autowired
    private HelloService helloService;

    @Test
    public void findHelloMsg() {
        Assert.assertEquals("find Hello Msg", helloService.findHelloMsg());
    }
}

  

将鼠标放到单元测试方法findHelloMsg()上,右键选择Run执行该方法,我们即可看到运行结果

测试Controller

除了对Service进行测试,我们还需要对Controller进行测试。由于Controller功能是对不同的web请求进行路由响应因此需要一个可以模拟Web请求的类来辅助测试,这个类就是MockMvc类。MockMvc类能够模拟HTTP请求,来访问Controller中的方法,同时不依赖网络环境。spring-boot-starter-test中使用@WebMvcTest等注解进行使用。在我们前面创建的HelloController类里,按照前述方法创建测试用例程序

在IDEA自动生成的代码上添加代码如下

@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
class HelloControllerTest {
    @Autowired
    private MockMvc mockMvc;

    @Test
    public   void helloworld() throws  Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/helloworld")
        .contentType(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andDo(print());
    }
}

代码中使用MockMvc类实例mockMvc构造HTTP请求,通过MockMvcRequestBuilder.post构造一个post请求,通过contentType(MediaType.APPLICATION_JSON)设置返回格式为JSON格式,andExpect(status().isOk())对执行的结果进行判断,默认HTTP请求返回状态码200为正确,andDo(print())在执行完毕后调用print()将处理结果打印出来。  

运行测试程序可以看到结果输出

在Idea的spring工程里,经常会遇到Could not autowire. No beans of 'xxxx' type found的错误提示。但程序的编译和运行都是没有问题的,这个错误提示并不会产生影响。 原因在于spring auto scan配置。在编辑情况下,无法找不到对应的bean,于是提示找不到对应bean的错误,只要修改工程的配置即可

​点击File->Settings 输入autoW然后按图修改即可

开发中的热部署

我们在调试开发Spring Boot项目过程中,经常需要反复修改测试,在修改之后往往需要重启服务,有些服务需要加装很长时间,这就导致了开发效率低下,为解决这个问题Spring Boot框架专门提供了进行热部署的依赖启动器,实现项目的热部署。

添加热部署依赖启动器

使用热部署需要添加相应的依赖启动器,在pom.xml中引入

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>

  

在IDE工具中设置热部署,点击File->Settings, 打开Compiler面板设置,选择【Build,Execution,Deployment】下的Comiller,选中自动编译项目Build project automatically

​在项目任意页面使用快捷键 "Ctrl+Shift+Alt+/"打开Maintenance选项框,选择Registry页面,然后选择运行自动编译运行

效果测试,启动项目访问http://localhost:8080/helloworld可以看到当前的输出是

然后我们修改helloworld的代码,返回值变为"hello world,我很好";

@RestController
public class HelloController {
    @RequestMapping("/helloworld")
    public String helloworld() {
        return "hello world,我很好";
    }
}

​我们观察输出窗口,发现项目自动进行编译并运行了,同时刷新浏览器,内容改变说明热部署生效。

项目源码

可以访问:GitHub - qwdzq/springboot: spring boot 入门

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第2章 第一个Spring Boot项目 的相关文章

  • 删除数组中指定的数字

    删除数组中指定的数字 题目 xff1a 有一个整数序列 xff08 可能有重复的整数 xff09 xff0c 现删除指定的某一个整数 xff0c 输出删除指定数字之后的序列 xff0c 序列中未被删除数字的前后位置没有发生改变 代码实现如下
  • session与Cookie

    目录 session与Cookie 1 session的一些方法与概述 2 Cookie的一些方法与概述 Cookie保存的类容如含特殊符号 需要转16径直文件 session与Cookie 1 session的一些方法与概述 sessio
  • 【Linux信号量】

    Linux信号量 POSIX信号量信号量的原理信号量的概念信号量函数 二元信号量模拟实现互斥功能基于环形队列的生产消费模型空间资源和数据资源生产者和消费者申请和释放资源必须遵守的两个规则信号量保护环形队列的原理 POSIX信号量 信号量的原
  • win11系统任务栏居中以及透明美化

    win11系统任务栏居中以及透明美化 文章目录 win11系统任务栏居中以及透明美化前言一 win11系统任务栏居中二 使用步骤1 如何找的安装的startallback2 startallback的功能 总结 前言 拥有一个漂亮的桌面会使
  • 求conio头文件

    conio头文件哪里下载呀
  • C语言程序设计:删除字符串中的数字

    题目内容 xff1a 编程 xff1a 从键盘上输入一个含有数字的字符串 xff0c 然后在 原字符串 中删除其中的数字 如输入的字符串为 ab12cd345e xff0c 则处理后的字符串为 abcde 程序中只能定义一个数组 提示 xf
  • 在Windows Server 2016 中共享及权限的操作

    如图 技术部 张工 蔡工 研发部 黄工 xff08 头儿 xff09 软件部 李工 周工 首先 xff0c 创建组和用户 xff0c 在服务管理器 工具 计算机管理 用户和组
  • 基于ssm的个人健康信息管理系统

    结合当今大数据技术研究的潮流 综合ssm框架 jsp技术 MySQL数据库等关键技术 构建了一个基于ssm的个人健康信息管理系统 首先 本文对个人健康信息管理系统涉及到的理论与相关技术进行了全面的分析 随后 通过对个人健康信息定义的理解和对
  • linux创建sftp

    SFTP简介 百度百科 xff1a sftp是Secure File Transfer Protocol的缩写 xff0c 安全文件传送协议 可以为传输文件提供一种安全的网络的加密方法 SFTP 为 SSH的其中一部分 xff0c 是一种传
  • Altium Designer 16.1中绘制蛇形走线的方法

    这是在线已经连接好的情况下进行的蛇形走线 1 首先英文输入法的情况下 xff0c 按下快捷键T 43 R xff0c 鼠标变成十字形 xff0c 点击需要进行蛇形走线的线段 2 然后按下Tab键 xff0c 设置蛇形走线参数 3 我一般选择
  • 5 计算机组成原理第四章 指令系统

    文章目录 1 指令格式1 1 指令定义1 2 指令格式1 3 指令格式 地址码1 4 指令格式 操作码1 5 操作码分类1 6 操作类型 2 数据存放指令寻址2 1 数据存放方式2 2 指令寻址2 3 操作数类型2 4 数据寻址2 4 1立
  • html ----checkbox使用

    1 html checkbox使用 lt html gt lt head gt lt title gt 选择 lt title gt lt head gt lt body gt 请选择你喜欢的水果 xff1a lt br gt lt for
  • Qt:QJsonArray

    说明 QJsonArray中存储了一系列的QJsonValue 可以向其中插入 删除QJsonValue 一个QJsonArray可以与QVariantList互相转换 可以通过size 访问其中的元素数 xff0c insert remo
  • Qt——日志输出

    普通的打印输出 用 QtCreator 开发 Qt 程序时 xff0c 经常需要向控制台打印一些参数 有时候是查看对象的属性是否被正确设置 xff0c 有时候是查看程序是否执行了某一段代码 xff0c 或者执行了多少次这一段代码 尽管使用调
  • 消息队列的重要技术讲解

    一 什么是消息队列 xff1f 消息队列不知道大家看到这个词的时候 xff0c 会不会觉得它是一个比较高端的技术 xff0c 反正我是觉得它好像是挺牛逼的 消息队列 xff0c 一般我们会简称它为MQ Message Queue xff0c
  • [android nfc] onNewIntent 中 无法获取 tag, 或者 intent.extras 为空, 或者 intent.action 为空

    在做android nfc 场景的时候 大方向上有2种 foreground 调度系统enableReaderMode api foreground 调度系统 发现android12下无法获取tag信息 经过排查 原因如下 在 androi
  • linux系统常用命令列举

    Linux系统入门 Linux特点 开源多用户 xff1a 系统可以在保证各个用户之间的安全 xff0c 隐私多任务 xff1a 良好的界面 xff1a Linux同时支持两种环境 xff0c 字符界面 图形化界面支持多种平台 xff1a
  • linux 常用命令

    查看所有分区 du sh window 想查看进程的端口号有这样几个方法 1 使用netstat ano查看所有连接和监听端口 xff0c 以及每个连接相关的进程ID 2 使用进程管理器查看进程PID 默认情况下可能不显示PID xff0c
  • android 11 Setting panel的一次源码分析

    Android 11 Setting panel的一次源码分析 Android 11关于Wi Fi的开关等设置 xff0c 不允许用户直接调用 xff0c 需要从panel设置 启动代码如下 xff1a val panelIntent 61
  • nginx与ftp服务器出现403错误

    默认的yum安装 ftp的路径是在 etc vsftpd xff0c 这时候通过上面创建的 用户从 FTP登陆后 进入 home目录就可以查看到ftpuser文件夹 上图这里有个小细节就是在Linux中 xff0c 创建一个文件时 xff0

随机推荐

  • 高通Android平台硬件调试之Camera篇

    之前一段时间有幸在高通android平台上调试2款camera sensor xff0c 一款是OV的5M YUV sensor xff0c 支持jpeg out xff0c 同时也支持AF xff0c 调试比较比较简单 xff0c 因为别
  • 7 计算机组成原理第五章 中央处理器 数据通路

    文章目录 1 数据通路的功能和基本结构单总线1 1 数据通路的功能1 2 数据通路 基本结构单总线 2 数据通路 CPU内部单总线方式2 1 三种结构之间数据传送方式2 2 CPU内部单总线方式 例题 3 专用通路3 1 专用数据通路方式3
  • Python 记录日志简单好用,功能齐全(Loguru)

    Loguru 一个能彻底解放你的日志记录器 它即插即用 xff0c 具备多种方式滚动日志 自动压缩日志文件 定时删除等功能 除此之外 xff0c 多线程安全 高亮日志 日志告警等功能也不在话下 下面就给大家介绍一下这个强大工具的基本使用方法
  • linux设备驱动——andriod平台wlan驱动II——给军爷的答案

    转自 http wsqhs spaces live com c11 BlogPart BlogPart 61 blogview amp c 61 BlogPart amp partqs 61 amonth 3d4 26ayear 3d200
  • Linux 下 如何打 PATCH 及制作 DIFF

    Linux下patch的制作和应用 因为在u boot移植过程中 xff0c 有几处通用文件要修改 xff0c 如果每次都要手动修改就太麻烦了 制作补丁可以解决这个问题 学习资料的收集比较简单 xff0c 方法一类似于这种初级问题网上资料非
  • LINUX GIT 使用

    git show HEAD git show HEAD git show HEAD git show HEAD git diff 486ec madplay player c git diff 4863 856f git diff 4863
  • LINUX 输入子系统分析

    1 输入子系统架构Overview 输入子系统 xff08 Input Subsystem xff09 的架构如下图所示 输入子系统由 输入子系统核心层 xff08 Input Core xff09 xff0c 驱动层和事件处理层 xff0
  • Linux Kernel and Android 休眠与唤醒

    Table of Contents 简介 国际化 版本信息 对于休眠 suspend 的简单介绍 Linux Suspend 的流程 相关的文件 准备 冻结进程 让外设进入休眠 Resume Android 休眠 suspend 涉及到的文
  • 浅析linux下键盘设备工作和注册流程

    span style color 000000 a href http qgjie456 blog 163 com blog m 61 0 span style font size 6 http qgjie456 blog 163 com
  • linux内核信号处理

    信号是操作系统中一种很重要的通信方式 近几个版本中 信号处理这部份很少有大的变动 我们从用户空间的信号应用来分析Linux内核的信号实现方式 一 信号有关的数据结构 在task struct中有关的信号结构 struct task stru
  • win7和ubuntu双系统,直接进入windows启动项选择菜单,而不进入grub的解决方案。

    一 Ubuntu 采用 grub 引导 xff0c 首先要将 grub 引导去掉 xff0c 重建 windows mbr 引导 xff0c 下载 MbrFix exe 并将它放到 C 盘根目录 xff08 其他目录也可 xff09 xff
  • 带你搞明白Zookeeper选举机制

    没什么 xff0c 搞不明白别打我就行 xff0c 初学者如有问题请及时指正 xff01 在上一篇文章我们有介绍3种server角色 xff1a Leader Follower以及Observer xff08 不参加选举 xff09 xff
  • windows远程linux桌面

    TigerVNC是一个高性能 平台无关的虚拟网络计算 xff08 Virtual Network Computing xff0c VNC xff09 实现 xff0c 是一个客户端 服务器应用程序 xff0c 允许用户在远程机器上启动并与图
  • 循环队列的介绍与实现

    文章目录 1 循环队列定义2 循环队列基本操作3 循环队列代码实现4 补充 1 循环队列定义 循环队列 xff1a 即顺序存储的队列 xff0c 是为了避免 假溢出 而利用 运算符将队列首尾相接连成一个环状的队列 xff0c 称为循环队列
  • AndroidStudio4.1 升级Kotlin插件不生效问题

    背景 xff0c 在使用SAM转换写Livedata observe 的第二个参数时 xff0c 发现AS报红 xff0c 但编译不出错 xff0c 功能也能正常运行 然后就尝试升级Kotlin插件 AndroidStudio4 1 默认带
  • 一个中科大差生的8年程序员工作总结

    今年终于从大菊花厂离职了 xff0c 离职前收入大概60w不到吧 xff0c 在某乎属于比较差的 xff0c 今天终于有空写一下自己的职场故事 xff0c 也算是给自己近8年的程序员工作做个总结复盘 近8年有些事情做对了 xff0c 也有更
  • 如何一步一步成为一个领域专家

    经常有人问我 xff0c 为什么有的人工作10年仍然平台无奇 xff0c 而有的人只用3年时间 xff0c 就已经脱颖而出 xff0c 成绩斐然 我说 xff0c 是呀 xff0c 有些参加工作多年却仍然只会复制粘贴简单业务代码 xff0c
  • 如何一步一步建立自己的技术影响力

    很多朋友是不是有这样的经历 xff0c 当我们还是一个菜鸟的时候 xff0c 团队里总有1 2个技术大拿 xff0c 每当有技术问题大家争论不休 xff0c 团队成员讨论的面红耳赤 xff0c 技术大牛实在看不下去 xff0c 掐灭手中的烟
  • 一个老程序员的一些职场经验分享

    有一些关于职场的经验 xff0c 当然有一些是以前总结过的 xff0c 现在归类总结一下 xff0c 上半部分是通用职场 xff0c 下半部分是程序员专用 一 通用职场经验 1 xff09 很多人认为事情做得多 xff0c 事情做得好就能晋
  • 第2章 第一个Spring Boot项目

    开发工具选择 工欲善其事必先利其器 xff0c 我们进行Java项目开发 xff0c 选择一个好的集成开发工具 xff08 IDE xff09 对提高我们的开发调试效率有非常大的帮助 这里我们选择大名鼎鼎的IDEA xff0c 它全称 In