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来引用你的监听器。
当应用运行时,运用的发送顺序
- ApplicationStartingEvent
- ApplicationEnvironmentPreparedEvent
- ApplicationPreparedEvent
- ApplicationReadyEvent
- ApplicationFailedEvent
web环境
SpringApplication
将试图创建一个正确类型的ApplicationContext
。如果是web应用,创建一个AnnotationConfigEmbeddedWebApplicationContext
,否则创建一个AnnotationConfigApplicationContext
。
访问应用参数
启动应用时,我们会通过SpringApplication.run(args)
添加启动参数args,我们可通过注入org.springframework.boot.ApplicationArguments
来获取启动参数。
在应用启动过程中做一些事
实现ApplicationRunner
或CommandLineRunner
接口。
应用退出拦截
使用@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.file
或 logging.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支持
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
Spring Boot 学习笔记的更多相关文章
- Spring Boot学习笔记2——基本使用之最佳实践[z]
前言 在上一篇文章Spring Boot 学习笔记1——初体验之3分钟启动你的Web应用已经对Spring Boot的基本体系与基本使用进行了学习,本文主要目的是更加进一步的来说明对于Spring B ...
- Spring Boot 学习笔记(六) 整合 RESTful 参数传递
Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...
- Spring Boot 学习笔记1——初体验之3分钟启动你的Web应用[z]
前言 早在去年就简单的使用了一下Spring Boot,当时就被其便捷的功能所震惊.但是那是也没有深入的研究,随着其在业界被应用的越来越广泛,因此决定好好地深入学习一下,将自己的学习心得在此记录,本文 ...
- Spring Boot 学习笔记1---初体验之3分钟启动你的Web应用
前言 早在去年就简单的使用了一下Spring Boot,当时就被其便捷的功能所震惊.但是那是也没有深入的研究,随着其在业界被应用的越来越广泛,因此决定好好地深入学习一下,将自己的学习心得在此记录,本文 ...
- Spring Boot 学习笔记--整合Thymeleaf
1.新建Spring Boot项目 添加spring-boot-starter-thymeleaf依赖 <dependency> <groupId>org.springfram ...
- 我的第一个spring boot程序(spring boot 学习笔记之二)
第一个spring boot程序 写在前面:鉴于spring注解以及springMVC的配置有大量细节和知识点,在学习理解之后,我们将直接进入spring boot的学习,在后续学习中用到注解及其他相 ...
- Java框架spring Boot学习笔记(六):Spring Boot事务管理
SpringBoot和Java框架spring 学习笔记(十九):事务管理(注解管理)所讲的类似,使用@Transactional注解便可以轻松实现事务管理.
- Spring Boot学习笔记---Spring Boot 基础及使用idea搭建项目
最近一段时间一直在学习Spring Boot,刚进的一家公司也正好有用到这个技术.虽然一直在学习,但是还没有好好的总结,今天周末先简单总结一下基础知识,等有时间再慢慢学习总结吧. Spring Boo ...
- spring boot学习笔记2
开场知识: spring 容器注入bean,时容器初始化的一些接口以及接口调用的时间先后顺序: 1)BeanFactoryPostProcessor 容器初始化的回调方法 * BeanFactoryP ...
- Spring Boot学习笔记二
Spring Boot入门第二篇 第一天的详见:https://www.cnblogs.com/LBJLAKERS/p/12001253.html 同样是新建一个pring Initializer快速 ...
随机推荐
- [LeetCode] Trapping Rain Water II 题解
题意 题目 思路 我一开始想的时候只考虑到一个结点周围的边界的情况,并没有考虑到边界的高度其实影响到所有的结点盛水的高度. 我们可以发现,中间是否能够盛水取决于边界是否足够高于里面的高度,所以这必然是 ...
- 时间相关库<ctime>解析
原创作品,转载请注明来源:http://www.cnblogs.com/shrimp-can/p/5649487.html 一.定义的类型 1.clock_t:时钟类型 2.size_t:unsign ...
- ajax ----进度条的原理
一.进度条的原理 新知识点:Html5中FormData,xmlHttpRequest中的upload属性,progress事件监控 xmlHttpRequest中的upload属性,实现: < ...
- 从今天开始学习Java了
//今天第一天学习了Java的起源兴起和用途,Java的特点和优势,又重新练习了hello world, public class Hello{ public static void main(Str ...
- POPTEST老李分享session,cookie的安全性以及区别 1
POPTEST老李分享session,cookie的安全性以及区别 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程 ...
- quartus ii有符号数的问题(待完善)
1.有符号数是以补码的形式存储的,在modelsim仿真时,补码自动转换为有符号的十进制数. 2.关于截位的问题: 当只取寄存器中的其中m位时,这时候取得的数是按照无符号位来处理的? 3.reg型数据 ...
- 【CSS】如何用css做一个爱心
摘要:HTML的标签都比较简单,入门非常的迅速,但是CSS是一个需要我们深度挖掘的东西,里面的很多样式属性掌握几个常用的便可以实现很好看的效果,下面我便教大家如何用CSS做一个爱心. 前期预备知识: ...
- 使用NPOI生成Excel级联列表
目录 1 概要 1 2 磨刀不误砍柴工——先学会Excel中的操作 2 3 利用NPOI生成导入模板 7 3.1 设置workbook&sheet ...
- 用react开发一个新闻列表网站(PC和移动端)
最近在学习react,试着做了一个新闻类的网站,结合ant design框架, 并且可以同时在PC和移动端运行: 主要包含登录和注册组件.头部和脚部组件.新闻块类组件.详情页组件.评论和收藏组件等: ...
- Unity 脚本中各种[XXX]的用法
1.[SerializeField]在Inspector中显示非public属性,并且序列化:若写在public修饰的字段前,相当于没写,Unity会自动为Public变量做序列化,序列化的意思是说再 ...