我们为什么需要 SpringBoot?

作者 | 阿文,责编 | 郭芮

头图 | CSDN 下载自东方IC

出品 | CSDN(ID:CSDNnews)

任何先进技术的产生都不是凭空出现的,SpringBoot 也不例外,SpringBoot 是基于Spring 的基础上产生的。总所周知,Spring 是一个轻量级的容器,在Java EE 项目中得到广泛使用,但是Spring复杂、繁琐和臃肿的XML配置方式配置使得开发人员在实际使用过程中变得非常痛苦,尤其是与其他第三方工具进行整合时,比如Mybatis等就更会使得配置文件变得异常复杂和重复。

比如我们来看一段Spring的配置:

上图是一段配置数据库以及事务管理和Mybatis 的配置,我们发现仅仅是配置文件就非常的多,当然这还不是最复杂的。在这种基础上,SpringBoot 诞生了。

SpringBoot 的出现给开发者带来了新的自动化配置解决方案,使得开发者能够基于 SpringBoot 快速创建基于 Spring 生产级的独立应用程序, SpringBoot 中对一些常用的第三方库提供了默认的自动化配置方案,使得开发者只需要很少的 Spring 配置就能运行完整的 JavaEE 应用。由于其拥有了开箱即用的特性以及服务监控方案同时自带web服务器且与Spring的另一个主流的Spring Cloud 等服务治理框架以及kubernetes 等技术的融合使得开发人员可以快速的实现微服务以及服务的治理、熔断等,最重要的是你可以完全不需要配置XML,真的是太爽了。

那么,如何入门SpringBoot 呢?本文将带你了解。

小试牛刀

首先,我们创建一个SpringBoot工程,创建SpringBoot的方法有很多,这里以IDEA 企业版为例,我们选择 Spring initalizr 然后创建一个工程。

创建完工程之后,我们打开pom.xml,我们可以看到这段配置:

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

spring-boot-starter-parent 是一种特殊的 starter,它提供了一些 maven 默认配置,同时还提供了dependency-management ,可以便开发者在引入其他依赖时不必输入版本号,方便依赖管理。

SpringBoot 提供的starter 非常多,这些 Starter 要为第三方库提供自动配置,假如我们要配置一个web项目,则可以在maven 中加入:

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

在项目的入口我们可以看到一个DemoApplication,这是整个SpringBoot的入口:

package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class);}}

其中@SpringBootApplication 注解等于如下注解,表示开启自动配置以及自动扫包:

@EnableAutoConfiguration
@ComponentScan

其中ComponentScan 会扫描@Service、@Repository、@Component、@Controller、@RestController以及带@Configuration 注解的类,但是我们为了更方便,通常都是直接在入口加上@SpringBootApplication。

在IDE中,我们运行DemoApplication 这个class 就可以运行SpringBoot 了,此时终端会出现如下信息,我们可以看到 (v2.2.6.RELEASE) 版本号以及Tomcat的端口:

但是此时我们去访问127.0.0.1:8080,会出现404的提醒:


我们可以在项目下新建一个 HelloController:

@RestController
public class HelloController {@GetMapping("/hello")public String hello(){return "Hello World!";}
}

此时,我们去访问可以看到如下内容:

当然,更多的时候我们写完一个应用,是需要放到服务器上去运行的,这个时候我们需要把应用进行打包,要打包应用,我们需要在pom.xml中配置:

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

当然,使用idea 创建的SpringBoot 这些都给我们安排的妥妥的,我们只需要在终端输入如下命令就可以将整个项目进行打包:

mvn package

然后我们在终端执行:

java -jar target/demo-0.0.1-SNAPSHOT.jar

就可以运行打包好的项目,如下所示:

定制Banner

当SpringBoot 程序启动之后,我们会看到SpringBoot 的Logo:

但是通常情况下,企业会将其替换成自己的公司Logo,那么如何定制属于自己的企业Logo 呢?

首先,我们要把文件转成TXT文本形式的字体,比如在 http://www.network-science.de/ascii/ 设置,比如我们设置一个SpringDemo的字体:

