Spring Boot 学习笔记

参考资料

Spring Boot简介

Spring Boot使创建基于Spring的应用程序变得轻松,只需要做到“just run”就能创建一个独立的、产品级别的Spring应用程序。官方为Spring平台及第三方库提供了相对固定的搭配,所以开始的时候会轻松很多。大部分的SpringBoot应用程序都只需要很少的Spring配置。

可以使用SpringBoot创建应用程序,通过java -jar命令或者传统的war包部署方式来启动它。也提供了一个命令行工具来运行“spring脚本”。

SpringBoot的目标是:

  • 从根本上提供更加快速和简便的Spring开发体验。
  • 开箱即用,但定制开发也很便捷。
  • 提供一些大型项目常用的非功能性特性(例如:嵌入式服务、安全、监控、健康检查、外部配置)。
  • 不用生成代码,没有xml配置。

使用Maven进行配置

Spring Boot依赖的groupId是org.springframework.boot。通常情况下,MavenPOM文件继承自spring-boot-starter-parent项目,并且声明一些“Starters”。Spring Boot也提供了一些创建可执行jar文件的Maven插件。

继承spring-boot-starter-parent项目是不错的使用Spring Boot的方式,但是有时候可能还是有不适配的问题。有些时候您可能需要继承子不同的父POM,或者仅仅是和我们的默认配置有所区别。查看Section 13.2.2,“Using Spring Boot without the parent POM”,这是使用了导入方式的一种解决方案。

经典的pom.xml文件

<?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.example</groupId>
    <artifactId>myproject</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.2.RELEASE</version>
    </parent>
    
    <dependencies>
		<!--web应用基本环境配置 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
	</dependencies>
</project>

java代码

import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;

@SpringBootApplication
public class MainApplicion {

	public static void main(String[] args) throws Exception {
		SpringApplication.run(MainApplicion.class,"--server.port=8081");
	}

}
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;

@Controller
public class SampleController {

	@ResponseBody
	@RequestMapping(value = "/")
	String home() {
		return "Hello World!";
	}

}

运行

直接执行main方法。

或者生成可执行的jar包,如果要生成可执行的jar包,需要把spring-boot-maven-plugin添加到pom.xml

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

打包mvn package,运行java -jar target/myproject-0.0.1-SNAPSHOT.jar

打开浏览器http://localhost:8081/,即可看到Hello World!

附:不使用parent POM的配置方式

<dependencyManagement>
     <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.5.2.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

使用Spring Boot CLI

介绍

Spring Boot CLI是一个命令行工具,如果想要快速获取一个Spring样品程序,可以使用到它。Spring Boot CLI是一个命令行工具,如果想要快速获取一个Spring样品程序,可以使用到它。有了它,您可以运行Groovy脚本,这意味着您可以使用熟练的类Java语法,而不是超多的样板代码。

使用CLI这个命令行工具来做Spring Boot开发并不是必须的,但它确实是一个开发Spring应用程序最快捷的方式。

下载地址

http://repo.spring.io/snapshot/org/springframework/boot/spring-boot-cli/

使用

windows的话,下载解压即可。

快速开始Spring CLI实例

新建一个文件,文件名是app.groovy:

@RestController
class ThisWillActuallyRun {

    @RequestMapping("/")
    String home() {
        "Hello World!"
    }

}

运行

spring run app.groovy

打开浏览器http://localhost:8080,即可看到Hello World!

使用 @SpringBootApplication注解

许多使用Spring Boot的开发者总是有带有@Configuration,@EnableAutoConfiguration 和 @ComponentScan 注解的主类。由于这些注解很频繁地被用在一起,基于最佳实践,Spring Boot提供了一个方便的注解@SpringBootApplication 来替代。

@SpringBootApplication 等价于使用@Configuration,@EnableAutoConfiguration 和 @ComponentScan默认属性的情况。

Starters

Starters是Spring boot提供的便利,可以一站式的对依赖进入引入,命名格式为“spring-boot-starter-*”,如“spring-boot-starter-test”则集成了JUnit跟Mockito,用于跑测试用例。

开发工具

Spring Boot 包含一系列工具,可以使应用开发的过程更方便一点。spring-boot-devtools模块可以包含进任何工程,用来提供额外的程序调试特性。为了添加工具支持,简单的添加模块依赖到你的构建系统中:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

当classpath中的文件修改时,使用spring-boot-devtools的应用会自动重启。当使用IDE开发时,这是一个很有用的功能,因为代码改变时它能快速的进行反馈。默认情况下,会监控classpath指向的文件夹中任何条目的变化。注意某些资源例如静态资源和视图模板不需要重启应用。作为DevTools监视器classpath中的资源,触发重启的唯一方式是更新classpath。

