问题:
J2EE笨重的开发、繁多的配置、低下的开发效率、复杂的部署流程、第三方技术集成难度大。
Spring Boot简介
简化Spring应用开发的一个框架;
整个Spring技术栈的一个大整合;
J2EE开发的一站式解决方案;
解决:
“Spring全家桶”时代。(整个Spring技术栈的一个大整合)
Spring Boot J2EE一站式解决方案
Spring Cloud 分布式整体解决方案
优点:
– 快速创建独立运行的Spring项目以及与主流框架集成
– 使用嵌入式的Servlet容器,应用无需打成WAR包
– starters自动依赖与版本控制
– 大量的自动配置,简化开发,也可修改默认值
– 无需配置XML,无代码生成,开箱即用
– 准生产环境的运行时应用监控
– 与云计算的天然集成
缺点:
入门容易,精通难
搭建Spring Boot项目
准备环境
–jdk1.8:Spring Boot 推荐jdk1.7及以上; java version "1.8.0_201"
–maven3.x:maven 3.3以上版本;Apache Maven 3.6.1
–IntelliJIDEA2017:IntelliJ IDEA 2019 x64、STS
–SpringBoot 2.3.4.RELEASE:2.3.4;(SNAPSHOT快照版还在开发中、RELEASE发布版稳定版本)
1.新建Spring Boot项目
使用IDEA创建项目模块
在Module窗口中,选择左侧菜单中的“Spring Initializr”,选择Module SDK为JDK1.8,再点击“Next”按钮
点击next时可能会出现的问题
使用Maven进行项目构建,需要根据需求设置Maven坐标,设置项目的构建方式和打包方式,设置完成后单击“Next”按钮
选择依赖的Spring Boot版本和组件。选择Spring Boot版本为2.1.5。除了选择版本之外,Spring Boot还提供了很多可供选择的组件,这里由于要搭建Web项目,选择与Web项目相关的组件。单击Next按钮
设置项目名称和项目的存储位置,但是“Finish”按钮,完成一个Spring Boot项目的构建操作
创建完成的Spring Boot项目的结构如图所示:
2.编写java代码
打开Spring Boot项目src/main/java目录,在此目录的包下创建controller包,并在该包中创建控制器类SayHelloController,如图:
3.启动并测试
现在可以启动项目进行测试了
项目启动完成后,打开浏览器,访问http://localhost:8080/sayHello
Spring Boot项目的三个核心文件
Spring Boot的三个核心文件(pom、启动类、application.properties)非常重要,这三个文件是Spring Boot能健康运行的关键
1.pom文件
注意:
由于咱们在创建SpringBoot项目时,选择的是加入Web组件,所以pom文件<dependencies>中的第一个依赖是spring-boot-starter-web。在不选择添加任何组件的情况下,pom文件<dependencies>中的第一个组件则会是spring-boot-starter。
2.启动类
/**
* @SpringBootApplication 来标注一个主程序类,说明这是一个SpringBoot应用
*/
@SpringBootApplication
public class Ch02Springboot1Application {
public static void main(String[] args) {
//Spring 应用启动起来
SpringApplication.run(Ch02Springboot1Application.class, args);
}
}
@SpringBootApplication:SpringBoot应用标注在某个类上说明这个类是SpringBoot的主配置类,
SpringBoot就应该运行这个类的main方法来启动SpringBoot应用;
@SpringBootApplication注解是一个组合注解,它是由多个注解组合而成的注解;按住Ctrl键,单击@SpringBootApplication注解,可进入源码
@Target({ElementType.TYPE}) //java提供的注解
@Retention(RetentionPolicy.RUNTIME) //java提供的注解
@Documented //java提供的注解
@Inherited //java提供的注解
@SpringBootConfiguration //SpringBoot提供的注解
@EnableAutoConfiguration //SpringBoot提供的注解
@ComponentScan( //Spring提供的注解
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@SpringBootConfiguration:SpringBoot的配置类;标注在某个类上,表示这是一个SpringBoot的配置类。
可替换Spring的applicationContext.xml配置文件,被注解的类内部可以包含有一个或多个被@Bean注解标注的方法,这些方法会被Spring的系统类扫描,并用于构建Bean定义,初始化Spring容器。
@EnableAutoConfiguration:开启自动配置功能;
以前我们需要配置的东西,Spring Boot帮我们自动配置;@EnableAutoConfiguration告诉SpringBoot开启自动配置功能;这样自动配置才能生效
@ComponentScan:扫描启动类同目录及子目录下的所有注解,使这些注解生效
3.application.properties / application.yml
spring-boot-starter-parent中可以识别一些特定名称的文件,其中application.properties文件是SpringBoot项目的配置文件,关于SpringBoot项目的大部分配置信息可以在此文件中进行编写。需要注意,此文件必须在项目的resources资源路径的根路径下。
application.properties文件
application.properties文件是SpringBoot项目能自定识别的文件,而且SpringBoot的大部分配置信息可以在此文件中编写。
SpringBoot项目默认启动的端口号是8080。如何修改?
就是在application.properties文件中添加配置。server.port=8082
启动项目时,观察日志信息如图;可以发现现在的端口号已经变成8082了,说明端口号修改成功了。
除了修改端口号之外,还可以在application.properties文件中修改项目的访问路径和一些与日志相关的简单配置。
# 端口号
server.port=8082
# 配置项目的访问路径 http://localhost:8082/ch02/....
server.servlet.context-path=/ch02/
# 配置日志的输出路径
# 在电脑的D:\logs路径下生成一个名为spring.log的日志文件。
# spring.log是当没有指定日志文件名时,SpringBoot默认设定的一个名称
# logging.file.path=D:/log
logging.file.path=D:\\logs
# 绝对路径 手动指定日志的输出文件名 logging.file.name=D:\\logs\\日志文件名.log
# logging.file.name=D:\\logs\\abc.log
# 相对路径 只写文件名时,系统会以当前项目所在的盘符根路径作为起始目录,创建同名日志文件
logging.file.name=abc.log
# 注意:logging.file.path和logging.file.name无法配合使用,
# 当两者同时配置时,只有logging.file.name生效
# 配置日志的输出格式 %d-%msg%n表示指定日志的输出格式为日期+日志内容+换行
logging.pattern.file=%d-%msg%n
application.yml文件
在Spring Boot项目中,除了使用application.properties文件进行配置以外,还可以使用application.yml文件。
application.yml属于YAML类型的文件,可以更直观地配置项目信息。如图:
YAML 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。
以前的配置文件;大多都使用的是 xxxx.xml文件;
YAML:以数据为中心,比json、xml等更适合做配置文件;
YAML:配置例子
server: port: 8081
XML:
<server> <port>8081</port> </server>
YAML语法
– 使用缩进表示层级关系
– 缩进时不允许使用Tab键,只允许使用空格。
– 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
– 大小写敏感
server:
port: 8083
servlet:
context-path: /ch2/
logging:
file:
#path: D:\\logs #会在D:\logs路径下生成一个名为spring.log的日志文件
#name: abc.log #系统会以当前项目所在的盘符根路径作为起始目录,创建同名日志文件
name: D:\\logs\\abc.log #绝对路径 D:\logs路径下生成abc.log文件
pattern:
file: '%d-%msg%n' # yml格式配置日志输出格式识别不了%,应将值用单引号引起来
#file: '%d{yyyy-MM-dd hh:mm:ss} [%thread] %-5level %logger{50} - %msg%n'
Spring Boot的Web项目的启动方式
Web项目一般需要部署到Web容器中运行,Spring Boot项目也不例外。但是上述的案例启动并没有进行部署,直接通过运行启动类就将项目启动了。原因是:Spring Boot项目自动完成了部署,部署到了Tomcat中。
Spring Boot项目中会内置Web容器,默认的内置Web容器是Tomcat,当然也可以通过修改pom.xml文件来替换它的内置Web容器。
Spring Boot支持3中内置容器:Tomcat、Jetty和Undertow。
下面以Jetty为例,如何将默认的内置容器Tomcat修改为Jetty
第一步:修改pom.xml文件,添加如下的配置,此配置的作用是禁用当前的Tomcat容器
<!--此配置的作用是禁用当前的Tomcat容器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
第二步:添加与Web容器Jetty相关的依赖
<!--添加与Web容器Jetty相关的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
第三步:启动项目查看启动日志
如何将默认的内置容器Tomcat修改为Undertow
<!--此配置的作用是禁用当前的Tomcat容器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--添加与Web容器Undertow相关的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
SpringBoot项目除了使用内置的Web容器启动外,还有其他多种启动方式:
第一种:在本地Web容器中启动
通过Maven将项目打包成war文件,将war文件拷贝至本地Web容器中部署运行
1.首先打开pom文件,将原有的jar(默认为jar)修改为war
2.然后将启动类继承SpringBootServletInitializer,重写configure方法
3.然后去运行【package】进行打包
4.然后把target目录下的war包放到tomcat的webapps目录下,启动tomcat,即可自动解压部署。最后在浏览器中输入http://localhost:[端口号]/[打包项目名]/
第二种:使用Maven启动项目
进入项目根路径,执行 mvn spring-boot:run 命令
使用命令行的形式/DOS窗口
使用IEDA的Terminal
第三种:使用Java命令启动项目
通过Maven将项目打包成jar文件,进入jar文件所在目录,使用 java -jar 命令运行jar文件
java -jar 生成jar的文件名.jar
使用命令行的形式/DOS窗口
使用IEDA的Terminal
Maven的多模块项目
问题:复杂、庞大的企业级项目,开发和部署过程存在多种问题
结构不够清晰,开发人员不易定位自己负责的模块
项目庞大导致启动费时
部署时无法按模块需要分配资源,造成资源的浪费
解决方案:Maven提出多模块项目的方案
将一个大项目拆分成多个小的模块项目
拆分后的模块项目任务明确,耦合度低,方便管理和维护
演示案例
第一步:创建Maven父模块
1.左侧面板选择maven(不要选择Create from archetype选项),如下图,点击Next即可
2.依次补全如下信息,点击Next
3.输入项目名字。如ch02_parent,我们主要是在这个项目下创建我们的子模块
4.这样我们就创建好了一个普通项目,因为该项目是作为一个Parent project存在的,不需要编写任何代码,可以直接删除src文件夹
第二步:创建子模块,通常按职责划分子模块
beans:存放实体类
common:存放工具类、枚举类等项目中的核心类
dao:存放数据访问层代码
service:存放业务层代码
controller:存放控制器层代码
1.在父模块上右键如下图操作,创建一个模块,该模块即为子模块
2.同样不选择Create from archetype选项,因为是普通模块,Next
3.groupId和version继承自Parent project,这里只用ArtifactId,Next
4.填写模块名称
5.创建完成后结构如下图
6.按照同样的方式创建,依次创建common、dao、service模块项目
7.创建controller模块的方式有所区别
7.1-使用maven-archetype-webapp创建一个Web项目
7.2-groupId和version继承自Parent project,这里只用ArtifactId,Next
7.3-设置maven项目的属性
7.4-填写模块名称
第三步:配置模块之间的依赖
Maven的依赖有两个特点:继承和传递
继承:即当B项目依赖A项目时,B项目可继承A项目引入的全部依赖。除了这种情形外,在多模块项目中,子模块和父模块之间也存在继承关系,这类似于java中的继承关系,即子模块会继承父项目中的全部依赖。
传递:即当B项目依赖A项目,C项目依赖B项目时,C项目除了可以继承B项目引入的依赖之外,还会继承A项目引入的依赖。
在多模块项目中,子模块继承父项目,所以可以在父项目中统一管理通用的依赖,比如Log4j、Junit这种每个项目都会用到的依赖。又由于Maven的依赖是传递的,所以子模块之间可以直接线性依赖,即controller依赖service,service依赖dao,dao依赖common,common依赖beans,这样controller中需要调用beans中的实体类时,也可以顺利调用。模块依赖关系如图:
问题:
对于只是部分子模块会用到的依赖,不会放到父项目中
而由子模块分别引入某个依赖,可能产生版本不一致的问题
解决方案:
在父项目的pom文件中使用<dependencyManagement>标签管理依赖的版本号
<dependencyManagement>
<dependencies>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
</dependencyManagement>
在父项目中添加了上面的示例代码后。
子模块中引入commons-logging依赖不需要指定版本号,版本号都是1.1.1。
子模块不需要commons-logging依赖的,则不会引入commons-logging依赖。这样就避免了版本冲突的问题。
此时,如果对父项目进行Maven的操作,子模块也会进行同样的操作。即当对父项目打包时,所有的子项目都会打包。这种通过父项目来操作子项目进行Maven操作的情形,就叫聚合。
注意:使用聚合时,父项目的pom文件中packaging都是pom。
使用Spring Initializr创建的Spring Boot项目也是Maven项目;可以使用Spring Initializr创建多模块项目,此时的每个模块都是Spring Boot项目\