然后在项目的resource目录下新建一个banner.txt的文件,将生成的文字复制粘贴进去即可:

然后我们重新运行程序就会发现默认的Logo 被替换了:

如果要关闭也很简单,只需要在main函数中,设置:

SpringApplicationBuilder builder = new SpringApplicationBuilder(DemoApplication.class);
builder.bannerMode(Banner.Mode.OFF).run(args);

Web 容器的配置

在SpringBoot 中,我们可以在application.properties 中对web 容器进行配置,如下所示:

server.address=127.0.0.1 # 配置地址
server.port=8888 # 配置端口
server.tomcat.basedir=/opt/tmp # 配置目录
server.tomcat.uri-encoding=utf-8 #配置编码
server.tomcat.max-threads=300 #配置最大线程数

在idea 中,会对配置项进行智能提示,非常方便:

我们还可以在该文件中配置证书:

server.ssl.key-store= #配置秘钥文件名称
server.ssl.key-alias= #配置秘钥别名
server.ssl.key-password= # 配置证书密码

application.properties 的文件加载顺序

SpringBoot 中的application.properties配置文件可以出现在如下4个位置:

  • 项目根目录下的config 文件夹中

  • 项目的根目录下

  • classpath 下的config文件夹下

  • classpath 下

开发者也可以自定义这个文件的名称,只需要在运行时加上spring.config.name=xxx即可:

jar -jar xxx.jar --spring.config.name=xxx

也可以知道配置文件所在路径:

jar -jar xxx.jar --spring.config.location=classpath:/

SpringBoot 的配置文件最终都会被加载到Environment中,我们可以通过@Value 注解以及EnvironmentAware 接口来讲数据注入到属性上,例如application.properties中的内容如下:

book.name=西游记
book.author=六承恩
book.price=66
book.type="古典文学","四大名著"

Book 类的内容如下:

@Component
@ConfigurationProperties(prefix = "book")
public class Book {private String name;private String author;private Float price;private List<String> type;//getter 省略//seteer 省略@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type=" + type +'}';}
}

其中ConfigurationProperties 注解中的prefix 属性描述了要加载配置文件的前缀对应的控制器类如下:

@RestController
public class BookController {@AutowiredBook book;@GetMapping("/book")public String book(){return book.toString();}
}

我们执行后访问可以看到如下内容:

除此之外,还支持YAML 配置,我们将application.properties中的内容删除或注释,然后在resource中新建一个application.yml 文件,内容如下,重新运行程序得到的结果与上面的一样。

book:name: 西游记author: 六承恩price: 66type:-  古典文学- 四大名著

YAML格式的文件虽然方便,但是无法使用@PropertySource 注解加载YAML文件。

Profile

在实际的开发过程中,开发人员需要频繁的在生产和测试环境进行切换,其中一些配置就需要变动,比如数据库的配置。对此,SpringBoot 提供了@Profile注解,我们可以配置2个配置文件分别代表生产和测试环境的,在resource中新建application-dev.properties以及application-prod.properties。

然后在main 函数中配置:

SpringApplicationBuilder builder = new SpringApplicationBuilder(DemoApplication.class);builder.application().setAdditionalProfiles("prod");builder.run(args);

或者在项目启动时候加上--spring.profiles.active=prod

同时,欢迎所有开发者扫描下方二维码填写《开发者与AI大调查》,只需2分钟,即可收获价值299元的“ AI开发者万人大会”在线直播门票!

推荐阅读:小网站的容器化(下):网站容器化的各种姿势,先跟着撸一波代码再说!
你知道吗?其实Oracle直方图自动统计算法存在这些缺陷!(附验证步骤)
详解以太坊虚拟机(EVM)的数据存储机制
比特币当赎金,WannaRen勒索病毒二度来袭!平台抗住日访问量7亿次,研发品控流程全公开“手把手撕开LeetCode翻译,扒各种算法套路的裤子”北京四环堵车引发的智能交通大构想
真香,朕在看了!

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

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

相关文章

高德网络定位之“移动WiFi识别”

