├── .gitignore
├── README.md
├── config
└── application.yml
├── jijicai
└── img
│ ├── toutiaohao.png
│ └── weixin.png
├── spring-boot
├── myproject.iml
├── pom.xml
├── reference
│ ├── 00SpringBoot参考指南
│ │ └── 00、SpringBoot参考指南.md
│ ├── 01SpringBoot文档
│ │ └── 01、关于文档.md
│ ├── 02入门
│ │ ├── 08、SpringBoot介绍.md
│ │ ├── 10、安装SpringBoot.md
│ │ ├── 11、开发你的第一个SpringBoot应用.md
│ │ └── 12、接下来阅读什么.md
│ ├── 03使用SpringBoot
│ │ ├── 13、构建系统.md
│ │ ├── 14、构建你的代码.md
│ │ ├── 15、配置类.md
│ │ ├── 16、自动配置.md
│ │ ├── 17、SpringBeans和依赖注入.md
│ │ ├── 18、使用@SpringBootApplication注解.md
│ │ ├── 19、运行你的应用.md
│ │ ├── 20、开发者工具.md
│ │ └── 21~22、打包你的应用程序用于产生.md
│ ├── 04SpringBoot功能
│ │ ├── 23、SpringApplication.md
│ │ ├── 24、外部化配置.md
│ │ ├── 25、配置文件.md
│ │ ├── 26、日志.md
│ │ ├── 27、国际化.md
│ │ ├── 28、JSON.md
│ │ ├── 29、开发Web应用程序.md
│ │ ├── 30、安全.md
│ │ ├── 31、使用SQL数据库.md
│ │ ├── 32、使用NoSQL技术.md
│ │ ├── 33、缓存.md
│ │ ├── 34、消息传递.md
│ │ ├── 35、使用RestTemplate调用REST服务.md
│ │ ├── 36、使用WebClient调用REST服务.md
│ │ ├── 37、验证.md
│ │ ├── 38、发送电子邮件.md
│ │ ├── 39、使用JTA的分布式事务.md
│ │ ├── 40、Hazelcast.md
│ │ ├── 41、Quartz调度器.md
│ │ ├── 42、任务执行与调度.md
│ │ ├── 43、Spring集成.md
│ │ ├── 44、Spring会话.md
│ │ ├── 45、JMX的监控和管理.md
│ │ ├── 46、测试.md
│ │ ├── 47、WebSockets.md
│ │ ├── 48、Web服务.md
│ │ ├── 49、创建你自己的自动配置.md
│ │ ├── 50、Kotlin支持.md
│ │ └── 51、延伸阅读.md
│ ├── 05SpringBootActuator:生产就绪功能
│ │ ├── 52、启用生产就绪功能.md
│ │ ├── 53、端点.md
│ │ ├── 54、通过HTTP进行监控和管理.md
│ │ ├── 55、通过JMX进行监控和管理.md
│ │ ├── 56、日志器.md
│ │ ├── 57、度量.md
│ │ ├── 58、审计.md
│ │ ├── 59、HTTP跟踪.md
│ │ ├── 60、进程监控.md
│ │ ├── 61、CloudFoundry支持.md
│ │ └── 62、延伸阅读.md
│ ├── 06部署SpringBoot应用程序
│ │ ├── 63、部署到云.md
│ │ ├── 64、安装SpringBoot应用程序.md
│ │ └── 65、延伸阅读.md
│ ├── 07SpringBootCLI
│ │ ├── 66、安装CLI.md
│ │ ├── 67、使用CLI.md
│ │ ├── 68、使用GroovyBeansDSL开发应用程序.md
│ │ ├── 69、使用settings.xml配置CLI.md
│ │ └── 70、延伸阅读.md
│ ├── 08构建工具插件
│ │ ├── 71、SpringBootMaven插件.md
│ │ ├── 72、SpringBootGradle插件.md
│ │ ├── 73、SpringBootAntLib模块.md
│ │ ├── 74、支持的其他构建系统.md
│ │ └── 75、延伸阅读.md
│ ├── 09操作指南
│ │ ├── 76、SpringBoot应用程序.md
│ │ ├── 77、属性和配置.md
│ │ ├── 78、嵌入式Web服务器.md
│ │ ├── 79、SpringMVC.md
│ │ ├── 80、使用SpringSecurity进行测试.md
│ │ ├── 81、Jersey.md
│ │ ├── 82、HTTP 客户端.md
│ │ ├── 83、日志.md
│ │ ├── 84、数据访问.md
│ │ ├── 85、数据库初始化.md
│ │ ├── 86、消息传递.md
│ │ ├── 87、批处理应用程序.md
│ │ ├── 88、Actuator.md
│ │ ├── 89、安全.md
│ │ ├── 90、热交换.md
│ │ ├── 91、构建.md
│ │ └── 92、传统部署.md
│ └── 10附录
│ │ ├── A、常见应用程序属性.md
│ │ ├── B、配置元数据.md
│ │ ├── C、自动配置类.md
│ │ ├── D、测试自动配置注解.md
│ │ ├── E、可执行Jar格式.md
│ │ └── F、依赖项版本.md
└── src
│ └── main
│ ├── java
│ └── cn
│ │ └── jijicai
│ │ └── springboot
│ │ ├── Example.java
│ │ └── MyConfiguration.java
│ └── resources
│ └── banner.txt
└── spring-framework
└── reference
├── 00Spring框架文档
└── 00、Spring框架文档.md
└── 01概述
└── 01、Spring框架概述.md
/.gitignore:
--------------------------------------------------------------------------------
1 | ### IntelliJ IDEA ###
2 | .idea
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Spring 全家桶(各个版本)
2 |
3 | 这个仓库中我会放置 Spring 系列中各类技术的翻译、教程等,如下所示:
4 |
5 | 1、Spring Boot 参考指南中文版(2.1.6.RELEASE)(已更新完毕)。
6 |
7 | 2、Spring Framework 参考指南中文版(5.2.4.RELEASE)。
8 |
9 | 
10 | 
11 |
--------------------------------------------------------------------------------
/config/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8082
3 |
--------------------------------------------------------------------------------
/jijicai/img/toutiaohao.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jijicai/Spring/94b6d91d11bbd928e13ad7a29b7e2739731d89b6/jijicai/img/toutiaohao.png
--------------------------------------------------------------------------------
/jijicai/img/weixin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jijicai/Spring/94b6d91d11bbd928e13ad7a29b7e2739731d89b6/jijicai/img/weixin.png
--------------------------------------------------------------------------------
/spring-boot/myproject.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/spring-boot/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 | com.example
7 | myproject
8 | 0.0.1-SNAPSHOT
9 |
10 |
11 |
12 | org.springframework.boot
13 | spring-boot-starter-parent
14 | 2.1.6.RELEASE
15 |
16 |
17 |
18 |
19 |
20 | org.springframework.boot
21 | spring-boot-starter-web
22 |
23 |
28 |
29 |
30 |
31 |
32 |
33 |
34 | org.springframework.boot
35 | spring-boot-maven-plugin
36 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/spring-boot/reference/00SpringBoot参考指南/00、SpringBoot参考指南.md:
--------------------------------------------------------------------------------
1 | # Spring Boot 参考指南
2 |
3 | ## 作者列表
4 | Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch, Andy Wilkinson, Marcel Overdijk, Christian Dupuis, Sébastien Deleuze, Michael Simons, Vedran Pavić, Jay Bryant, Madhura Bhave
5 |
6 | ## 版本
7 |
8 | 本文档的版本:2.1.6.RELEASE,与 Spring Boot 对应。
9 |
10 |
11 | ## 版权
12 | 版权 © 2012-2018
13 |
14 | 本文件的复本可供你自己使用及分发予他人,但你不得就该等复本收取任何费用,并且每个副本都包含版权声明,无论以印刷品或电子方式分发。
--------------------------------------------------------------------------------
/spring-boot/reference/01SpringBoot文档/01、关于文档.md:
--------------------------------------------------------------------------------
1 | # 第一部分:Spring Boot 文档
2 |
3 | 本节简要概述了 Spring Boot 参考文档。它作为文档其余部分的参照。
4 |
5 | # 1、关于文档
6 |
7 | 可用的 Spring Boot 参考指南如下:
8 |
9 | (1)[HTML](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html)
10 |
11 | (2)[PDF](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/pdf/spring-boot-reference.pdf)
12 |
13 | (3)[EPUB](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/epub/spring-boot-reference.epub)
14 |
15 | 最新版本在网址:https://docs.spring.io/spring-boot/docs/current/reference 。
16 |
17 | 本文件的复本可供你自己使用及分发予他人,但你不得就该等复本收取任何费用,并且每个副本都包含版权声明,无论以印刷品或电子方式分发。
18 |
19 | # 2、得到帮助
20 |
21 | 如果你有 Spring Boot 的问题,我们愿意帮助你。
22 |
23 | (1)试一下:[操作指南文档](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/howto.html)。它们为最常见的问题提供解决方案。
24 |
25 | (2)学习 Spring 基础知识。Spring Boot 建立在许多其他 Spring 项目的基础上。查看 spring.io 网站以获取大量参考文档。如果你从 Spring 开始,可以尝试其中的一个[指南](https://spring.io/guides)。
26 |
27 | (3)提问问题。我们监视 stackoverflow.com,以查找带有 spring-boot 标记的问题。
28 |
29 | (4)报告 Spring Boot 的 BUG ,在网站:https://github.com/spring-projects/spring-boot/issues 上。
30 |
31 | 注释:Spring Boot 的所有都是开源的,包括文档。如果你发现这些文档有问题,或者如果你想改进它们,请[参与进来](https://github.com/spring-projects/spring-boot/tree/v2.1.6.RELEASE)。
32 |
33 | # 3、第一步
34 |
35 | 如果你开始使用 Spring Boot 或“Spring”,请从以下主题开始:
36 |
37 | (1)从头开始:
38 | [概述](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/getting-started-introducing-spring-boot.html)
39 | | [要求](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/getting-started-system-requirements.html)
40 | | [安装](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/getting-started-installing-spring-boot.html)
41 |
42 | (2)教程:
43 | [第一部分](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/getting-started-first-application.html)
44 | | [第二部分](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/getting-started-first-application.html#getting-started-first-application-code)
45 |
46 | (3)运行示例:
47 | [第一部分](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/getting-started-first-application.html#getting-started-first-application-run)
48 | | [第二部分](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/getting-started-first-application.html#getting-started-first-application-executable-jar)
49 |
50 | # 4、和 Spring Boot 一起工作
51 |
52 | 准备好开始使用 Spring Boot 了吗?我们为你提供:
53 |
54 | (1)构建系统:
55 | [Maven](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/using-boot-build-systems.html#using-boot-maven)
56 | | [Gradle](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/using-boot-build-systems.html#using-boot-gradle)
57 | | [Ant](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/using-boot-build-systems.html#using-boot-ant)
58 | | [Starters](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/using-boot-build-systems.html#using-boot-starter)
59 |
60 | (2)最佳实践:
61 | [代码结构](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/using-boot-structuring-your-code.html)
62 | | [@Configuration](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/using-boot-configuration-classes.html)
63 | | [@EnableAutoConfiguration](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/using-boot-auto-configuration.html)
64 | | [Beans 和依赖注入](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/using-boot-spring-beans-and-dependency-injection.html)
65 |
66 | (3)运行代码:
67 | [IDE](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/using-boot-running-your-application.html#using-boot-running-from-an-ide)
68 | | [Packaged](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/using-boot-running-your-application.html#using-boot-running-as-a-packaged-application)
69 | | [Maven](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/using-boot-running-your-application.html#using-boot-running-with-the-maven-plugin)
70 | | [Gradle](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/using-boot-running-your-application.html#using-boot-running-with-the-gradle-plugin)
71 |
72 | (4)打包应用:[用于生产环境的 jars](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/using-boot-packaging-for-production.html)
73 |
74 | (5)Spring Boot CLI:[使用 CLI](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/cli.html)
75 |
76 | # 5、了解 Spring Boot 特性
77 |
78 | 需要了解更多关于 Spring Boot 核心特性的细节吗?以下内容是为你准备的:
79 |
80 | (1)核心特性:
81 | [SpringApplication](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-spring-application.html)
82 | | [外部配置](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-external-config.html)
83 | | [配置文件](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-profiles.html)
84 | | [日志](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-logging.html)
85 |
86 | (2)Web 应用:
87 | [MVC](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-developing-web-applications.html#boot-features-spring-mvc)
88 | | [嵌入式容器](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-developing-web-applications.html#boot-features-embedded-container)
89 |
90 | (3)使用数据:
91 | [SQL](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-sql.html)
92 | | [NO-SQL](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-nosql.html)
93 |
94 | (4)消息传递:
95 | [概述](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-messaging.html)
96 | | [JMS](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-messaging.html#boot-features-jms)
97 |
98 | (5)测试:
99 | [概述](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-testing.html)
100 | | [Spring Boot 应用](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-testing.html#boot-features-testing-spring-boot-applications)
101 | | [Utils](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-testing.html#boot-features-test-utilities)
102 |
103 | (6)扩展:
104 | [自动配置](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-developing-auto-configuration.html)
105 | | [@Conditions](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-developing-auto-configuration.html#boot-features-condition-annotations)
106 |
107 | # 6、转入生产(Moving to Production)
108 |
109 | 当你准备将 Spring Boot 应用投入生产时,我们有一些你可能喜欢的技巧:
110 |
111 | (1)管理端点:
112 | [概述](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/production-ready-endpoints.html)
113 | | [自定义](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/production-ready-endpoints.html#production-ready-endpoints-custom)
114 |
115 | (2)链接选项:
116 | [HTTP](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/production-ready-monitoring.html)
117 | | [JMX](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/production-ready-jmx.html)
118 |
119 | (3)监视:
120 | [度量](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/production-ready-metrics.html)
121 | | [审核](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/production-ready-auditing.html)
122 | | [追踪](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/production-ready-http-tracing.html)
123 | | [流程](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/production-ready-process-monitoring.html)
124 |
125 | # 7、高级主题
126 |
127 | 最后,我们为更高级的用户准备了一些主题:
128 |
129 | (1)Spring Boot 应用部署:
130 | [云部署](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/cloud-deployment.html)
131 | | [OS 服务](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/deployment-install.html#deployment-service)
132 |
133 | (2)构建工具插件:
134 | [Maven](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/build-tool-plugins-maven-plugin.html)
135 | | [Gradle](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/build-tool-plugins-gradle-plugin.html)
136 |
137 | (3)附录:
138 | [应用的属性](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/common-application-properties.html)
139 | | [自动配置类](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/auto-configuration-classes.html)
140 | | [可执行的 jar](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/executable-jar.html)
--------------------------------------------------------------------------------
/spring-boot/reference/02入门/08、SpringBoot介绍.md:
--------------------------------------------------------------------------------
1 | # 第二部分:入门
2 |
3 | 如果你正在开始使用 Spring Boot,或者通常是“Spring”,请从阅读本节开始。本节回答了基本的问题:是什么?、怎么做?、为什么?。本节包括 Spring Boot 介绍,及其安装说明。然后,我们带领你构建你的第一个 Spring Boot 应用,同时讨论一些核心的原则。
4 |
5 | # 8、Spring Boot 介绍
6 |
7 | Spring Boot 使你可以轻松地创建独立的、生产级别基于 Spring 的可运行的应用。我们同等对待 Spring 平台和第三方库,这样你就可以轻松入门了。大多数 Spring Boot 应用只需要很少的 Spring 配置。
8 |
9 | 你可以使用 Spring Boot 创建 Java 应用程序,它们可以通过使用命令 java -jar 或更传统的 war 部署启动。我们还提供了一个运行“spring 脚本”的命令行工具。
10 |
11 | 我们的主要目标是:
12 |
13 | (1)为所有 Spring 开发提供一个更快、更容易获得的入门体验。
14 | (2)开箱即用,但要在需求开始偏离默认值时迅速离开。
15 | (3)提供对大型项目类(如嵌入式服务器、安全性、度量标准、健康检查和外部化配置)通用的一系列非功能特性。
16 | (4)完全不需要代码生成,也不需要 XML 配置。
17 |
18 | # 9、系统需求
19 |
20 | Spring Boot 2.1.6.RELEASE 需要 Java 8 ,并且兼容至 Java 11(包括在内)。Spring Framework 5.1.8.RELEASE 或更高版本也是必需的。
21 |
22 | 为以下构建工具提供显示地构建支持:
23 |
24 | |构建工具(Build Tool) |版本(Version)|
25 | |---|---|
26 | |Maven |3.3+|
27 | |Gradle |4.4+|
28 |
29 | ## 9.1 Servlet 容器
30 |
31 | Spring Boot 支持以下嵌入式的 servlet 容器:
32 |
33 | |名称(Nmae) |Servlet 版本(Servlet Version)|
34 | |---|---|
35 | |Tomcat 9.0 |4.0|
36 | |Jetty 9.4 |3.1|
37 | |Undertom 2.0 |4.0|
38 |
39 | 你还可以将 Spring Boot 应用部署到任何 Servlet 3.1+ 兼容的容器中。
40 |
--------------------------------------------------------------------------------
/spring-boot/reference/02入门/10、安装SpringBoot.md:
--------------------------------------------------------------------------------
1 | # 10、安装 Spring Boot
2 |
3 | Spring Boot 可以与“经典”Java 开发工具一起使用,也可以作为命令行工具安装。不管怎样,你都需要 Java SDK v1.8 或更高版本。开始之前,应使用以下命令检查当前的 Java 安装:
4 |
5 | $ java -version
6 |
7 | 如果你是 Java 开发的新手,或如果你想体验 Spring Boot,那么你可能需要首先试一下 Spring Boot CLI(Command Line Interface)。否则,请继续阅读“经典”安装说明。
8 |
9 | ## 10.1 Java 开发者的安装说明
10 |
11 | 你可以像使用任何标准 Java 库一样使用 Spring Boot。为此,在类路径中包含适当的 spring-boot-*.jar 文件。Spring Boot 不需要任何特殊的工具集成,因此可以使用任何 IDE 或文本编辑器。此外,Spring Boot 应用没有什么特别之处,因此可以像任何其他 Java 程序一样运行、调试 Spring Boot 应用程序。
12 |
13 | 尽管你可以拷贝 Spring Boot jars,但是我们通常建议你使用一个支持依赖管理的构建工具(例如:Maven 或 Gradle)。
14 |
15 | ### 10.1.1 Maven 安装
16 |
17 | Spring Boot 兼容 Apache Maven 3.3 或以上版本。如果尚未安装 Maven,可以按照 maven.apache.org 网站的说明进行操作。
18 |
19 | 提示:在很多操作系统上,可以用包管理器安装 Maven。如果你使用 OSX Homebrew,则请试一下 brew install maven。Ubuntu 用户可以运行 sudo apt-get install maven。用 Chocolately 的 Windows 用户可以从提升的(管理员)提示符运行 choco install maven 。
20 |
21 | Spring Boot 依赖项使用 org.springframework.boot groupId。通常,Maven POM 文件继承自 spring-boot-starter-parent 项目,并声明一或多个启动器的依赖项。Spring Boot 也提供可选的 Maven 插件来创建可执行的 jars。
22 |
23 | 以下清单展示了一个典型的 pom.xml 文件:
24 |
25 |
26 |
28 | 4.0.0
29 |
30 | com.example
31 | myproject
32 | 0.0.1-SNAPSHOT
33 |
34 |
35 |
36 | org.springframework.boot
37 | spring-boot-starter-parent
38 | 2.1.6.RELEASE
39 |
40 |
41 |
42 |
43 |
44 | org.springframework.boot
45 | spring-boot-starter-web
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | org.springframework.boot
54 | spring-boot-maven-plugin
55 |
56 |
57 |
58 |
59 |
60 |
61 | 提示:spring-boot-startr-parent 是使用 Spring Boot 的一个好方法,但它可能并不总是适合的。有时候,你可能需要继承不同的 parent POM,或者你可能不喜欢我们的默认设置。在这些情况下,请参看 13.2.2 节“在没有 parent POM 的情况下使用 Spring Boot”,以获取使用 import 作用域的替代解决方案。
62 |
63 | ### 10.1.2 Gradle 安装
64 |
65 | Spring Boot 兼容 Gradle 4.4 或以上版本。如果你还没有安装 Gradle,你可以按照 gradle.org 网站的说明进行操作。
66 |
67 | Spring Boot 依赖项可以通过使用 org.springframework.boot group 来声明。通常,项目声明一或多个启动器的依赖项。Spring Boot 提供一个有用的 Gradle 插件,它可以用于简化依赖声明和创建可执行的 jars。
68 |
69 | Gradle 包装器
70 | Gradle 包装器提供了当需要创建项目时一个“获取” Gradle 的好方法。它是一个小脚本和库,你可以将它与代码一起提交以引导构建过程。有关详情,请查看:docs.gradle.org/4.2.1/userguide/gradle_wrapper.html (https://docs.gradle.org/4.2.1/userguide/gradle_wrapper.html)。
71 |
72 | 有关 Spring Boot 和 Gradle 入门的更多详情,请参见 Gradle 插件参考指南的入门部分。
73 |
74 | ## 10.2 安装 Spring Boot CLI
75 |
76 | Spring Boot CLI(Command Line Interface)是一个命令行工具,你可以使用它来快速创建 Spring 原型。它允许你运行 Groovy 脚本,这意味着你有一个熟悉的类似 Java 的语法,而没有那么多样板代码。
77 |
78 | 你不是必须使用 CLI 来处理 Spring Boot,但这绝对是让 Spring 应用程序起步的最快方法。
79 |
80 | ### 10.2.1 手动安装
81 |
82 | 你可以从 Spring 软件仓库下载 Spring CLI 发行版:
83 |
84 | (1)spring-boot-cli-2.1.6.RELEASE-bin.zip(https://repo.spring.io/release/org/springframework/boot/spring-boot-cli/2.1.6.RELEASE/spring-boot-cli-2.1.6.RELEASE-bin.zip)
85 |
86 | (2)spring-boot-cli-2.1.6.RELEASE-bin.tar.gz(https://repo.spring.io/release/org/springframework/boot/spring-boot-cli/2.1.6.RELEASE/spring-boot-cli-2.1.6.RELEASE-bin.tar.gz)
87 |
88 | 还提供了最新的快照分发版。
89 |
90 | 下载后,请按照解压缩的存档文件中的 INSTALL.txt 说明进行操作。总之,在 .zip 文件的 bin/ 目录中有一个 spring 脚本(Wingows中是spring.bat )。或者,可以将 java -jar 与 .jar 文件一起使用(该脚本帮助你确保类路径设置正确)。
91 |
92 | ### 10.2.2 用 SDKMAN! 安装
93 |
94 | SDKMAN!(软件开发工具包管理器)可用于管理各种二进制 SDK 的多个版本,包括 Groovy 和 Spring Boot CLI。从网站 sdkman.io 得到 SDKMAN!,并且使用以下命令安装 Spring Boot:
95 |
96 | $ sdk install springboot
97 | $ spring --version
98 | Spring Boot v2.1.6.RELEASE
99 |
100 | 如果你开发了 CLI 的功能并希望轻松访问你构建的版本,请使用以下命令:
101 |
102 | $ sdk install springboot dev /path/to/spring-boot/spring-boot-cli/target/spring-boot-cli-2.1.6.RELEASE-bin/spring-2.1.6.RELEASE/
103 | $ sdk default springboot dev
104 | $ spring --version
105 | Spring CLI v2.1.6.RELEASE
106 |
107 | 前面的指令安装一个名为 dev 实例的 Spring 本地实例。它指向你的目标构建位置,因此每次重新构建 Spring Boot 时,Spring 都是最新的。
108 |
109 | 你可以通过运行以下命令来查看它:
110 |
111 | $ sdk ls springboot
112 |
113 | ================================================================================
114 | Available Springboot Versions
115 | ================================================================================
116 | > + dev
117 | * 2.1.6.RELEASE
118 |
119 | ================================================================================
120 | + - local version
121 | * - installed
122 | > - currently in use
123 | ================================================================================
124 |
125 | ### 10.2.3 OSX Homebrew 安装
126 |
127 | 如果你在 Mac 上并使用 Homebrew,则可以通过使用以下命令安装 Spring Boot CLI:
128 |
129 | $ brew tap pivotal/tap
130 | $ brew install springboot
131 |
132 | Homebrew 将 spring 安装到 /usr/local/bin 目录中。
133 |
134 | 注释:如果你没有看到 formula,则brew 的安装可能已过期。在这种情况下,请运行 brew update,并重试。
135 |
136 | ### 10.2.4 MacPorts 安装
137 |
138 | 如果你在 Mac 上并使用 MacPorts,则可以使用以下命令安装 Spring Boot CLI:
139 |
140 | $ sudo port install spring-boot-cli
141 |
142 | ### 10.2.5 命令行自动补全
143 |
144 | Spring Boot CLI 包括为 BASH 和 zsh shell 提供命令自动补全的脚本。你可以在任何 shell 中获取脚本(也称为 spring),也可以将其放入你的个人或系统范围的 bash 自动补全初始化中。在 Debian 系统中,系统范围的脚本位于 /shell-completion/bash 目录中,并且当新 shell 启动时,该目录中的所有脚本都被执行。例如,如果使用 SDKMAN! 安装了该脚本,则可以手动运行它,使用以下命令:
145 |
146 | $ . ~/.sdkman/candidates/springboot/current/shell-completion/bash/spring
147 | $ spring
148 | grab help jar run test version
149 |
150 | 注释:如果你使用 Homebrew 或 MacPorts 来安装 Spring Boot CLI,则命令行自动补全脚本会是和 shell 一起自动注册的。
151 |
152 | ### 10.2.6 Windows Scoop 安装
153 |
154 | 如果你在 Windows 上使用 Scoop,你可以使用以下命令安装 Spring Boot CLI:
155 |
156 | > scoop bucket add extras
157 | > scoop install springboot
158 |
159 | 注释:如果你没有看到 app manifest,则安装的 Scoop 可能已经过期。在这种情况下,请运行 scoop update,并重试。
160 |
161 | ### 10.2.7 快速启动 Spring CLI 示例
162 |
163 | 你可以使用下面的 web 应用程序来测试安装。首先,创建一个名为 app.groovy 的文件,如下所示:
164 |
165 | @RestController
166 | class ThisWillActuallyRun {
167 |
168 | @RequestMapping("/")
169 | String home() {
170 | "Hello World!"
171 | }
172 |
173 | }
174 |
175 | 然后从 shell 中运行它,如下所示:
176 |
177 | $ spring run app.groovy
178 |
179 | 注释:第一次运行应用程序比较慢,因为要加载依赖项。接下来的运行要快得多。
180 |
181 | 在你喜欢的 web 浏览器中打开 localhost:8080。你应该会看到以下输出:
182 |
183 | Hello World!
184 |
185 | ## 10.3 从早期版本的 Spring Boot 升级
186 |
187 | 如果你正在从早期版本的 Spring Boot 升级,则请查看项目 wiki 上提供的详细升级说明的“迁移指南”。还可以查看发布说明,以获得每个版本的新的和值得注意的特性列表。
188 |
189 | 当升级到一个新特性版本时,一些属性可能被重命名或删除。Spring Boot 提供了一种方法,可以在启动时分析应用程环境并打印诊断信息,还可以在运行时为你临时迁移属性。要启用该特性,请将以下依赖项添加到你的项目中:
190 |
191 |
192 | org.springframework.boot
193 | spring-boot-properties-migrator
194 | runtime
195 |
196 |
197 | 警告:后面添加到环境中的属性不会被考虑,例如:@PropertySource。
198 | 注释:一旦你做完迁移,请确保从你的项目依赖列表中移除此模块。
199 |
200 | 要想升级已安装的 CLI,请使用合适的包管理命令(例如:brew upgrade),或者,如果你手动安装了 CLI,请遵循标准说明,记得更新 PATH 环境变量以移除任何旧的引用。
201 |
--------------------------------------------------------------------------------
/spring-boot/reference/02入门/11、开发你的第一个SpringBoot应用.md:
--------------------------------------------------------------------------------
1 | # 11、开发你的第一个SpringBoot应用
2 |
3 | 本节介绍如何开发一个简单的“Hello World!”应用程序,它突出了 Spring Boot 的一些关键特性。我们使用 Maven 来构建项目,因为大多数 IDE 都只支持它。
4 |
5 | 提示:spring.io 网站包含许多使用 Spring Boot 的入门指南。如果你需要解决某个特定的问题,请首先查看它们。你可以通过转到 start.spring.io 并从依赖项搜索器中选择“Web”启动器来简化以下步骤。这样做会生成一个新的项目结构,这样你就可以立即开始编码了。请参阅 Spring Initializr 文档以获得更多详细信息。
6 |
7 | 在开始之前,请打开终端并运行以下命令,以确保安装了有效的 Java 和Maven 版本:
8 |
9 | $ java -version
10 | java version "1.8.0_102"
11 | Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
12 | Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
13 |
14 | $ mvn -v
15 | Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-17T14:33:14-04:00)
16 | Maven home: /usr/local/Cellar/maven/3.3.9/libexec
17 | Java version: 1.8.0_102, vendor: Oracle Corporation
18 |
19 | 注释:这个示例需要在它自己的文件夹中创建。后续说明假设您已经创建了一个合适的文件夹,并且它是你的当前目录。
20 |
21 | ## 11.1 创建 POM
22 |
23 | 我们需要从创建一个 Maven pom.xml 文件开始。这个 pom.xml 文件是一个用于构建项目的配方。打开你喜欢的文本编辑器,并添加以下内容:
24 |
25 |
26 |
28 | 4.0.0
29 |
30 | com.example
31 | myproject
32 | 0.0.1-SNAPSHOT
33 |
34 |
35 | org.springframework.boot
36 | spring-boot-starter-parent
37 | 2.1.6.RELEASE
38 |
39 |
40 |
41 |
42 |
43 |
44 | 前面的清单应该为你提供一个工作构建。你可以通过运行 mvn package 包来测试它(现在,你可以忽略警告“jar 将为空-没有内容被标记为包含!”)。
45 |
46 | 注释:此时,你可以将项目导入到 IDE 中(大多数现代 Java IDEs 包含对 Maven 的内置支持)。为了简单起见,我们在本例中继续使用纯文本编辑器。
47 |
48 | ## 11.2 添加类路径依赖项
49 |
50 | Spring Boot 提供了许多 “Starters”,可以将 jars 添加到类路径中。我们的示例应用已经在 POM 的 parent 部分中使用了 spring-boot-starter-parent。spring-boot-starter-parent 是一个特殊的启动器,它提供了有用的 Maven 默认设置。它还提供了一个 dependency-management 部分,这样你就可以省略依赖项的版本标记。
51 |
52 | 其他“Starters”提供了当开发特定类型的应用时可能需要的依赖项。由于我们正在开发一个 web 应用,所以我们添加 spring-boot-starter-web 依赖项。在此之前,我们可以通过运行以下命令查看当前有的依赖项:
53 |
54 | $ mvn dependency:tree
55 |
56 | [INFO] com.example:myproject:jar:0.0.1-SNAPSHOT
57 |
58 | mvn dependency:tree 命令打印树表示的项目依赖项。你可以看到 spring-boot-starter-parent 本身不提供依赖项。要添加这个必要的依赖项,请编辑pom.xml,并且立即在 parent 部分的下面添加 spring-boot-starter-web 依赖项:
59 |
60 |
61 |
62 | org.springframework.boot
63 | spring-boot-starter-web
64 |
65 |
66 |
67 | 如果你再次运行:mvn dependency:tree,你会看到现在有许多附加的依赖项,包括 Tomcat web 服务器和 Spring boot 本身。
68 |
69 | ## 11.3 编写代码
70 |
71 | 为了完成我们的应用程序,我们需要创建一个 Java 文件。默认情况下,Maven 编译“src/main/java”路径中的源代码,因此你需要创建该文件夹结构,然后添加一个名为"src/main/java/Example.java"文件,用于包含以下代码:
72 |
73 | import org.springframework.boot.*;
74 | import org.springframework.boot.autoconfigure.*;
75 | import org.springframework.web.bind.annotation.*;
76 |
77 | @RestController
78 | @EnableAutoConfiguration
79 | public class Example {
80 |
81 | @RequestMapping("/")
82 | String home() {
83 | return "Hello World!";
84 | }
85 |
86 | public static void main(String[] args) {
87 | SpringApplication.run(Example.class, args);
88 | }
89 |
90 | }
91 |
92 | 虽然这里没有太多的代码,但是正在进行很多工作。我们将在接下来的几节中逐步介绍重要的部分。
93 |
94 | ### 11.3.1 注解:@RestController 和 @RequestMapping
95 |
96 | 我们的 Example 类的第一个注解是 @RestController。这就是所谓的原型注解。它为阅读代码的人和 Spring 提供了类扮演特定角色的提示。在本例中,我们的类是 web @Controller,因此 Spring 在处理传入的 web 请求时会考虑它。
97 |
98 | @RequestMapping 注解提供了“路由”信息。它告诉 Spring 任何路径为 / 的 HTTP 请求都应当被映射到 home 方法。@RestController 注解告诉 Spring 将渲染的结果字符串直接返回给调用者。
99 |
100 | 提示:@RestController 和 @RequestMapping 注解是 Spring MVC 注解(它们不是 Spring Boot 特有的)。有关更多详情,请查看 Spring 参考文档中的 MVC 部分。
101 |
102 | ### 11.3.2 @EnableAutoConfiguration 注解
103 |
104 | 第二个类级别注解是 @EnableAutoConfiguration。这个注解告诉 Spring Boot 根据你添加的 jar 依赖项“猜测”你想要如何配置 Spring。由于 spring-boot-starter-web 添加了 Tomcat 和 Spring MVC,因此自动配置假定你正在开发一个 web 应用程序并相应地设置 Spring。
105 |
106 | **启动器和自动配置**
107 |
108 | 自动配置被设为可以很好地与启动器一起工作,但是这两个概念并没有直接捆绑在一起。你可以在启动器之外自由地选择 jar 依赖项。Spring Boot 仍然尽力自动配置应用程序。
109 |
110 | ### 11.3.3 “main” 方法
111 |
112 | 我们应用的最后一部分是 main 方法。这只是一个遵循 Java 约定的应用程序入口点的标准方法。我们的 main 方法通过调用 run 方法来委托给 Spring Boot 的 SpringApplication 类。SpringApplication 引导我们的应用程序,启动 Spring,然后启动自动配置的 Tomcat web 服务器。我们需要将 Example.class 作为一个参数传递给 run 方法,以告诉 SpringApplication 哪个是主 Spring 组件。数组 args 也被传递来公开任何命令行参数。
113 |
114 | ## 11.4 运行示例
115 |
116 | 此时,你的应用程序应该可以工作了。由于使用了 spring-boot-starter-parent POM,因此你有了一个有用的 run 目标,可以用来启动应用程序。在项目的根目录中,敲下命令:mvn spring-boot:run,来启动应用程序。你应该可以看到与下面相似的输出:
117 |
118 | $ mvn spring-boot:run
119 |
120 | . ____ _ __ _ _
121 | /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
122 | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
123 | \\/ ___)| |_)| | | | | || (_| | ) ) ) )
124 | ' |____| .__|_| |_|_| |_\__, | / / / /
125 | =========|_|==============|___/=/_/_/_/
126 | :: Spring Boot :: (v2.1.6.RELEASE)
127 | ....... . . .
128 | ....... . . . (log output here)
129 | ....... . . .
130 | ........ Started Example in 2.222 seconds (JVM running for 6.514)
131 |
132 | 如果你打开浏览器访问:localhost:8080,你应该会看到以下输出:
133 |
134 | Hello World!
135 |
136 | 要优雅地退出应用程序,请按 ctrl-c。
137 |
138 | ## 11.5 创建一个可执行的 jar 文件
139 |
140 | 我们通过创建一个完全自包含的可执行 jar 文件来完成我们的示例,该文件可以在生成环境中运行。可执行 jar(有时候称为“胖 jar”)是包含编译类以及代码需要运行的所有 jar 依赖项的归档文件。
141 |
142 | **可执行的 jars 和 Java**
143 |
144 | Java 不提供加载嵌套 jar 文件(jar 文件本身包含在一个 jar 中)的标准方法。如果你希望发布一个自包含的应用程序,这可能会有问题。
145 |
146 | 为了解决这个问题,许多开发者使用“uber” jars。一个 uber jar 将应用程序的所有依赖项的所有类都打包到单个归档文件中。这种方法的问题是很难看出应用程序中有哪些库。如果在多个 jar 中使用相同的文件名(但内容不同),也可能会出现问题。
147 |
148 | Spring Boot 采用了一种不同的方法,允许你直接嵌套 jar。
149 |
150 | 要创建一个可执行 jar,我们需要将 spring-boot-maven-plugin 添加到 pom.xml 文件中。为此,请在 dependencies 部分的下面插入以下行:
151 |
152 |
153 |
154 |
155 | org.springframework.boot
156 | spring-boot-maven-plugin
157 |
158 |
159 |
160 |
161 | 注释:spring-boot-starter-parent POM 包含绑定 repackage 目标的 配置。如果你不使用 parent POM,则你需要自己声明此配置。有关详情,请参阅插件文档。(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/maven-plugin/usage.html)
162 |
163 | 保存 pom.xml 并从命令行运行:mvn package,如下所示:
164 |
165 | $ mvn package
166 |
167 | [INFO] Scanning for projects...
168 | [INFO]
169 | [INFO] ------------------------------------------------------------------------
170 | [INFO] Building myproject 0.0.1-SNAPSHOT
171 | [INFO] ------------------------------------------------------------------------
172 | [INFO] .... ..
173 | [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ myproject ---
174 | [INFO] Building jar: /Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar
175 | [INFO]
176 | [INFO] --- spring-boot-maven-plugin:2.1.6.RELEASE:repackage (default) @ myproject ---
177 | [INFO] ------------------------------------------------------------------------
178 | [INFO] BUILD SUCCESS
179 | [INFO] ------------------------------------------------------------------------
180 |
181 | 如果你查看 target 目录,你应该会看到 myproject-0.0.1-SANPSHOT.jar。这个文件应该在 10 MB 左右。如果你想查看内部,可以使用:jar tvf,如下所示:
182 |
183 | $ jar tvf target/myproject-0.0.1-SNAPSHOT.jar
184 |
185 | 你还应该在 target 目录中看到一个更小的文件 myproject-0.0.1-SNAPSHOT.jar.original。这是 Spring Boot 重新打包之前的Maven 创建的原始 jar 文件。
186 |
187 | 要运行该应用程序,请使用 java -jar 命令,如下所示:
188 |
189 | $ java -jar target/myproject-0.0.1-SNAPSHOT.jar
190 |
191 | . ____ _ __ _ _
192 | /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
193 | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
194 | \\/ ___)| |_)| | | | | || (_| | ) ) ) )
195 | ' |____| .__|_| |_|_| |_\__, | / / / /
196 | =========|_|==============|___/=/_/_/_/
197 | :: Spring Boot :: (v2.1.6.RELEASE)
198 | ....... . . .
199 | ....... . . . (log output here)
200 | ....... . . .
201 | ........ Started Example in 2.536 seconds (JVM running for 2.864)
202 |
203 | 和之前一样,要退出应用程序,请按 ctrl-c。
204 |
--------------------------------------------------------------------------------
/spring-boot/reference/02入门/12、接下来阅读什么.md:
--------------------------------------------------------------------------------
1 | # 12、接下来阅读什么(What to Read Next)
2 |
3 | 希望本节提供了一些 Spring Boot 基础知识,并帮助你编写自己的应用程序。如果你是一个面向任务的开发者,你也许想跳到 spring.io 网站,并查看一些入门指南,以解决特定的“怎样用 Spring 做那件事?”问题。我们也有特定于 Spring Boot 的“如何”参考文档。(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/howto.html)
4 |
5 | Spring Boot 仓库还有一组可以运行的示例。样例独立于代码的其余部分(也就是说,你不需要构建其余部分来运行或使用样例)。
6 |
7 | 否则,下一个逻辑步骤是阅读第三部分,“使用 Spring Boot”。如果你真的很不耐烦,你也可以跳到后面去阅读关于 Spring Boot 特性的文章。(https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features.html)
8 |
--------------------------------------------------------------------------------
/spring-boot/reference/03使用SpringBoot/14、构建你的代码.md:
--------------------------------------------------------------------------------
1 | # 14、构建你的代码
2 |
3 | Spring Boot 不需要任何特定的代码布局就可以工作。然而,有一些最佳实践可以提供帮助。
4 |
5 | ## 14.1、使用“默认”包
6 |
7 | 当一个类不包含 package 声明时,就认为它在“默认包”中。通常不鼓励使用“默认包”,应该避免。对于使用 @ComponentScan、@EntityScan 或 @SpringBootApplication 注解的 Spring Boot 应用,它可能会导致特定的问题,因为每个 jar 中的每个类都被读取。
8 |
9 | 提示:我们建议你遵循 Java 推荐的包命名约定,并使用反向域名(例如:com.example.project)。
10 |
11 | ## 14.2、定位主应用程序类
12 |
13 | 我们通常建议将主应用类放在根包中,在其他类之上。@SpringBootApplication 注解通常放在主类上,它隐式地为某些项定义了一个基本的“搜索包”。例如,如果你正在编写一个 JPA 应用,那么 @SpringBootApplication 注解类的包将用于搜索 @Entity 项。使用根包还允许组件扫描仅应用于你的项目。
14 |
15 | 提示:如果你不想使用 @SpringBootApplication,则它导入的 @EnableAutoConfiguration 和 @ComponentScan 注解定义了该行为,因此也可以使用。
16 |
17 | 下面的清单展示了一个典型的布局:
18 | ```
19 | com
20 | +- example
21 | +- myapplication
22 | +- Application.java
23 | |
24 | +- customer
25 | | +- Customer.java
26 | | +- CustomerController.java
27 | | +- CustomerService.java
28 | | +- CustomerRepository.java
29 | |
30 | +- order
31 | +- Order.java
32 | +- OrderController.java
33 | +- OrderService.java
34 | +- OrderRepository.java
35 | ```
36 | Application.java 文件声明 main 方法,带有基础的 @SpringBootApplication 注解,如下:
37 | ```
38 | package com.example.myapplication;
39 |
40 | import org.springframework.boot.SpringApplication;
41 | import org.springframework.boot.autoconfigure.SpringBootApplication;
42 |
43 | @SpringBootApplication
44 | public class Application {
45 |
46 | public static void main(String[] args) {
47 | SpringApplication.run(Application.class, args);
48 | }
49 |
50 | }
51 | ```
52 |
--------------------------------------------------------------------------------
/spring-boot/reference/03使用SpringBoot/15、配置类.md:
--------------------------------------------------------------------------------
1 | # 15.配置类
2 |
3 | Spring Boot 支持基于 Java 的配置类。尽管可以将 SpringApplication 与 XML 源一起使用,但我们通常建议你的主要源是单个 @Configuration 类。通常,定义 main 方法的类是主 @Configuration 的最佳候选类。
4 |
5 | 提示:许多 Spring 配置样例在互联网上已经发布,它们使用 XML 配置。如果可能,始终尝试使用等价的基于 Java 的配置。搜索 Enable* 注解可能是一个很好的起点。
6 |
7 | ## 15.1 导入其他配置类
8 |
9 | 你不需要将所有的 @Configuration 都放在一个类中。可以使用 @Import 注解导入其他配置类。或者,你可以使用 @ComponentScan 自动获取所有 Spring 组件,其中包括 @Configuration 类。
10 |
11 | ## 15.2 导入 XML 配置
12 |
13 | 如果你必须使用基于 XML 的配置,我们建议你仍然从 @Configuration 类开始。然后,你可以使用 @ImportResource 注解来加载 XML 配置文件。
14 |
15 |
16 |
--------------------------------------------------------------------------------
/spring-boot/reference/03使用SpringBoot/16、自动配置.md:
--------------------------------------------------------------------------------
1 | # 16、自动配置
2 |
3 | Spring Boot 自动配置尝试根据你添加的 jar 依赖项自动配置 Spring 应用。例如,如果 HSQLDB 在你的类路径上,并且你没有手动配置任何数据库连接 beans,那么 Spring Boot 将会自动配置内存中的数据库。
4 |
5 | 你需要通过将 @EnableAutoConfiguration 或 @SpringBootApplication 注解添加到一个 @Configuration 类来选择自动配置。
6 |
7 | 提示:你应当永远仅添加一个 @SpringBootApplication 或 @EnableAutoConfiguration 注解。我们通常建议只向主 @Configuration 类添加一个或另一个。
8 |
9 | ## 16.1 逐渐取代自动配置
10 |
11 | 自动配置是无创的。在任何时候,你都能够开始定义自己的配置来替换自动配置的特定部分。例如,如果你添加了自己的数据源(DataSource)bean,则默认的嵌入式数据库支持将后退。
12 |
13 | 如果你需要了解当前应用的是什么自动配置,以及为什么,则可以切换到调试模式(--debug)来启动应用。这样做可以为选择的核心日志记录器启用调试日志,并将条件报告记录到控制台。
14 |
15 | ## 16.2 禁用特定的自动配置类
16 |
17 | 如果你发现应用了不想要的特定的自动配置类,则你可以使用 @EnableAutoConfiguration 的 exclude 属性来禁用它们,如下面示例所示:
18 |
19 | import org.springframework.boot.autoconfigure.*;
20 | import org.springframework.boot.autoconfigure.jdbc.*;
21 | import org.springframework.context.annotation.*;
22 |
23 | @Configuration
24 | @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
25 | public class MyConfiguration {
26 | }
27 |
28 | 如果某个类不在类路径中,则你可以使用该注解的excludeName 属性并指定完全限定名。最后,你还可以通过使用 spring.autoconfigure.exclude 属性来控制要排除的自动配置类的列表。
29 |
30 | 提示:你可以同时在注解级别和通过使用该属性定义排除项。
31 |
32 |
33 |
--------------------------------------------------------------------------------
/spring-boot/reference/03使用SpringBoot/17、SpringBeans和依赖注入.md:
--------------------------------------------------------------------------------
1 | # 17、Spring Beans 和依赖注入
2 |
3 | 你可以自由地使用任何标准的 Spring Framework 技术来定义 beans 及其注入的依赖项。为简单起见,我们经常发现使用 @ComponentScan(查找 beans)和 @Autowired(执行构造函数注入)工作得很好。
4 |
5 | 如果按照上面的建议构造你的代码(将应用程序类放在根包中),则可以添加 @ComponentScan 而无需任何参数。所有应用程序组件(@Component、@Service、@Repository、@Controller 等等)都自动注册为 Spring Beans。
6 |
7 | 下面的示例展示了 @Service bean 使用构造方法注入来获取所需的 RiskAssessor bean:
8 |
9 | package com.example.service;
10 |
11 | import org.springframework.beans.factory.annotation.Autowired;
12 | import org.springframework.stereotype.Service;
13 |
14 | @Service
15 | public class DatabaseAccountService implements AccountService {
16 |
17 | private final RiskAssessor riskAssessor;
18 |
19 | @Autowired
20 | public DatabaseAccountService(RiskAssessor riskAssessor) {
21 | this.riskAssessor = riskAssessor;
22 | }
23 |
24 | // ...
25 |
26 | }
27 |
28 | 如果 bean 有一个构造方法,你可以省略 @Autowired,如下面的示例所示:
29 |
30 | @Service
31 | public class DatabaseAccountService implements AccountService {
32 |
33 | private final RiskAssessor riskAssessor;
34 |
35 | public DatabaseAccountService(RiskAssessor riskAssessor) {
36 | this.riskAssessor = riskAssessor;
37 | }
38 |
39 | // ...
40 |
41 | }
42 |
43 | 提示:请注意,使用构造方法注入可以将 riskAssessor 字段标记为 final,表示它随后不能更改。
44 |
--------------------------------------------------------------------------------
/spring-boot/reference/03使用SpringBoot/18、使用@SpringBootApplication注解.md:
--------------------------------------------------------------------------------
1 | # 18、使用 @SpringBootApplication 注解
2 |
3 | 许多 Spring Boot 开发者希望他们的应用使用自动配置、组件扫描,并且能够在“应用程序类”中定义额外的配置。可以使用单个 @SpringBootApplication 注解来启用这三个特性,它们是:
4 |
5 | (1)@EnableAutoConfiguration:启动 Spring Boot 自动配置机制。
6 | (2)@ComponentScan:在应用程序所在的包上启用 @Component 扫描。
7 | (3)@Configuration:允许在上下文中注册额外的 beans 或者导入 其他配置类。
8 |
9 | @SpringBootApplication 注解等价于使用具有默认属性的 @Configuration、@EnableAutoConfiguration 和 @ComponentScan,如下面的示例所示:
10 |
11 | package com.example.myapplication;
12 |
13 | import org.springframework.boot.SpringApplication;
14 | import org.springframework.boot.autoconfigure.SpringBootApplication;
15 |
16 | @SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
17 | public class Application {
18 |
19 | public static void main(String[] args) {
20 | SpringApplication.run(Application.class, args);
21 | }
22 |
23 | }
24 |
25 | 注释:@SpringBootApplication 还提供了别名来定制 @EnableAutoConfiguration 和 @ComponentScan 的属性。
26 |
27 | 注释:这些功能都不是强制的,你可以选择用它启用的任何功能来替换单个注解。例如,你也许不想在应用中使用组件扫描:
28 |
29 | package com.example.myapplication;
30 |
31 | import org.springframework.boot.SpringApplication;
32 | import org.springframework.context.annotation.ComponentScan
33 | import org.springframework.context.annotation.Configuration;
34 | import org.springframework.context.annotation.Import;
35 |
36 | @Configuration
37 | @EnableAutoConfiguration
38 | @Import({ MyConfig.class, MyAnotherConfig.class })
39 | public class Application {
40 |
41 | public static void main(String[] args) {
42 | SpringApplication.run(Application.class, args);
43 | }
44 |
45 | }
46 |
47 | 注解:在本例子中,Application 与其他任何 Spring Boot 应用一样,只是不会自动检测 @Component 的类,并且显示地导入了用户定义的 bean(参见 @Import)。
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/spring-boot/reference/03使用SpringBoot/19、运行你的应用.md:
--------------------------------------------------------------------------------
1 | # 19、运行你的应用
2 |
3 | 把应用打包为 jar 并使用嵌入式 HTTP 服务器最大的好处之一是可以像运行其他应用一样运行你的应用。调试 Spring Boot 应用程序也很容易。你不需要任何特定的 IDE 插件或扩展。
4 |
5 | 注释:本节只介绍基于 jar 的打包。如果你选择将应用程序打包为 war 文件,你应当参考你的服务器和 IDE 文档。
6 |
7 | ## 19.1、在 IDE 中运行
8 |
9 | 你可以从 IDE 运行一个 Spring Boot 应用程序,将其作为一个简单的 Java 应用程序。但是,首先需要导入项目。导入步骤因 IDE 和 构建系统而异。大多数 IDE 可以直接将 Maven 项目导入。例如,Eclipse 用户可以从“文件”菜单中选择“导入...->现有的 Maven 项目”。
10 |
11 | 如果你不能直接将项目导入到 IDE,则你也许能通过使用构建插件来生成 IDE 元数据。Maven 包括 Eclipse 和 IDEA 的插件。Gradle 提供各种 IDE 的插件。
12 |
13 | 提示:如果意外地运行了两次 web 应用,则会看到“端口已经占用”的错误。STS 用户可以使用“重新运行”按钮而不使用“运行”按钮,以此来确保任何现有的实例都已关闭。
14 |
15 | ## 19.2、作为打包的应用程序运行
16 |
17 | 如果使用 Spring Boot Maven 或 Gradle 插件创建可执行的 jar,则可以使用 java -jar 运行应用,如下面示例所示:
18 |
19 | $ java -jar target/myapplication-0.0.1-SNAPSHOT.jar
20 |
21 | 还可以在启用远程调试支持的情况下运行打包的应用程序。这样做可以将调试器附加到打包的应用程序中,如下面示例所示:
22 |
23 | java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
24 | -jar target/myapplication-0.0.1-SNAPSHOT.jar
25 |
26 | ## 19.3、使用 Maven 插件
27 |
28 | Spring Boot Maven 插件包括一个 run 目标,它可以用于快速编译和运行应用。应用以分解的形式运行,就像在 IDE 中一样。下面的示例展示了运行 Spring Boot 应用的典型 Maven 命令:
29 |
30 | $ mvn spring-boot:run
31 |
32 | 你可能还希望使用 MAVEN_OPTS 操作系统环境变量,如下面示例所示:
33 |
34 | $ export MAVEN_OPTS=-Xmx1024m
35 |
36 | ## 19.4、使用 Gradle 插件
37 |
38 | Spring Boot Gradle 插件包含一个 bootRun 任务,它可以用于以分解的形式运行应用。每当应用 org.springframework.boot 和 java 插件时,都会添加 bootRun,如下面示例所示:
39 |
40 | $ gradle bootRun
41 |
42 | 你可能还希望使用 JAVA_OPTS 操作系统环境变量,如下面示例所示:
43 |
44 | $ export JAVA_OPTS=-Xmx1024m
45 |
46 | ## 19.5、热交换(Hot Swapping)
47 |
48 | 由于 Spring Boot 应用只是普通的 Java 应用,JVM 热交换应该是现成的。JVM 热交换在某种程度上受限于它可以替换的字节码。对于更完整的解决方案,可以使用 JRebel。
49 |
50 | spring-boot-devtools 模块还支持快速应用重启。有关详细信息,请参阅本章后面的第 20 章“开发者工具”部分和热交换“如何”部分。
51 |
--------------------------------------------------------------------------------
/spring-boot/reference/03使用SpringBoot/21~22、打包你的应用程序用于产生.md:
--------------------------------------------------------------------------------
1 | # 21、打包你的应用程序用于生产
2 |
3 | 可执行的 jar 可以用于生产部署。由于它们是自包含的,因此也非常适合于基于云的部署。
4 |
5 | 对于其它“生产就绪”的功能,例如:健康、审计和度量 REST 或 JMX 端点,请考虑添加 spring-boot-actuator。有关详情,请查看第五部分:Spring Boot Actuator:生产就绪功能。
6 |
7 | # 22、接下来阅读什么
8 |
9 | 现在你应该了解如何使用 Spring Boot 以及应该遵循的一些最佳实践。现在,你可以继续深入了解特定的 Spring Boot 特性,也可以跳到后面,阅读 Spring Boot 的“[生产就绪](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/production-ready.html)”方面的内容。
10 |
--------------------------------------------------------------------------------
/spring-boot/reference/04SpringBoot功能/25、配置文件.md:
--------------------------------------------------------------------------------
1 | # 25、配置文件
2 |
3 | Spring Profiles 提供了一种方法来隔离应用程序配置的各个部分,并使其仅在某些环境中可用。任何 @Component 或 @Configuration 都可以用 @Profile 标记,以便限制加载时间,如下面的示例所示:
4 | ```
5 | @Configuration
6 | @Profile("production")
7 | public class ProductionConfiguration {
8 |
9 | // ...
10 |
11 | }
12 | ```
13 | 你可以使用 spring.profiles.active Environment 属性来指定激活哪个 profiles。你可以用前面章节描述的任何方式指定属性。例如,你可以在 application.properties 中包括它,如下面示例所示:
14 |
15 | spring.profiles.active=dev,hsqldb
16 |
17 | 通过使用 --spring.profiles.active=dev,hsqldb,你还可以在命令行上指定它。
18 |
19 | ## 25.1、添加活动配置文件
20 |
21 | spring.profiles.active 属性遵循与其他属性相同的排序规则:最高的 PropertySource 获胜。这意味着你可以在 application.properties 中指定活动的 profiles,然后通过使用命令行开关替换它们。
22 |
23 | 有时,将特定 profile 的属性添加到活动的 profiles 而不是替换它们是很有用的。spring.profiles.include 属性可用于无条件添加活动的 profiles。SpringApplication 入口点还有一个用于设置其他 profiles 的 Java API(也就是说,在 spring.profiles.active 属性激活的对象之上)。请查看 SpringApplication 中的 setAdditionalProfiles() 方法。
24 |
25 | 例如,当带以下属性的应用程序通过使用开关:--spring.profiles.active=prod 运行时,proddb 和 prodmq profiles 也被激活:
26 |
27 | ---
28 | my.property: fromyamlfile
29 | ---
30 | spring.profiles: prod
31 | spring.profiles.include:
32 | - proddb
33 | - prodmq
34 |
35 | 注释:请记住,可以在 YAML 文档中定义 spring.profiles 属性,以确定配置中何时包含此特定文档。详见[第 77.7 节:根据环境更改配置](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/howto-properties-and-configuration.html#howto-change-configuration-depending-on-the-environment)。
36 |
37 | ## 25.2、以编程方式设置配置文件
38 |
39 | 在运行应用程序之前,可以通过调用 SpringApplication.setAdditionalProfiles(…)以编程方式设置活动的 profiles。也可以使用 Spring 的 ConfigurableEnvironment 接口激活 profiles。
40 |
41 | ## 25.3、特定 profile 的配置文件
42 |
43 | application.properties(或 application.yml)和通过 @ConfigurationProperties 引用的文件,这两者的特定 profile 变体都被视为文件并被加载。详见[第 24.4 节:特定 profile 的属性](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties)。
44 |
--------------------------------------------------------------------------------
/spring-boot/reference/04SpringBoot功能/27、国际化.md:
--------------------------------------------------------------------------------
1 | # 27、国际化
2 |
3 | Spring Boot 支持本地化消息,因此你的应用程序可以满足不同语言偏好的用户。默认情况下,Spring Boot 会在类路径根目录中查找是否存在 messages 资源包。
4 |
5 | 注释:当配置的资源包的默认属性文件可用时(即默认情况下为 messages.properties),将应用自动配置。如果资源包仅包含特定语言的属性文件,则需要添加默认值。
6 |
7 | 可以使用 spring.messages 命名空间配置资源包的基名以及其他几个属性,如下面示例所示:
8 |
9 | spring.messages.basename=messages,config.i18n.messages
10 | spring.messages.fallback-to-system-locale=false
11 |
12 | 提示:spring.messages.basename 支持以逗号分隔的位置列表,可以是包限定符,也可以是从类路径根解析的资源。
13 |
14 | 有关更多支持的选项,请参见 [MessageSourceProperties](https://github.com/spring-projects/spring-boot/tree/v2.1.6.RELEASE/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/context/MessageSourceProperties.java)。
--------------------------------------------------------------------------------
/spring-boot/reference/04SpringBoot功能/28、JSON.md:
--------------------------------------------------------------------------------
1 | # 28、JSON
2 |
3 | Spring Boot 提供了与三个 JSON 映射库的集成:
4 |
5 | (1)Gson
6 | (2)Jackson
7 | (3)JSON-B
8 |
9 | Jackson 是首选和默认库。
10 |
11 | ## 28.1、Jackson
12 |
13 | 提供了 Jackson 的自动配置,Jackson 是 spring-boot-starter-json 的一部分。当 Jackson 在类路径上时,会自动配置一个 ObjectMapper bean。为[自定义 ObjectMapper 的配置](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper)提供了几个配置属性。
14 |
15 | ## 28.2、Gson
16 |
17 | 提供 Gson 的自动配置。当 Gson 位于类路径上时,将自动配置 Gson bean。提供了几个 spring.gson.* 配置属性来定制配置。要获得更多控制,可以使用一个或多个 GsonBuilderCustomizer bean。
18 |
19 | ## 28.3、JSON-B
20 |
21 | 提供了 JSON-B 的自动配置。当 JSON-B API 和其一个实现在类路径上时,Jsonb bean 将自动配置。首选的 JSON-B 实现是 Apache Johnzon,它提供了依赖管理。
22 |
23 |
--------------------------------------------------------------------------------
/spring-boot/reference/04SpringBoot功能/30、安全.md:
--------------------------------------------------------------------------------
1 | # 30、安全
2 |
3 | 如果 Spring Security 在类路径上,那么 web 应用程序在默认情况下是安全的。Spring Boot 依赖于 Spring Security 的内容协商策略来决定是使用 httpBasic 还是 formLogin。要向 web 应用程序添加方法级安全性,还可以使用所需设置添加 @EnableGlobalMethodSecurity。其他信息可以在 Spring 安全参考指南中找到。
4 |
5 | 默认的 UserDetailsService 只有一个用户。用户名是 user,密码是随机的,在应用程序启动时在 INFO 级别打印,如下例所示:
6 |
7 | Using generated security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35
8 |
9 | 注释:如果你微调了日志配置,请确保 org.springframework.boot.autoconfigure.security 类别设置为日志 INFO 级别的消息。否则,不会打印默认密码。
10 |
11 | 你可以通过提供 spring.security.user.name 和 spring.security.user.password 来更改用户名和密码。
12 |
13 | 默认情况下,web 应用程序的基本功能是:
14 |
15 | (1)一个具有内存存储的 UserDetailService(或者在 WebFlux 应用程序的情况下是 ReactiveUserDetailService)bean 和一个具有生成密码的用户(有关用户的属性,请参阅 [SecurityProperties.User](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/api/org/springframework/boot/autoconfigure/security/SecurityProperties.User.html))。
16 |
17 | (2)整个应用程序的基于表单的登录或 HTTP 基于安全性(取决于请求中的 Accept 头)(如果 actuator 位于类路径上,则包括 actuator 端点)。
18 |
19 | (3)用于发布身份验证事件的 DefaultAuthenticationEventPublisher。
20 |
21 | 你可以通过为它添加一个 bean 来提供一个不同的 AuthenticationEventPublisher。
22 |
23 | ## 30.1、MVC 安全
24 |
25 | 默认的安全配置在 SecurityAutoConfiguration 和 UserDetailsServiceAutoConfiguration 中实现。SecurityAutoConfiguration 导入 SpringBootWebSecurityConfiguration 用于 web 安全和 UserDetailsServiceAutoConfiguration 用于配置身份验证,这在非 web 应用程序中也是相关的。要完全关闭默认的 web 应用程序安全配置,可以添加 WebSecurityConfiguerAdapter 类型的 bean(这样做不会禁用 UserDetailsService 配置或 Actuator 的安全性)。
26 |
27 | 还要关闭 UserDetailsService 配置,可以添加 UserDetailService、AuthenticationProvider 或 AuthenticationManager 类型的 bean。在 [Spring Boot 示例](https://github.com/spring-projects/spring-boot/tree/v2.1.6.RELEASE/spring-boot-samples/)中有几个安全应用程序可以帮助你开始使用常见的用例。
28 |
29 | 访问规则可以通过添加自定义 WebSecurityConfigurerAdapter 来重写。Spring Boot 提供了一些方便的方法,可以用来覆盖 actuator 端点和静态资源的访问规则。EndpointRequest 可用于创建基于 management.endpoints.web.base-path 属性的 RequestMatcher。PathRequest 可用于为常用位置的资源创建 RequestMatcher。
30 |
31 | ## 30.2、WebFlux 安全
32 |
33 | 与 Spring MVC 应用程序类似,你可以通过添加 spring-boot-starter-security 依赖项来保护 WebFlux 应用程序。默认安全配置是在 ReactiveSecurityAutoConfiguration 和 UserDetailServiceAutoConfiguration 中实现的。ReactiveSecurityAutoConfiguration 导入 WebFluxSecurityConfiguration 用于 web 安全和 UserDetailsServiceAutoConfiguration 用于配置身份验证,这在非 web 应用程序中也是相关的。要完全关闭默认的 web 应用程序安全配置,可以添加 WebFilterChainProxy 类型的 bean(这样做不会禁用 UserDetailsService 配置或 Actuator 的安全性)。
34 |
35 | 还要关闭 UserDetailsService 配置,可以添加 ReactiveUserDetailService 或 ReactiveAuthenticationManager 类型的 bean。
36 |
37 | 访问规则可以通过添加自定义 SecurityWebFilterChain 来重写。Spring Boot 提供了一些方便的方法,可以用来覆盖 actuator 端点和静态资源的访问规则。EndpointRequest 可用于创建基于 management.endpoints.web.base-path 属性的 ServerWebExchangeMatcher。
38 |
39 | PathRequest 可用于为常用位置的资源创建 ServerWebExchangeMatcher。
40 |
41 | 例如,你可以通过添加类似以下内容来自定义安全性配置:
42 | ```
43 | @Bean
44 | public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
45 | return http
46 | .authorizeExchange()
47 | .matchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
48 | .pathMatchers("/foo", "/bar")
49 | .authenticated().and()
50 | .formLogin().and()
51 | .build();
52 | }
53 | ```
54 | ## 30.3、OAuth2
55 |
56 | OAuth2 是 Spring 支持的一个广泛使用的授权框架。
57 |
58 | ### 30.3.1、客户端
59 |
60 | 如果类路径上有 spring-security-oauth2-client,那么可以利用一些自动配置来轻松设置 OAuth2/Open ID Connect 客户端。此配置使用 OAuth2ClientProperties 下的属性。同样的属性适用于 servlet 和反应式应用程序。
61 |
62 | 可以在 spring.security.oauth2.client 前缀下注册多个 OAuth2 客户端和提供者,如下面示例所示:
63 |
64 | spring.security.oauth2.client.registration.my-client-1.client-id=abcd
65 | spring.security.oauth2.client.registration.my-client-1.client-secret=password
66 | spring.security.oauth2.client.registration.my-client-1.client-name=Client for user scope
67 | spring.security.oauth2.client.registration.my-client-1.provider=my-oauth-provider
68 | spring.security.oauth2.client.registration.my-client-1.scope=user
69 | spring.security.oauth2.client.registration.my-client-1.redirect-uri-template=https://my-redirect-uri.com
70 | spring.security.oauth2.client.registration.my-client-1.client-authentication-method=basic
71 | spring.security.oauth2.client.registration.my-client-1.authorization-grant-type=authorization_code
72 |
73 | spring.security.oauth2.client.registration.my-client-2.client-id=abcd
74 | spring.security.oauth2.client.registration.my-client-2.client-secret=password
75 | spring.security.oauth2.client.registration.my-client-2.client-name=Client for email scope
76 | spring.security.oauth2.client.registration.my-client-2.provider=my-oauth-provider
77 | spring.security.oauth2.client.registration.my-client-2.scope=email
78 | spring.security.oauth2.client.registration.my-client-2.redirect-uri-template=https://my-redirect-uri.com
79 | spring.security.oauth2.client.registration.my-client-2.client-authentication-method=basic
80 | spring.security.oauth2.client.registration.my-client-2.authorization-grant-type=authorization_code
81 |
82 | spring.security.oauth2.client.provider.my-oauth-provider.authorization-uri=http://my-auth-server/oauth/authorize
83 | spring.security.oauth2.client.provider.my-oauth-provider.token-uri=http://my-auth-server/oauth/token
84 | spring.security.oauth2.client.provider.my-oauth-provider.user-info-uri=http://my-auth-server/userinfo
85 | spring.security.oauth2.client.provider.my-oauth-provider.user-info-authentication-method=header
86 | spring.security.oauth2.client.provider.my-oauth-provider.jwk-set-uri=http://my-auth-server/token_keys
87 | spring.security.oauth2.client.provider.my-oauth-provider.user-name-attribute=name
88 |
89 | 对于支持 OpenID Connect 发现的 OpenID Connect 提供者,可以进一步简化配置。提供者需要用 issuer-uri 配置,该 uri 是它断言为其 Issuer Identifier 的URI。例如,如果提供的 issuer-uri 是“https ://example.com ”,那么将向“https ://example.com/.well-known/openid-configuration ”发出 OpenID Provider Configuration Request。结果应该是 OpenID Provider Configuration Response。以下示例显示如何使用 issuer-uri 配置 OpenID Connect Provider:
90 |
91 | spring.security.oauth2.client.provider.oidc-provider.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
92 |
93 | 默认情况下,Spring Security 的 OAuth2LoginAuthenticationFilter 只处理匹配 /login/oauth2/code/* 的 URLs。如果希望自定义 redirect-uri 以使用不同的模式,则需要提供配置来处理该自定义模式。例如,对于 servlet 应用程序,你可以添加自己的 WebSecurityConfigurerAdapter,类似于以下内容:
94 | ```
95 | public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {
96 |
97 | @Override
98 | protected void configure(HttpSecurity http) throws Exception {
99 | http
100 | .authorizeRequests()
101 | .anyRequest().authenticated()
102 | .and()
103 | .oauth2Login()
104 | .redirectionEndpoint()
105 | .baseUri("/custom-callback");
106 | }
107 | }
108 | ```
109 | **常见提供者的 OAuth2 客户端注册**
110 |
111 | 对于常见的 OAuth2 和 OpenID 提供者,包括 Google、GitHub、Facebook 和Okta,我们提供了一组提供者默认值(分别是 google、gitHub、facebook 和 okta)。
112 |
113 | 如果不需要自定义这些提供程序,可以将 provider 属性设置为需要推断其默认值的属性。此外,如果客户端注册的 key 与默认支持的提供程序匹配,那么 Spring Boot 也会推断出这一点。
114 |
115 | 换句话说,以下示例中的两个配置使用 Google 提供者:
116 |
117 | spring.security.oauth2.client.registration.my-client.client-id=abcd
118 | spring.security.oauth2.client.registration.my-client.client-secret=password
119 | spring.security.oauth2.client.registration.my-client.provider=google
120 |
121 | spring.security.oauth2.client.registration.google.client-id=abcd
122 | spring.security.oauth2.client.registration.google.client-secret=password
123 |
124 | ### 30.3.2、资源服务器
125 |
126 | 如果类路径上有 spring-security-oauth2-resource-server,那么只要指定了 JWK Set URI 或 OIDC Issuer URI,Spring Boot 就可以设置 OAuth2 Resource Server,如下面示例所示:
127 |
128 | spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://example.com/oauth2/default/v1/keys
129 | spring.security.oauth2.resourceserver.jwt.issuer-uri=https://dev-123456.oktapreview.com/oauth2/default/
130 |
131 | 相同的属性适用于 servlet 和反应式应用程序。
132 |
133 | 或者,你可以为 servlet 应用程序定义自己的 JwtDecoder bean,或者为反应式应用程序定义一个 ReactiveJwtDecoder。
134 |
135 | ### 30.3.3、认证服务器
136 |
137 | 目前,Spring Security 不支持实现 OAuth 2.0 认证服务器。但是,这个功能可以从 Spring Security OAuth 项目获得,该项目最终将被 Spring Security 完全取代。在此之前,你可以使用 spring-security-oauth2-autoconfigure 模块轻松设置 OAuth 2.0 认证服务器;有关说明,请参阅其[文档](https://docs.spring.io/spring-security-oauth2-boot)。
138 |
139 | ## 30.4、Actuator 安全
140 |
141 | 出于安全目的,默认情况下,除 /health 和 /info 之外的所有 actuators 都将被禁用。management.endpoints.web.exposure.include 属性可用于启用 actuators。
142 |
143 | 如果 Spring Security 位于类路径上,并且没有其他 WebSecurityConfigurerAdapter,那么除了 /health 和 /info 之外的所有 actuators 都由 Spring Boot 自动配置进行保护。如果你定义了一个自定义的 WebSecurityConfigurerAdapter,Spring Boot 自动配置将退出,你将完全控制 actuator 访问规则。
144 |
145 | 注释:在设置 management.endpoints.web.exposure.include 之前,请确保暴露的 actuators 不包含敏感信息,并且/或通过将其置于防火墙后或通过类似于 Spring Security 的方式进行保护。
146 |
147 | ### 30.4.1、跨站点请求防伪保护
148 |
149 | 由于 Spring Boot 依赖于 Spring Security 的默认值,所以 CSRF 保护默认打开。这意味着当使用默认安全配置时,需要 POST(关闭和记录器端点)、PUT 或 DELETE 的 actuator 端点将得到 403 禁止错误。
150 |
151 | 注释:我们建议仅在创建非浏览器客户端使用的服务时才完全禁用 CSRF 保护。
152 |
153 | 有关 CSRF 保护的其他信息,请参见 [Spring 安全参考指南](https://docs.spring.io/spring-security/site/docs/5.1.5.RELEASE/reference/htmlsingle#csrf)。
154 |
--------------------------------------------------------------------------------
/spring-boot/reference/04SpringBoot功能/33、缓存.md:
--------------------------------------------------------------------------------
1 | # 33、缓存
2 |
3 | Spring Framework 支持透明地向应用程序添加缓存。抽象的核心是将缓存应用于方法,从而根据缓存中可用的信息减少执行次数。缓存逻辑的应用是透明的,不会对调用程序造成任何干扰。只要通过 @EnableCaching 注解启用了缓存支持,Spring Boot 就会自动配置缓存基础结构。
4 |
5 | 注释:有关更多详细信息,请查看 Spring Framework 参考的[相关部分](https://docs.spring.io/spring/docs/5.1.8.RELEASE/spring-framework-reference/integration.html#cache)。
6 |
7 | 简而言之,向服务的操作添加缓存与向其方法添加相关注解一样简单,如下面示例所示:
8 | ```
9 | import org.springframework.cache.annotation.Cacheable;
10 | import org.springframework.stereotype.Component;
11 |
12 | @Component
13 | public class MathService {
14 |
15 | @Cacheable("piDecimals")
16 | public int computePiDecimal(int i) {
17 | // ...
18 | }
19 |
20 | }
21 | ```
22 | 此示例演示如何在可能代价高昂的操作上使用缓存。在调用 computePiDecimal 之前,抽象在 piDecimals 缓存中查找与 i 参数匹配的条目。如果找到一个条目,缓存中的内容会立即返回给调用方,并且不会调用该方法。否则,将调用该方法,并在返回值之前更新缓存。
23 |
24 | 当心:你还可以透明地使用标准 JSR-107(JCache)注解(例如 @CacheResult )。但是,我们强烈建议你不要混合和匹配 Spring Cache 和 JCache 注解。
25 |
26 | 如果不添加任何特定的缓存库,Spring Boot 会自动配置一个在内存中使用并发映射的简单提供器。当需要缓存时(如上例中的 piDecimals),此提供器将为你创建缓存。简单的提供器并不是真正推荐用于生产,但它对于入门和确保你了解这些特性非常有用。当你决定使用缓存提供器时,请确保阅读其文档以了解如何配置应用程序使用的缓存。几乎所有提供器都要求你显式配置在应用程序中使用的每个缓存。有些提供了一种自定义由 spring.cache.cache-names 属性定义的默认缓存的方法。
27 |
28 | 提示:也可以透明地从缓存中更新或移除数据。
29 |
30 | ## 33.1、支持的缓存提供器
31 |
32 | 缓存抽象不提供实际的存储,依赖于 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口实现的抽象。
33 |
34 | 如果尚未定义 CacheManager 类型的 bean 或名为 cacheResolver 的 CacheResolver(请参阅 CachingConfigurer),则 Spring Boot 将尝试检测以下提供器(按指示的顺序):
35 |
36 | (1)[Generic](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-caching.html#boot-features-caching-provider-generic)
37 |
38 | (2)[JCache(JSR-107)(EhCache 3、Hazelcast、Infinispan 和其它)](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-caching.html#boot-features-caching-provider-jcache)
39 |
40 | (3)[EhCache 2.x](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-caching.html#boot-features-caching-provider-ehcache2)
41 |
42 | (4)[Hazelcast](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-caching.html#boot-features-caching-provider-hazelcast)
43 |
44 | (5)[Infinispan](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-caching.html#boot-features-caching-provider-infinispan)
45 |
46 | (6)[Couchbase](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-caching.html#boot-features-caching-provider-couchbase)
47 |
48 | (7)[Redis](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-caching.html#boot-features-caching-provider-redis)
49 |
50 | (8)[Caffeine](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-caching.html#boot-features-caching-provider-caffeine)
51 |
52 | (9)[Simple](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-caching.html#boot-features-caching-provider-simple)
53 |
54 | 提示:也可以通过设置 spring.cache.type 属性强制特定的缓存提供器。如果需要在某些环境(如测试)中完全禁用缓存,请使用此属性。
55 |
56 | 提示:使用 spring-boot-starter-cache “Starter”快速添加基本缓存依赖项。该 starter 提供了spring-context-support。如果手动添加依赖项,则必须包含 spring-context-support 才能使用 JCache、EhCache 2.x 或 Guava 支持。
57 |
58 | 如果 CacheManager 是由 Spring Boot 自动配置的,则可以通过公开实现 CacheManagerCustomizer 接口的 bean,在完全初始化之前进一步优化其配置。下面的示例设置一个标志,表示 null 值应该向下传递到底层映射:
59 | ```
60 | @Bean
61 | public CacheManagerCustomizer cacheManagerCustomizer() {
62 | return new CacheManagerCustomizer() {
63 | @Override
64 | public void customize(ConcurrentMapCacheManager cacheManager) {
65 | cacheManager.setAllowNullValues(false);
66 | }
67 | };
68 | }
69 | ```
70 | 注释:在前面的示例中,需要一个自动配置的 ConcurrentMapCacheManager。如果不是这样(你提供了自己的配置或自动配置了其他缓存提供器),则根本不会调用自定义程序。你可以拥有任意数量的自定义程序,还可以使用 @Order 或 Ordered 对它们进行排序。
71 |
72 | ### 33.1.1、Generic
73 |
74 | 如果上下文定义了至少一个 org.springframework.cache.Cache bean,则使用 Generic 缓存。将创建包装该类型所有 bean 的 CacheManager。
75 |
76 | ### 33.1.2、JCache(JSR-107)
77 |
78 | JCache 是通过类路径上的 javax.cache.spi.CachingProvider 来引导的(也就是说,类路径上存在一个兼容 JSR-107 的缓存库),JCacheCacheManager 是由 spring-boot-starter-cache “Starter”提供的。有各种兼容的库可用,Spring Boot 为 Ehcache 3、Hazelcast 和 Infinispan 提供了依赖管理。也可以添加任何其他兼容的库。
79 |
80 | 可能会出现多个提供器,在这种情况下,必须显式指定提供器。即使 JSR-107 标准没有强制使用标准化的方式来定义配置文件的位置,Spring Boot 也尽其所能地适应设置带有实现细节的缓存,如下面示例所示:
81 |
82 | # Only necessary if more than one provider is present
83 | spring.cache.jcache.provider=com.acme.MyCachingProvider
84 | spring.cache.jcache.config=classpath:acme.xml
85 |
86 | 注释:当缓存库同时提供本地实现和 JSR-107 支持时,Spring Boot 更喜欢 JSR-107 支持,因此如果切换到不同的 JSR-107 实现,也可以使用相同的特性。
87 |
88 | 提示:Spring Boot 一般支持 Hazelcast。如果只有一个 HazelcastInstance 可用,那么它也会自动为 CacheManager 重用,除非指定了 spring.cache.jcache.config 属性。
89 |
90 | 有两种方法可以自定义底层 javax.cache.cacheManager:
91 |
92 | (1)通过设置 spring.cache.cache-names 属性,可以在启动时创建缓存。如果定义了自定义 javax.cache.configuration.Configuration bean,则使用它来自定义缓存。
93 |
94 | (2)使用 CacheManager 的引用调用 org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer bean 以进行完全定制。
95 |
96 | 提示:如果定义了一个标准的 javax.cache.CacheManager bean,它将自动包装在抽象所期望的 org.springframework.cache.CacheManager 实现中。不会对其应用进一步的自定义。
97 |
98 | ### 33.1.3、EhCache 2.x
99 |
100 | 如果可以在类路径的根目录中找到名为 EhCache.xml 的文件,则使用 EhCache 2.x。如果找到 EhCache 2.x,则使用 spring-boot-starter-cache “Starter”提供的 EhCacheCacheManager 来引导缓存管理器。还可以提供另一个配置文件,如下面示例所示:
101 |
102 | spring.cache.ehcache.config=classpath:config/another-config.xml
103 |
104 | ### 33.1.4、Hazelcast
105 |
106 | Spring Boot [一般支持 Hazelcast](https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-hazelcast.html)。如果 HazelcastInstance 已经自动配置,它将自动包装在 CacheManager 中。
107 |
108 | ### 33.1.5、Infinispan
109 |
110 | [Infinispan](https://infinispan.org/) 没有默认的配置文件位置,因此必须显式指定它。否则,将使用默认引导。
111 |
112 | spring.cache.infinispan.config=infinispan.xml
113 |
114 | 通过设置 spring.cache.cache-names 属性,可以在启动时创建缓存。如果定义了自定义 ConfigurationBuilder bean,它将用于自定义缓存。
115 |
116 | 注释:Infinispan 在 Spring Boot 中的支持仅限于嵌入式模式,是相当基础的。如果你想要更多的选择,你应该使用官方的 Infinispan Spring Boot starter。请参阅 [Infinispan 的文档](https://github.com/infinispan/infinispan-spring-boot)以了解更多详细信息。
117 |
118 | ### 33.1.6、Couchbase
119 |
120 | 如果 Couchbase Java 客户端和 couchbase-spring-cache 实现可用并且 Couchbase 已配置,则 CouchbaseCacheManager 将自动配置。还可以通过设置 spring.cache.cache-names 属性在启动时创建其他缓存。这些缓存在自动配置的 Bucket 上操作。还可以使用自定义程序在另一个 Bucket 上创建其他缓存。假设你需要“main” Bucket 上的两个缓存(cache1和cache2)和“another” Bucket 上的一个(cache3)缓存(自定义生存时间为2秒)。你可以通过配置创建前两个缓存,如下所示:
121 |
122 | spring.cache.cache-names=cache1,cache2
123 |
124 | 你可以通过配置创建前两个缓存,如下所示:
125 | ```
126 | @Configuration
127 | public class CouchbaseCacheConfiguration {
128 |
129 | private final Cluster cluster;
130 |
131 | public CouchbaseCacheConfiguration(Cluster cluster) {
132 | this.cluster = cluster;
133 | }
134 |
135 | @Bean
136 | public Bucket anotherBucket() {
137 | return this.cluster.openBucket("another", "secret");
138 | }
139 |
140 | @Bean
141 | public CacheManagerCustomizer cacheManagerCustomizer() {
142 | return c -> {
143 | c.prepareCache("cache3", CacheBuilder.newInstance(anotherBucket())
144 | .withExpiration(2));
145 | };
146 | }
147 |
148 | }
149 | ```
150 | 此示例配置重用通过自动配置创建的 Cluster。
151 |
152 | ### 33.1.7、Redis
153 |
154 | 如果 Redis 可用并已配置,则会自动配置 RedisCacheManager。可以通过设置 spring.cache.cache-names 属性在启动时创建其他缓存,可以使用 spring.cache.redis.* 属性配置缓存默认值。例如,以下配置创建的 cache1 和 cache2 缓存的生存时间为 10 分钟:
155 |
156 | spring.cache.cache-names=cache1,cache2
157 | spring.cache.redis.time-to-live=600000
158 |
159 | 注释:默认情况下,会添加一个键前缀,以便如果两个单独的缓存使用同一个键,则 Redis 没有重叠的键,并且不能返回无效值。如果创建自己的 RedisCacheManager,强烈建议保持启用此设置。
160 |
161 | 提示:你可以通过添加自己的 RedisCacheConfiguration @Bean 来完全控制配置。如果你希望自定义序列化策略,则这可能非常有用。
162 |
163 | ### 33.1.8、Caffeine
164 |
165 | Caffeine 是对 Guava 缓存的 Java 8 重写,取代了对 Guava 的支持。如果存在 Caffeine,则会自动配置 CaffeineCacheManager(由 spring-boot-starter-cache “Starter” 提供)。通过设置 spring.cache.cache-names 属性,可以在启动时创建缓存,并且可以通过以下方式之一进行自定义(按指定顺序):
166 |
167 | (1)由 spring.cache.caffine.spec 定义的缓存规范
168 | (2)定义了一个 com.github.benmanes.caffeine.cache.CaffeineSpec bean
169 | (3)定义了一个 com.github.benmanes.caffeine.cache.Caffeine bean
170 |
171 | 例如,以下配置创建 cache1 和 cache2 缓存,最大大小为 500,生存时间为 10 分钟:
172 |
173 | spring.cache.cache-names=cache1,cache2
174 | spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s
175 |
176 | 如果定义了 com.github.benmanes.caffine.cache.CacheLoader bean,它将自动关联到 CaffeineCacheManager。由于 CacheLoader 将与缓存管理器管理的所有缓存关联,因此必须将其定义为 CacheLoader