百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

如何快速构建一个 Spring Boot 工程?

yuyutoo 2024-10-12 01:38 5 浏览 0 评论

作者 | 唐亚峰

责编 | 胡巍巍

Spring Boot 是为了简化 Spring 应用的创建、运行、调试、部署等一系列问题而诞生的产物, 自动装配的特性让我们可以更好的关注业务本身而不是外部的 XML 配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 Web 工程。

未接触 SpringBoot 之前,搭建一个普通的 Web 工程往往需要花费30分钟左右,如果遇到点奇葩的问题耽搁的时间会更长一点,但自从用了 SpringBoot 后,真正体会到什么叫分分钟搭建一个 Web,让我拥有更多的时间跟我的小伙伴们唠嗑了。

使用 SpringBoot 后发现一切是如此的简单(还记得读书那会被JAR包,XML 支配的恐惧吗,如今都可以说 good bye)。

设计的目标

  • 为所有使用 Spring 的开发者提供一个更简单,快速的入门体验;
  • 提供一些常见的功能、如监控、Web 容器,健康,安全等功能;
  • 干掉 XML,遵循规范,开箱即用。

前提

SpringBoot 为我们提供了一系列的依赖包,所以需要构建工具的支持: Maven 或 Gradle。由于本人更习惯使用 Maven,所以后续案例都是基于 Maven 与 IntelliJ IDEA,同时这里是基于最新的 SpringBoot2 编写的哦......

创建项目

初次接触,我们先来看看如何创建一个 SpringBoot项目,这里以 IntelliJ IDEA为例,其他的IDE工具小伙伴们自行搜索创建方式。

创建完项目后,各位小伙伴请认真、细心的对比下与传统的 Web 工程有何区别(如:目录结构)。

点击 File->Project

如果用过 Eclipse/IDEA 等工具的,对创建项目肯定不会陌生,但为了照顾第一次使用的我贴上了图文。

选择 Spring Initializr

到这一步选择的时候,如图中选项的是 Spring Initializr(官方的构建插件,需要联网),第二个是自己选择 Maven 构建,为了更好的适合初学者,我们将在本章用插件构建。

填写项目基本信息

  • Group: 组织 ID,一般分为多个段,这里我只说两段,第一段为域,第二段为公司名称。域又分为 org、com、cn等等,其中 org 为非营利组织,,com为商业组织。如阿里、淘宝(com.alibaba/com.taobao)。
  • Artifact:唯一标识符,一般是项目名称。

择包

Spring Initializr 为我们提供了很多的选项,不同的选项有不同的作用,在初期我们只需要依赖 Web->Web就可以了,选择好依赖包之后点击 Next -> Finish。

目录结果

src
 -main
 -java
 -package
 #主函数,启动类,运行它如果运行了 Tomcat、Jetty、Undertow 等容器
 -SpringbootApplication 
 -resouces
 #存放静态资源 js/css/images 等
 - statics
 #存放 html 模板文件
 - templates
 #主要的配置文件,SpringBoot启动时候会自动加载application.yml/application.properties 
 - application.yml
 #测试文件存放目录 
 -test
# pom.xml 文件是Maven构建的基础,里面包含了我们所依赖JAR和Plugin的信息
- pom

pom.xml 依赖

因为使用了 Spring Initializr 插件,所以如下的配置都不需要我们自己去写啦,需要注意的是版本要选择 RELEASE ,稳定版本 Bug 少。

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.battcn</groupId>
 <artifactId>chapter1</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>
 <name>chapter1</name>
 <description>我的用第一个SpringBoot工程</description>
 <!--版本采用的是最新的 2.0.1.RELEASE TODO 开发中请记得版本一定要选择 RELEASE 哦 -->
 <parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>2.0.1.RELEASE</version>
 <relativePath/> <!-- lookup parent from repository -->
 </parent>
 <properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 <java.version>1.8</java.version>
 </properties>
 <dependencies>
 <!-- 默认就内嵌了Tomcat 容器,如需要更换容器也极其简单-->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <!-- 测试包,当我们使用 mvn package 的时候该包并不会被打入,因为它的生命周期只在 test 之内-->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
 </dependency>
 </dependencies>
 <build>
 <plugins>
 <!-- 编译插件 -->
 <plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 </plugin>
 </plugins>
 </build>
</project>

其它的依赖可以参考:官方文档。

主函数入口