Spring Boot 提供的restart技术是通过两个类加载器进行工作的。加载进基类加载器的类不能改变(例如,那些第三方jar包)。那些你正在开发的类加载进重启类加载器中。当应用重启时,丢弃旧的重启类加载器并创建一个新的。这种方法意味着应用重启是比“cold starts” 更快,因为基类加载器已经存在并可用。

某些资源当它们改变时不一定需要触发重启。默认不触发重启的有/META-INF/maven,/META-INF/resources,/resources,/static,/public or /templates。修改默认行为,可修改配置spring.devtools.restart.exclude=static/**,public/**;如果是在默认的基础上进行添加不触发行为,可使用spring.devtools.restart.additional-exclude

启动失败

如果你的应用启动失败,注册FailureAnalyzers有可能会提供专门的错误信息和解决这个问题的具体行动。例如,如果你启动一个8080端口的web应用并且这个端口已经被占用,你应该会看到类似于下面的内容:

***************************
APPLICATION FAILED TO START
***************************

Description:

Embedded servlet container failed to start. Port 8080 was already in use.

Action:

Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.

如果没有任何失败分析器的话,可以开启debug(默认的
日志级别是INFO),属性名为“org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer”,如果是通过java -jar运行的,还可以使用--debug进行开启,如java -jar myproject-0.0.1-SNAPSHOT.jar --debug

自定义Banner

默认情况下,Spring Boot的打印内容如下

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

如果要修改,可在classpath下创建一个文件,名称为“banner.txt”,编写自己要的内容即可。

关闭banner

public static void main(String[] args) {
    SpringApplication app = new SpringApplication(MySpringConfiguration.class);
    app.setBannerMode(Banner.Mode.OFF);
    app.run(args);
}

应用事件与监听器

在ApplicationContext创建之前实际上会触发一些事件,因此你不能使用@Bean来注册这些监听器。你可以通过SpringApplication.addListeners()SpringApplicationBuilder.listeners()来注册这些监听器。
如果你想自动注册这些监听器,不管上下文的创建方式,你可以在你的工程中添加META-INF/spring.factories文件,并通过org.springframework.context.ApplicationListener作为key来引用你的监听器。

当应用运行时,运用的发送顺序

  1. ApplicationStartingEvent
  2. ApplicationEnvironmentPreparedEvent
  3. ApplicationPreparedEvent
  4. ApplicationReadyEvent
  5. ApplicationFailedEvent

web环境

SpringApplication将试图创建一个正确类型的ApplicationContext。如果是web应用,创建一个AnnotationConfigEmbeddedWebApplicationContext ,否则创建一个AnnotationConfigApplicationContext

访问应用参数

启动应用时,我们会通过SpringApplication.run(args)添加启动参数args,我们可通过注入org.springframework.boot.ApplicationArguments来获取启动参数。

在应用启动过程中做一些事

实现ApplicationRunnerCommandLineRunner接口。

应用退出拦截

使用@PreDestroy注解或实现org.springframework.boot.ExitCodeGenerator接口

可变配置

可通过“application.properties”(或YAML 变量)对默认配置进行修改。

通过命令行对配置进行修改,即SpringApplication.run(MainApplicion.class,args)中的args参数,如--server.port=9000则启动端口变成了9000。

配置随机数

my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}

把配置文件中的配置绑定到Bean中,可使用@value,还可以使用@ConfigurationProperties,如下

my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com
@ConfigurationProperties(prefix="my")
public class Config {

    private List<String> servers = new ArrayList<String>();

    public List<String> getServers() {
        return this.servers;
    }
}

profile(不同环境读取不同配置)

不同环境的配置设置一个配置文件,例如:dev环境下的配置配置在application-dev.properties中;pro环境下的配置配置在application-pro.properties中。

各个环境公共的配置写在application.properties中。

各个模块独有的配置配置在自己的application-{xxx}.properties文件中。

指定某一环境运行,使用spring.profiles.active进行配置

SpringApplication.run(MainApplicion.class,"--spring.profiles.active=dev");

日志

说明

默认日志框架是“Commons Logging”,但如果是用“Starters”,那么默认日志框架是“Logback”

默认打印级别是INFO,若要开启,有两种方式

java -jar myapp.jar --debug

在application.properties中添加debug=true

文件输出

默认是只打打印在控制台上,不输出到文件,可配置。

可在application.properties中配置logging.filelogging.path

日志级别

格式:logging.level.*=LEVEL,LEVEL的取值有(TRACE,DEBUG,INFO,WARN,ERROR,FATAL,OFF)

自定义日志格式

根据不同的日志框架,编写不同的配置文件

Logging System Customization
Customization logback-spring.xml,logback-spring.groovy,logback.xml or logback.groovy
Log4j2 log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging) logging.properties

开发web应用

Spring MVC框架

使用HttpMessageConverter转换HTTP中的requests 和 responses

使用@JsonComponent注解来实现JSON的序列号跟反序列化

import java.io.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import org.springframework.boot.jackson.*;

@JsonComponent
public class Example {

    public static class Serializer extends JsonSerializer<SomeObject> {
        // ...
    }

    public static class Deserializer extends JsonDeserializer<SomeObject> {
        // ...
    }

}

静态资源

默认配置的 /** 映射到 /static (或/public、/resources、/META-INF/resources),上面的 static、public、resources 等目录都在 classpath: 下面(如 src/main/resources/static)。

优先级顺序为:META/resources > resources > static > public

如:src/main/resources/static/js/test.js的访问路径为http://localhost:8080/js/test.js

注意:不要使用src/main/webapp文件夹,因为打成jar包时,这个文件夹不会被打包进去。

当我们的资源内容发生改变时,由于浏览器缓存,用户本地的资源还是旧资源,为了防止这种情况发生导致的问题。Spring在解决这种问题方面,提供了2种解决方式:资源名称md5方式、资源名称md5方式。

错误处理

自定义错误页面

src/
 +- main/
     +- java/
     |   + <source code>
     +- resources/
         +- static/
             +- error/
             |   +- 404.html
             |   +- 5xx.ftl
             +- <other public assets>

嵌入的Servlet容器支持

可使用@WebServlet,@WebFilter,@WebListener注解,还有@ServletComponentScan注解扫描来支持Servlet、Filter、Listener

JSP支持

可参考代码:https://github.com/spring-projects/spring-boot/tree/v1.5.2.RELEASE/spring-boot-samples/spring-boot-sample-web-jsp

1、打包方式需要改成war。

2、添加必要的依赖

<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>jstl</artifactId>
</dependency>
<!-- Provided -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-tomcat</artifactId>
	<scope>provided</scope>
</dependency>
<dependency>
	<groupId>org.apache.tomcat.embed</groupId>
	<artifactId>tomcat-embed-jasper</artifactId>
	<scope>provided</scope>
</dependency>

3、新建文件夹src/main/webapp/WEB-INF/jsp/

4、application.properties文件添加配置

spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp

5、创建Controller跟jsp文件

其他特性

  • Security
  • SQL databases
  • NoSQL technologies
  • Caching
  • Messaging
  • Validation
  • Sending email
  • JTA
  • JMX
  • Testing

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍了spring的事务传播属性REQUIRED_NESTED的原理介绍,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。传统事务中回滚点的使...
今天小编给大家分享的是一文解析spring中事务的传播机制,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
这篇文章主要介绍了SpringCloudAlibaba和SpringCloud有什么区别,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。Spring Cloud Netfli...
本篇文章和大家了解一下SpringCloud整合XXL-Job的几个步骤。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。第一步:整合pom文件,在S...
本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。List 坑列表 = new ArrayList(2);...
这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓存的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇...
本篇内容主要讲解“Spring中的@Autowired和@Resource注解怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学...
今天小编给大家分享一下SpringSecurity怎么定义多个过滤器链的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家
这篇文章主要介绍“Spring的@Conditional注解怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring的@Con...
这篇文章主要介绍了SpringCloudGateway的熔断限流怎么配置的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringCloud&nb...
今天小编给大家分享一下怎么使用Spring解决循环依赖问题的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考
这篇文章主要介绍“Spring事务及传播机制的原理及应用方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Sp...
这篇“SpringCloudAlibaba框架实例应用分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价
本篇内容主要讲解“SpringBoot中怎么使用SpringMVC”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习...
这篇文章主要介绍“SpringMVC适配器模式作用范围是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringMVC
这篇“导入SpringCloud依赖失败如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家...
这篇文章主要讲解了“SpringMVC核心DispatcherServlet处理流程是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来
今天小编给大家分享一下SpringMVCHttpMessageConverter消息转换器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以...
这篇文章主要介绍“Spring框架实现依赖注入的原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring框架...
本篇内容介绍了“Spring单元测试控制Bean注入的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下