导读 随着时代的发展&#xff0c;近10年来位置产业蓬勃发展&#xff0c;定位能力逐渐从低精度走向高精度&#xff0c;从部分场景走向泛在定位。设备和场景的丰富&#xff0c;使得定位技术和能力也不断的优化更新。定位能力包括GNSS、DR&#xff08;航迹推算&#xff09;、MM&a…

JavaScript-字符串

字符串 正常字符串使用单引号 或者 双引号 包裹注意转义字符 \ \ \n \t \u4e2d \u#### Unicode字符 \x41 Ascll字符多行字符串编写 // tab 上面 esc下面的引号 let msg helloworld你好 console.log(msg)模板字符串 let name ht let age 5; let msg hello${name}你…

Alibaba Sentinel规则持久化-拉模式-手把手教程【基于文件】

文章目录一、拉模式架构二、原理简述三、编写3.1 加依赖3.2 写代码3.3 配置四、优缺点分析五、你可能会有的疑问六、参考文档七、案例测试7.1. 添加流控规则7.2. 服务停止7.3. 重新启动服务7.4. 调用接口7.5. 查看流控规则本文实现基于拉模式的Alibaba Sentinel规则持久化。一、…

开发者说:Seata 0.7.0 版本,你 get 'Metrics' 技能了吗?

从用户的视角来感受一个开源项目的成长&#xff0c;是我们推出「开发者说」专栏的初衷&#xff0c;即在开发者进行开源项目选型时&#xff0c;提供更为立体的项目信息。专栏所有内容均来自作者原创/投稿&#xff0c;本文是「开发者说」的第9篇&#xff0c;作者郑扬勇&#xff0…

面试时遇到「看门狗」脖子上挂着「时间轮」,我就问你怕不怕?

来源 | Why技术封图 | CSDN 下载于视觉中国之前写了一篇文章&#xff0c;有一个小节中写到这样一段话&#xff1a;于是就有读者来问了&#xff1a;老哥&#xff0c;看门狗介绍一下呗。面试的时候被问到了&#xff0c;没有回答上来。听到这个问题我脑海里首先浮现出了几个问题&…

海量结构化数据存储技术揭秘:Tablestore存储和索引引擎详解

前言 表格存储Tablestore是阿里云自研的面向海量结构化数据存储的Serverless NoSQL多模型数据库。Tablestore在阿里云官网上有各种文档介绍&#xff0c;也发布了很多场景案例文章&#xff0c;这些文章收录在这个合集中《表格存储Tablestore权威指南》。值得一提的是&#xff0…

JavaScript-数组

数组 Array可以包含任意的数据类型 var arr [1,2,3,4,5,6] arr[0] // 取值 arr[0] 3 // 赋值长度 arr.length arr.length 10 // 长度是可变的注意&#xff1a;假如给arr.length 赋值&#xff0c;数组大小就会发生变化。如果赋值过小&#xff0c;元素就会丢失 获取指定字…

Alibaba Sentinel规则持久化-推模式-手把手教程【基于Nacos】

前面&#xff0c;已经为Sentinel实现了 基于拉模式的规则持久化 &#xff0c;本文来实现基于 推模式的规则持久化。 文章目录一、推模式架构图二、原理简述三、微服务改造3.1. 加依赖3.2. 添加配置四、Sentinel控制台改造五、编译 & 启动六、测试测试1&#xff1a;测试2&am…

现代IM系统中的消息系统架构 - 实现篇

序 消息类场景是表格存储&#xff08;Tablestore&#xff09;主推的方向之一&#xff0c;因其数据存储结构在消息类数据存储上具有天然优势。为了方便用户基于Tablestore为消息类场景建模&#xff0c;Tablestore封装Timeline模型&#xff0c;旨在让用户更快捷的实现消息类场景…

linux 环境 RocketMQ 4.8.0 安装、部署控制台

windows下RocketMQ下载、安装、部署、控制台 https://gblfy.blog.csdn.net/article/details/115734482 文章目录一、软件下载二、启动2.1. Linux/Unix/MacOS安装教程2.2. 验证RocketMQ功能正常&#xff08;可选&#xff09;2.3. 服务停止三、安装可视化插件3.1. github下载3.2.…

