本章不涉及具体的开发工作,主要是告知你在创建初始化目标项目的过程中如何设置重点选项参数以及选择哪些依赖。
1.1 创建新的项目
1.1.1 项目基本设置
在IDEA中执行创建新项目,SDK版本选择11(关于JDK 11的安装请阅读本知识库中关于基础开发环境准备的内容):
下面是新项目的设置内容:
Group | com.longser.union |
---|---|
Artifact | cloud |
Type | Maven Project |
Language | Java |
Packaging | War |
Java Version | 11 |
Version | 1.0.0 |
Name | cloud |
Description | Union Member Management |
Package | com.longser.com.union.cloud |
1.1.2 项目依赖内容
在Developer Tools类别下选择Lombok和Spring Configuration Processor
在Web类别下选择Spring Web和Spring Session
在SQL类别下选择MyBatis Framework和MariaDB Driver
在I/O类别下选择Java Mail Sender
1.1.3 选择目录
1.2 项目依赖解析
打开pom.xml,一起来看看Spring Boot项目的依赖
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.longser.union</groupId>
<artifactId>cloud</artifactId>
<version>1.0.0</version>
<packaging>war</packaging>
<name>cloud</name>
<description>Union Member Management</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-core</artifactId>
</dependency>
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<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>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
如上所示,主要有四个部分:
- 项目元数据:创建时候输入的Project Metadata部分,也就是Maven项目的基本元素,包括:groupId、artifactId、version、name、description等
- parent:继承spring-boot-starter-parent的依赖管理,控制版本与打包等内容
- dependencies:项目具体依赖,这里包含了spring-boot-starter-web用于实现HTTP接口(该依赖中包含了Spring MVC);spring-boot-starter-test用于编写单元测试的依赖包。更多功能模块的使用我们将在后面的教程中逐步展开。
- build:构建配置部分。默认使用了spring-boot-maven-plugin,配合spring-boot-starter-parent就可以把Spring Boot应用打包成JAR(或War)。
1.3 项目工程结构
因为Spring Boot只是方便你快速搭建应用并跑起来,它没有指定必须的目录结构。而你选择的底层技术(各种starter)多种多样,有时候甚至没有数据存储操作。例如很多 Spring Cloud 的微服务应用,业务逻辑就没有数据持久化的操作,可能只是文件读取、也可能只是调用别的微服务提供的服务。1.3.1 官方工程目录
尽管Spring Boot框架本身并没有对工程结构有特别的要求,但是按照最佳实践的工程结构可以帮助我们减少可能会遇见的坑,尤其是Spring包扫描机制的存在,如果您使用最佳实践的工程结构,可以免去不少特殊的配置工作。
下图是Spring Boot初始化工具创建的的基础结构
如上图所示共三个文件(具体路径根据用户生成项目时填写的Group所有差异):
- src/main/java下的程序入口 CloudApplication 和 ServletInitializer(由于在生成的过程中我们选择Packaging 为 War,生成的代码中多了一个ServletInitializer类,它使得编译后的代码能够以Servlet的方式运行)。
- src/main/resources下的配置文件 application.properties
- src/test/下的测试入口CloudApplicationTests
生成的CloudApplication和CloudApplicationTests类都可以直接运行来启动当前创建的项目,由于目前该项目未配合任何数据访问或Web模块,程序会在加载完Spring之后结束运行。
更进一步的,Spring Boot官方文档在Locating the Main Application Class给出下面目录结构:
com
+- example
+- myapplication
+- MyApplication.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java
Application.java在默认的根包(com.example.myapplication)路径下,把某一个业务相关的类都放在一个目录下。
例如Order.java是JPA @Entity,OrderController.java是一个@Controller,OrderService.java是一个@Service,OrderRepository.java是一个Spring Data 的@Repository,它们都是也Order业务相关的。customer目录也是一样的。
1.4.2 常规实践约定
上面这种目录结构也只适用于小型工程。在大中型工程里,往往是把某一种@Component(@ Repository @Service @Controller 其实都只是某一种类型的@Component),放到一个目录里。
在大中型工程项目中,通常根据MVC的分层设计原理来定义工程结构:
Model层(Entity层)
即数据库实体层,也被称为Entity层、POJO(Plain Old Java Object)层,存放的是实体类数据模型,属性值与数据库中的属性值保持一致。 实现setter和getter方法。一般数据库一张表对应一个实体类,类属性同表字段一一对应。DAO(Data Access Object)层(Mapper层)
即数据持久层,也被称为mapper层,实现对数据做持久化操作。DAO层的作用为访问数据库,向数据库发送SQL语句,完成数据的增删改查等任务,通常每个方法功能都很纯粹,比如根据数据ID查询数据、存入一条数据等方法。Service层(业务层)
即业务服务层,作用为完成功能设计。存放业务逻辑处理,不直接对数据库进行操作,有接口和接口实现类,实现供Controller层调用的方法、调用DAO层接口、接收DAO层返回的数据,完成项目的基本功能设计。也就是说对于项目中的功能的需求就是在这里完成的。
有的设计会在Service 层定义业务逻辑的处理接口,然后在其下创建一个Service实现层(serviceImpl层), 完成service的接口实现。这么设计的理由是要便于规范和限制,但对于很多项目来说并不必要。Controller层(控制层)
即控制器层,Controller层的功能为请求和响应控制。Controller层负责前后端交互,接受前端请求,调用Service层,接收Service层返回的数据,最后返回具体的页面和数据到客户端。
1.4 应用配置文件
1.4.1 关于配置文件格式
Spring Boot针对我们常用的开发场景提供了一系列自动化配置(默认配置)来减少原本复杂而又几乎很少改动的模板化配置内容。但我们还是需要去了解如何在Spring Boot中修改这些自动化的配置内容,以应对一些特殊的场景需求,比如我们在同一台主机上需要启动多个基于Spring Boot的web应用或者默认端口已经被其他服务占用,若我们指定特别的端口号则必将导致冲突。
Spring Boot默认的应用配置文件为 src/main/resources/application.properties,关于Spring Boot应用的配置内容都可以集中在该文件中,根据我们引入的不同Starter模块,可以在这里定义诸如容器端口名、数据库链接信息、日志级别等各种配置信息。下面就是一段配置信息的示例:
server.port=8088
server.servlet.context-path=/cloud
server.tomcat.uri-encoding=utf-8
Spring Boot的配置文件除了可以使用传统的properties文件之外,还支持现在被广泛推荐使用的YAML文件。
YAML(英语发音:/ˈjæməl/,尾音类似camel骆驼)是一个可读性高,用来表达资料序列的格式。YAML参考了其他多种语言,包括:C语言、Python、Perl,并从XML、电子邮件的数据格式(RFC 2822)中获得灵感。YAML是”YAML Ain’t a Markup Language”(YAML不是一种标记语言)的递回缩写。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重新命名。AML的语法和其他高阶语言类似,并且可以简单表达清单、散列表,标量等资料形态。它使用空白符号缩排和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种设定档、倾印除错内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。其让人最容易上手的特色是巧妙避开各种封闭符号,如:引号、各种括号等,这些符号在巢状结构时会变得复杂而难以辨认。
下面是上文的配置信息在YAML文件中的的写法:
server:
port: 8088
servlet:
context-path: /cloud
tomcat:
uri-encoding: utf-8
可以看到,YAML的配置信息利用阶梯化缩进的方式展现了一种树型结构,更为清晰易读也更加简洁,需要输入的字符量也得到显著的减少。但对于新手而言它有几个特别死板而又容易犯错的规定需要熟知:
(1)不同等级用冒号隔开,次等级前只能用空格,不能用制表符tab,如server.tomcat.uri-encoding=utf-8配置项中,server作为第一级、tomcat作为第二级、uri-encoding为第三极。
(2)如果冒号后是值,则必须用一个空格将冒号和值隔开。
(3)YAML对字符的大小写是敏感的。
我们在接下来的教程中使用YAML格式的应用配置文件。
1.4.2 编写应用配置文件
首先,删除src/main/resources/application.properties文件。然后创建src/main/resources/config目录,在改目录中创建新的应用配置文件 application.yml 并复制如下内容:
server:
port: 8088
servlet:
encoding:
force: true
charset: UTF-8
enabled: true
tomcat:
uri-encoding: UTF-8
spring:
profiles:
# 可以是任何自己定义的字符串,通常定义 dev、prod、test分别代表开发、生产、测试
active: dev
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mysql://
如注释中的所说的,这里的 active 可以是任何自己定义的字符串,通常人们喜欢使用 dev、prod、test分别代表开发环境、生产环境、和测试环境。这个值的具体用法在后面的教程会讲述。
此时点击右上角的运行图标
可以在控制台信息中心看到如下的信息
也就是内嵌的Tomcat已经按照我们的配置要求守候在8088
的端口。
提示:上述的配置仅为示意,尤其数据源部分并未配置完整(不配置会出错)
版权说明:本文由北京朗思云网科技股份有限公司原创,向互联网开放全部内容但保留所有权力。