注意事项: 一个项目中切记不要出现多个 main 函数,否在在打包的时候 Spring-Boot-Maven-plugin 将找不到主函数(主动指定打包主函数入口除外......)。

/**
* 我的第一个SpringBoot程序
* 其中 @RestController 等同于 (@Controller 与 @ResponseBody)
*
* @author Levin
*/
@RestController
@SpringBootApplication
public class Chapter1Application {
 public static void main(String[] args) {
 SpringApplication.run(Chapter1Application.class, args);
 }
 @GetMapping("/demo1")
 public String demo1() {
 return "Hello battcn";
 }
 @Bean
 public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
 // 目的是
 return args -> {
 System.out.println("来看看 SpringBoot 默认为我们提供的 Bean:");
 String[] beanNames = ctx.getBeanDefinitionNames();
 Arrays.sort(beanNames);
 Arrays.stream(beanNames).forEach(System.out::println);
 };
 }
}

初窥配置文件

从启动日志中可以发现, SpringBoot 默认的端口是 8080 ,那么如果端口被占用了怎么办呢?不要慌,问题不大,配置文件分分钟解决你的困扰......

2018-04-20 16:14:46.725 INFO 11184 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''

修改默认配置。

# 默认的 8080 我们将它改成 9090 
server.port=9090
# 未定义上下文路径之前 地址是 http://localhost:8080 定义了后 http://localhost:9090 你能在tomcat做的事情,配置文件都可以
server.servlet.context-path=/chapter1

再启动一次看看日志。

2018-04-20 16:47:05.716 INFO 12108 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9090 (http) with context path '/chapter1'

测试

本次测试采用Junit 进行,当然也可以启动项目后直接访问 http://localhost:9090/chapter/demo1 进行测试。

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;
import java.net.URL;
import static org.junit.Assert.assertEquals;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class Chapter1ApplicationTests {
 @LocalServerPort
 private int port;
 private URL base;
 @Autowired
 private TestRestTemplate template;
 @Before
 public void setUp() throws Exception {
 // TODO 因为我们修改了 content-path 所以请求后面要带上
 this.base = new URL("http://localhost:" + port + "/chapter1/demo1");
 }
 @Test
 public void demo1() throws Exception {
 ResponseEntity<String> response = template.getForEntity(base.toString(), String.class);
 assertEquals(response.getBody(), "Hello battcn");
 }
}

拓展知识

自定义Banner

SpringBoot 启动的时候我们可以看到如下内容,这一块其实是可以自定义的哦,而且在 2.X 版本中,它支持的格式从文本扩展到 banner.txt、banner.jpg、banner.gif、banner.jpeg 等等,只需要在 resouces 目录下添加指定命名的文件即可。

 . ____ _ __ _ _
/\ / ___'_ __ _ _(_)_ __ __ _ 
( ( )___ | '_ | '_| | '_ / _` | 
 \/ ___)| |_)| | | | | || (_| | ) ) ) )
 ' |____| .__|_| |_|_| |___, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot :: (v2.0.1.RELEASE)

总结

目前很多大佬都写过关于 SpringBoot 的教程了,如有雷同,请多多包涵,本教程基于最新的 Spring-Boot-Starter-parent:2.0.1.RELEASE编写,包括新版本的特性都会一起介绍...

作者:唐亚峰 | battcn。分享技术、记录生活、专注 Spring Boot、Spring Cloud、微服务等技术分享,欢迎一起交流探讨。从零开始、以实战落地为主,不定期分享干货。漫漫架构之路,让我们一起见证!

本文系作者投稿,版权归作者所有。文章内容不代表CSDN立场。

征稿啦

CSDN 公众号秉持着「与千万技术人共成长」理念,不仅以「极客头条」、「畅言」栏目在第一时间以技术人的独特视角描述技术人关心的行业焦点事件,更有「技术头条」专栏,深度解读行业内的热门技术与场景应用,让所有的开发者紧跟技术潮流,保持警醒的技术嗅觉,对行业趋势、技术有更为全面的认知。

如果你有优质的文章,或是行业热点事件、技术趋势的真知灼见,或是深度的应用实践、场景方案等的新见解,欢迎联系 CSDN 投稿,联系方式:微信(guorui_1118,请备注投稿+姓名+公司职位),邮箱(guorui@csdn.net)。

相关推荐

Mysql和Oracle实现序列自增(oracle创建序列的sql)