数据洪流时代,开发者这样硬核突围!

随着社会信息化的脚步加快&#xff0c;我们每个人无时无刻都在产生数据&#xff1a;刷抖音、聊微信、视频会议、点外卖……拇指轻轻一点击的背后&#xff0c;将引发意想不到的数据洪流&#xff1a;据 IDC 发布《数据时代 2025》的报告显示&#xff0c;全球每年产生的数据将从 2…

机器学习在交通标志检测与精细分类中的应用

导读 数据对于地图来说十分重要&#xff0c;没有数据&#xff0c;就没有地图服务。用户在使用地图服务时&#xff0c;不太会想到数据就像冰山一样&#xff0c;用户可见只是最直接、最显性的产品功能部分&#xff0c;而支撑显性部分所需要的根基&#xff0c;往往更庞大。 地图…

Kubenetes 监控一站式解决方案:阿里云 Prometheus 免费公测

Prometheus是目前企业级云原生应用的首选开源监控工具。作为云原生计算基金会&#xff08;CNCF&#xff09;第二个毕业的项目&#xff08;第一个是Kubernetes&#xff09;&#xff0c;Prometheus对K8s容器环境有很好的原生支持。近日刚刚发布免费公测的阿里云Prometheus&#x…

SpringBoot2.x Nacos RocketMQ 事务消息

需求背景&#xff1a; 现在有内容中心&#xff08;content-center&#xff09;和 用户中心&#xff08;user-center&#xff09;2个微服务&#xff0c;请求内容中心&#xff0c;发送消息给用户中心&#xff0c;完成为指定用户添加积分操作。 文章目录一、准备工作1. 版本对照2.…

阿里云宣布3年再投2000亿

4月20日&#xff0c;阿里云宣布&#xff1a;未来3年再投2000亿&#xff0c;用于云操作系统、服务器、芯片、网络等重大核心技术研发攻坚和面向未来的数据中心建设。 近期&#xff0c;谷歌、美团等相继关闭或收缩云计算业务。在当前经济形势下&#xff0c;阿里云是否会缩减投入&…

JavaScript-Map和Set

ES6新特性 Map var map new Map([[wang, 23],[ht, 22],[test,[1,2,3,yy]],[3,test num]]) // 通过 key获取 value var test1 map.get(test); var num map.get(3); console.log(test1) console.log(num) // 添加新的 键值对 map.set(admin, 123456) console.log(map) // 修…

MaxCompute技术人背后的故事:从ApacheORC到AliORC

2019大数据技术公开课第一季《技术人生专访》来袭&#xff0c;本季将带领开发者们探讨大数据技术&#xff0c;分享不同国家的工作体验。本文整理自阿里巴巴计算平台事业部高级技术专家吴刚的专访&#xff0c;将为大家介绍Apache ORC开源项目、主流的开源列存格式ORC和Parquet的…

JavaScript-Iterable迭代

Iterable ES6新特性 遍历数组 // for of 打印值 &#xff0c; for in 打印下标 var arr [4,5,6] for (const number of arr) {console.log(number) }遍历Map var map new Map([[whl,100],[ht,110],[other,0]]) for (let x of map) {console.log(x)console.log(x[0])consol…

阿里小程序亮相2019上海云峰会:大生态促成许多“小而美”

7月25日下午&#xff0c;在上海世博中心的阿里云峰会上海站上&#xff0c;阿里巴巴小程序繁星计划以展区加开放式论坛形式&#xff0c;与各领域开发者、企业和生态合作伙伴充分交流了小程序一云多端的规划和进展&#xff0c;以及阿里系各端APP向小程序开放的资源和能力。 与会者…

快速验证业务决策,“玩转”用户增长

背景 闲鱼目前已经是国内最大的闲置物品交易平台&#xff0c;每天都有数以千万计的用户过来闲鱼&#xff0c;以C2C交易为主。在闲鱼里面&#xff0c;用户的C2C购物频率其实是很低的&#xff0c;而纯粹地逛商品feed流是一件挺无聊的事情。在业务上做加法&#xff0c;突破闲鱼用…