Spring Boot概述

发布于:2022-12-29 ⋅ 阅读:(431) ⋅ 点赞:(0)

问题:

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时可能会出现的问题

 解决方案:   Initialization failed for 'https://start.spring.io' Please check URL, network and proxy settings._流烟默的博客-CSDN博客

使用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项目\

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到