Mysql和Oracle实现序列自增/*ORACLE设置自增序列oracle本身不支持如mysql的AUTO_INCREMENT自增方式,我们可以用序列加触发器的形式实现,假如有一个表T_WORKM...

关于Oracle数据库12c 新特性总结(oracle数据库19c与12c)

概述今天主要简单介绍一下Oracle12c的一些新特性,仅供参考。参考:http://docs.oracle.com/database/121/NEWFT/chapter12102.htm#NEWFT...

MySQL CREATE TABLE 简单设计模板交流

推荐用MySQL8.0(2018/4/19发布,开发者说同比5.7快2倍)或同类型以上版本....

mysql学习9:创建数据库(mysql5.5创建数据库)

前言:我也是在学习过程中,不对的地方请谅解showdatabases;#查看数据库表createdatabasename...

MySQL面试题-CREATE TABLE AS 与CREATE TABLE LIKE的区别

执行"CREATETABLE新表ASSELECT*FROM原表;"后,新表与原表的字段一致,但主键、索引不会复制到新表,会把原表的表记录复制到新表。...

Nike Dunk High Volt 和 Bright Spruce 预计将于 12 月推出

在街上看到的PandaDunk的超载可能让一些球鞋迷们望而却步,但Dunk的浪潮仍然强劲,看不到尽头。我们看到的很多版本都是为女性和儿童制作的,这种新配色为后者引入了一种令人耳目一新的新选择,而...

美国多功能舰载雷达及美国海军舰载多功能雷达系统技术介绍

多功能雷达AN/SPY-1的特性和技术能力,该雷达已经在美国海军服役了30多年,其修改-AN/SPY-1A、AN/SPY-1B(V)、AN/SPY-1D、AN/SPY-1D(V),以及雷神...

汽车音响怎么玩,安装技术知识(汽车音响怎么玩,安装技术知识视频)

全面分析汽车音响使用或安装技术常识一:主机是大多数人最熟习的音响器材,有关主机的各种性能及规格,也是耳熟能详的事,以下是一些在使用或安装时,比较需要注意的事项:LOUDNESS:几年前的主机,此按...

【推荐】ProAc Response系列扬声器逐个看

有考牌(公认好声音)扬声器之称ProAcTablette小音箱,相信不少音响发烧友都曾经,或者现在依然持有,正当大家逐渐掌握Tablette的摆位设定与器材配搭之后,下一步就会考虑升级至表现更全...

#本站首晒# 漂洋过海来看你 — BLACK&amp;DECKER 百得 BDH2000L无绳吸尘器 开箱

作者:初吻给了烟sco混迹张大妈时日不短了,手没少剁。家里有了汪星人,吸尘器使用频率相当高,偶尔零星打扫用卧式的实在麻烦(汪星人:你这分明是找借口,我掉毛是满屋子都有,铲屎君都是用卧式满屋子吸的,你...

专题|一个品牌一件产品(英国篇)之Quested(罗杰之声)

Quested(罗杰之声)代表产品:Q212FS品牌介绍Quested(罗杰之声)是录音监听领域的传奇品牌,由英国录音师RogerQuested于1985年创立。在成立Quested之前,Roger...

常用半导体中英对照表(建议收藏)(半导体英文术语)

作为一个源自国外的技术,半导体产业涉及许多英文术语。加之从业者很多都有海外经历或习惯于用英文表达相关技术和工艺节点,这就导致许多英文术语翻译成中文后,仍有不少人照应不上或不知如何翻译。为此,我们整理了...

Fyne Audio F502SP 2.5音路低音反射式落地音箱评测

FyneAudio的F500系列,有新成员了!不过,新成员不是新的款式,却是根据原有款式提出特别版。特别版产品在原有型号后标注了SP字样,意思是SpecialProduction。Fyne一共推出...

有哪些免费的内存数据库(In-Memory Database)

以下是一些常见的免费的内存数据库:1.Redis:Redis是一个开源的内存数据库,它支持多种数据结构,如字符串、哈希表、列表、集合和有序集合。Redis提供了快速的读写操作,并且支持持久化数据到磁...

RazorSQL Mac版(SQL数据库查询工具)

RazorSQLMac特别版是一款看似简单实则功能非常出色的SQL数据库查询、编辑、浏览和管理工具。RazorSQLformac特别版可以帮你管理多个数据库,支持主流的30多种数据库,包括Ca...

取消回复欢迎 发表评论: