diff --git a/Spring-Boot/version/documents/2.0.0/guide.md b/Spring-Boot/version/documents/2.0.0/guide.md
new file mode 100644
index 0000000000000000000000000000000000000000..759d104464cb1bcb693f142efab8b190bf48e6aa
--- /dev/null
+++ b/Spring-Boot/version/documents/2.0.0/guide.md
@@ -0,0 +1,15021 @@
+# Spring Boot Reference Guide
+
+### [中文文档](README_CN.md)
+
+## Authors
+
+Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch, Andy Wilkinson, Marcel Overdijk, Christian Dupuis, Sébastien Deleuze, Michael Simons, VedranPavić, Jay Bryant, Madhura Bhave
+
+**2.0.0.BUILD-SNAPSHOT**
+
+Copyright © 2012-2018
+
+*Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this* *Copyright Notice, whether distributed in print or electronically.*
+
+------
+
+**Table of Contents**
+
+- [I. Spring Boot Documentation](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-documentation)
+
+ - [1. About the Documentation](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-documentation-about)
+ - [2. Getting Help](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-documentation-getting-help)[3. First Steps](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-documentation-first-steps)[4. Working with Spring Boot](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_working_with_spring_boot)[5. Learning about Spring Boot Features](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_learning_about_spring_boot_features)[6. Moving to Production](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_moving_to_production)[7. Advanced Topics](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_advanced_topics)
+
+- [II. Getting Started](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started)
+
+ [8. Introducing Spring Boot](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-introducing-spring-boot)[9. System Requirements](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-system-requirements)[9.1. Servlet Containers](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-system-requirements-servlet-containers)[10. Installing Spring Boot](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-installing-spring-boot)[10.1. Installation Instructions for the Java Developer](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-installation-instructions-for-java)[10.1.1. Maven Installation](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-maven-installation)[10.1.2. Gradle Installation](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-gradle-installation)[10.2. Installing the Spring Boot CLI](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-installing-the-cli)[10.2.1. Manual Installation](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-manual-cli-installation)[10.2.2. Installation with SDKMAN!](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-sdkman-cli-installation)[10.2.3. OSX Homebrew Installation](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-homebrew-cli-installation)[10.2.4. MacPorts Installation](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-macports-cli-installation)[10.2.5. Command-line Completion](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-cli-command-line-completion)[10.2.6. Quick-start Spring CLI Example](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-cli-example)[10.3. Upgrading from an Earlier Version of Spring Boot](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-upgrading-from-an-earlier-version)[11. Developing Your First Spring Boot Application](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-first-application)[11.1. Creating the POM](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-first-application-pom)[11.2. Adding Classpath Dependencies](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-first-application-dependencies)[11.3. Writing the Code](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-first-application-code)[11.3.1. The @RestController and @RequestMapping Annotations](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-first-application-annotations)[11.3.2. The @EnableAutoConfiguration Annotation](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-first-application-auto-configuration)[11.3.3. The “main” Method](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-first-application-main-method)[11.4. Running the Example](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-first-application-run)[11.5. Creating an Executable Jar](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-first-application-executable-jar)[12. What to Read Next](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-whats-next)
+
+- [III. Using Spring Boot](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot)
+
+ [13. Build Systems](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-build-systems)[13.1. Dependency Management](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-dependency-management)[13.2. Maven](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-maven)[13.2.1. Inheriting the Starter Parent](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-maven-parent-pom)[13.2.2. Using Spring Boot without the Parent POM](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-maven-without-a-parent)[13.2.3. Using the Spring Boot Maven Plugin](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-maven-plugin)[13.3. Gradle](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-gradle)[13.4. Ant](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-ant)[13.5. Starters](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-starter)[14. Structuring Your Code](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-structuring-your-code)[14.1. Using the “default” Package](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-using-the-default-package)[14.2. Locating the Main Application Class](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-locating-the-main-class)[15. Configuration Classes](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-configuration-classes)[15.1. Importing Additional Configuration Classes](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-importing-configuration)[15.2. Importing XML Configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-importing-xml-configuration)[16. Auto-configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-auto-configuration)[16.1. Gradually Replacing Auto-configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-replacing-auto-configuration)[16.2. Disabling Specific Auto-configuration Classes](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-disabling-specific-auto-configuration)[17. Spring Beans and Dependency Injection](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-spring-beans-and-dependency-injection)[18. Using the @SpringBootApplication Annotation](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-using-springbootapplication-annotation)[19. Running Your Application](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-running-your-application)[19.1. Running from an IDE](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-running-from-an-ide)[19.2. Running as a Packaged Application](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-running-as-a-packaged-application)[19.3. Using the Maven Plugin](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-running-with-the-maven-plugin)[19.4. Using the Gradle Plugin](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-running-with-the-gradle-plugin)[19.5. Hot Swapping](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-hot-swapping)[20. Developer Tools](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools)[20.1. Property Defaults](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-property-defaults)[20.2. Automatic Restart](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-restart)[20.2.1. Logging changes in condition evaluation](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-restart-logging-condition-delta)[20.2.2. Excluding Resources](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-restart-exclude)[20.2.3. Watching Additional Paths](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-restart-additional-paths)[20.2.4. Disabling Restart](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-restart-disable)[20.2.5. Using a Trigger File](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-restart-triggerfile)[20.2.6. Customizing the Restart Classloader](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-customizing-classload)[20.2.7. Known Limitations](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-known-restart-limitations)[20.3. LiveReload](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-livereload)[20.4. Global Settings](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-globalsettings)[20.5. Remote Applications](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-remote)[20.5.1. Running the Remote Client Application](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_running_the_remote_client_application)[20.5.2. Remote Update](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-remote-update)[21. Packaging Your Application for Production](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-packaging-for-production)[22. What to Read Next](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-whats-next)
+
+- [IV. Spring Boot features](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features)
+
+ [23. SpringApplication](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-application)[23.1. Startup Failure](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-startup-failure)[23.2. Customizing the Banner](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-banner)[23.3. Customizing SpringApplication](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-customizing-spring-application)[23.4. Fluent Builder API](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-fluent-builder-api)[23.5. Application Events and Listeners](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-application-events-and-listeners)[23.6. Web Environment](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-web-environment)[23.7. Accessing Application Arguments](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-application-arguments)[23.8. Using the ApplicationRunner or CommandLineRunner](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-command-line-runner)[23.9. Application Exit](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-application-exit)[23.10. Admin Features](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-application-admin)[24. Externalized Configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config)[24.1. Configuring Random Values](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-random-values)[24.2. Accessing Command Line Properties](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-command-line-args)[24.3. Application Property Files](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-application-property-files)[24.4. Profile-specific Properties](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-profile-specific-properties)[24.5. Placeholders in Properties](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-placeholders-in-properties)[24.6. Using YAML Instead of Properties](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-yaml)[24.6.1. Loading YAML](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-loading-yaml)[24.6.2. Exposing YAML as Properties in the Spring Environment](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-exposing-yaml-to-spring)[24.6.3. Multi-profile YAML Documents](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-multi-profile-yaml)[24.6.4. YAML Shortcomings](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-yaml-shortcomings)[24.6.5. Merging YAML Lists](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-complex-type-merge)[24.7. Type-safe Configuration Properties](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-typesafe-configuration-properties)[24.7.1. Third-party Configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-3rd-party-configuration)[24.7.2. Relaxed Binding](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-relaxed-binding)[24.7.3. Properties Conversion](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-conversion)[Converting durations](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-conversion-duration)[24.7.4. @ConfigurationProperties Validation](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-validation)[24.7.5. @ConfigurationProperties vs. @Value](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-vs-value)[25. Profiles](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-profiles)[25.1. Adding Active Profiles](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-adding-active-profiles)[25.2. Programmatically Setting Profiles](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-programmatically-setting-profiles)[25.3. Profile-specific Configuration Files](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-profile-specific-configuration)[26. Logging](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-logging)[26.1. Log Format](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-logging-format)[26.2. Console Output](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-logging-console-output)[26.2.1. Color-coded Output](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-logging-color-coded-output)[26.3. File Output](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-logging-file-output)[26.4. Log Levels](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-custom-log-levels)[26.5. Custom Log Configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-custom-log-configuration)[26.6. Logback Extensions](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-logback-extensions)[26.6.1. Profile-specific Configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_profile_specific_configuration)[26.6.2. Environment Properties](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_environment_properties)[27. Developing Web Applications](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-developing-web-applications)[27.1. The “Spring Web MVC Framework”](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc)[27.1.1. Spring MVC Auto-configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-auto-configuration)[27.1.2. HttpMessageConverters](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-message-converters)[27.1.3. Custom JSON Serializers and Deserializers](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-json-components)[27.1.4. MessageCodesResolver](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-message-codes)[27.1.5. Static Content](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-static-content)[27.1.6. Welcome Page](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-welcome-page)[27.1.7. Custom Favicon](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-favicon)[27.1.8. Path Matching and Content Negotiation](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-pathmatch)[27.1.9. ConfigurableWebBindingInitializer](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-web-binding-initializer)[27.1.10. Template Engines](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-template-engines)[27.1.11. Error Handling](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-error-handling)[Custom Error Pages](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-error-handling-custom-error-pages)[Mapping Error Pages outside of Spring MVC](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-error-handling-mapping-error-pages-without-mvc)[27.1.12. Spring HATEOAS](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-hateoas)[27.1.13. CORS Support](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-cors)[27.2. The “Spring WebFlux Framework”](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-webflux)[27.2.1. Spring WebFlux Auto-configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-webflux-auto-configuration)[27.2.2. HTTP Codecs with HttpMessageReaders and HttpMessageWriters](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-webflux-httpcodecs)[27.2.3. Static Content](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-webflux-static-content)[27.2.4. Template Engines](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-webflux-template-engines)[27.2.5. Error Handling](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-webflux-error-handling)[Custom Error Pages](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-webflux-error-handling-custom-error-pages)[27.2.6. Web Filters](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-webflux-web-filters)[27.3. JAX-RS and Jersey](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-jersey)[27.4. Embedded Servlet Container Support](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-container)[27.4.1. Servlets, Filters, and listeners](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-container-servlets-filters-listeners)[Registering Servlets, Filters, and Listeners as Spring Beans](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-container-servlets-filters-listeners-beans)[27.4.2. Servlet Context Initialization](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-container-context-initializer)[Scanning for Servlets, Filters, and listeners](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-container-servlets-filters-listeners-scanning)[27.4.3. The ServletWebServerApplicationContext](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-container-application-context)[27.4.4. Customizing Embedded Servlet Containers](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-customizing-embedded-containers)[Programmatic Customization](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-programmatic-embedded-container-customization)[Customizing ConfigurableServletWebServerFactory Directly](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-customizing-configurableservletwebserverfactory-directly)[27.4.5. JSP Limitations](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-jsp-limitations)[28. Security](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-security)[28.1. MVC Security](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-security-mvc)[28.2. WebFlux Security](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-security-webflux)[28.3. OAuth2](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-security-oauth2)[28.3.1. Client](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-security-oauth2-client)[28.4. Actuator Security](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-security-actuator)[28.4.1. Cross Site Request Forgery Protection](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-security-csrf)[29. Working with SQL Databases](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-sql)[29.1. Configure a DataSource](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-configure-datasource)[29.1.1. Embedded Database Support](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-database-support)[29.1.2. Connection to a Production Database](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-connect-to-production-database)[29.1.3. Connection to a JNDI DataSource](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-connecting-to-a-jndi-datasource)[29.2. Using JdbcTemplate](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-using-jdbc-template)[29.3. JPA and “Spring Data”](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-jpa-and-spring-data)[29.3.1. Entity Classes](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-entity-classes)[29.3.2. Spring Data JPA Repositories](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-data-jpa-repositories)[29.3.3. Creating and Dropping JPA Databases](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-creating-and-dropping-jpa-databases)[29.3.4. Open EntityManager in View](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-jpa-in-web-environment)[29.4. Using H2’s Web Console](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-sql-h2-console)[29.4.1. Changing the H2 Console’s Path](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-sql-h2-console-custom-path)[29.5. Using jOOQ](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-jooq)[29.5.1. Code Generation](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_code_generation)[29.5.2. Using DSLContext](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_using_dslcontext)[29.5.3. jOOQ SQL Dialect](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_jooq_sql_dialect)[29.5.4. Customizing jOOQ](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_customizing_jooq)[30. Working with NoSQL Technologies](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-nosql)[30.1. Redis](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-redis)[30.1.1. Connecting to Redis](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-connecting-to-redis)[30.2. MongoDB](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-mongodb)[30.2.1. Connecting to a MongoDB Database](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-connecting-to-mongodb)[30.2.2. MongoTemplate](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-mongo-template)[30.2.3. Spring Data MongoDB Repositories](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-data-mongo-repositories)[30.2.4. Embedded Mongo](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-mongo-embedded)[30.3. Neo4j](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-neo4j)[30.3.1. Connecting to a Neo4j Database](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-connecting-to-neo4j)[30.3.2. Using the Embedded Mode](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-connecting-to-neo4j-embedded)[30.3.3. Neo4jSession](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-neo4j-ogm-session)[30.3.4. Spring Data Neo4j Repositories](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-data-neo4j-repositories)[30.3.5. Repository Example](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_repository_example)[30.4. Gemfire](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-gemfire)[30.5. Solr](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-solr)[30.5.1. Connecting to Solr](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-connecting-to-solr)[30.5.2. Spring Data Solr Repositories](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-data-solr-repositories)[30.6. Elasticsearch](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-elasticsearch)[30.6.1. Connecting to Elasticsearch by Using Jest](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-connecting-to-elasticsearch-jest)[30.6.2. Connecting to Elasticsearch by Using Spring Data](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-connecting-to-elasticsearch-spring-data)[30.6.3. Spring Data Elasticsearch Repositories](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-data-elasticsearch-repositories)[30.7. Cassandra](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-cassandra)[30.7.1. Connecting to Cassandra](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-connecting-to-cassandra)[30.7.2. Spring Data Cassandra Repositories](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-data-cassandra-repositories)[30.8. Couchbase](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-couchbase)[30.8.1. Connecting to Couchbase](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-connecting-to-couchbase)[30.8.2. Spring Data Couchbase Repositories](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-data-couchbase-repositories)[30.9. LDAP](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-ldap)[30.9.1. Connecting to an LDAP Server](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-ldap-connecting)[30.9.2. Spring Data LDAP Repositories](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-ldap-spring-data-repositories)[30.9.3. Embedded In-memory LDAP Server](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-ldap-embedded)[30.10. InfluxDB](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-influxdb)[30.10.1. Connecting to InfluxDB](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-connecting-to-influxdb)[31. Caching](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-caching)[31.1. Supported Cache Providers](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_supported_cache_providers)[31.1.1. Generic](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-caching-provider-generic)[31.1.2. JCache (JSR-107)](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-caching-provider-jcache)[31.1.3. EhCache 2.x](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-caching-provider-ehcache2)[31.1.4. Hazelcast](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-caching-provider-hazelcast)[31.1.5. Infinispan](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-caching-provider-infinispan)[31.1.6. Couchbase](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-caching-provider-couchbase)[31.1.7. Redis](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-caching-provider-redis)[31.1.8. Caffeine](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-caching-provider-caffeine)[31.1.9. Simple](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-caching-provider-simple)[31.1.10. None](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-caching-provider-none)[32. Messaging](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-messaging)[32.1. JMS](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-jms)[32.1.1. ActiveMQ Support](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-activemq)[32.1.2. Artemis Support](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-artemis)[32.1.3. Using a JNDI ConnectionFactory](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-jms-jndi)[32.1.4. Sending a Message](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-using-jms-sending)[32.1.5. Receiving a Message](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-using-jms-receiving)[32.2. AMQP](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-amqp)[32.2.1. RabbitMQ support](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-rabbitmq)[32.2.2. Sending a Message](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-using-amqp-sending)[32.2.3. Receiving a Message](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-using-amqp-receiving)[32.3. Apache Kafka Support](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-kafka)[32.3.1. Sending a Message](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-kafka-sending-a-message)[32.3.2. Receiving a Message](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-kafka-receiving-a-message)[32.3.3. Additional Kafka Properties](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-kafka-extra-props)[33. Calling REST Services with `RestTemplate`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-resttemplate)[33.1. RestTemplate Customization](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-resttemplate-customization)[34. Calling REST Services with `WebClient`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-webclient)[34.1. WebClient Customization](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-webclient-customization)[35. Validation](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-validation)[36. Sending Email](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-email)[37. Distributed Transactions with JTA](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-jta)[37.1. Using an Atomikos Transaction Manager](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-jta-atomikos)[37.2. Using a Bitronix Transaction Manager](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-jta-bitronix)[37.3. Using a Narayana Transaction Manager](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-jta-narayana)[37.4. Using a Java EE Managed Transaction Manager](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-jta-javaee)[37.5. Mixing XA and Non-XA JMS Connections](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-jta-mixed-jms)[37.6. Supporting an Alternative Embedded Transaction Manager](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-jta-supporting-alternative-embedded)[38. Hazelcast](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-hazelcast)[39. Quartz Scheduler](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-quartz)[40. Spring Integration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-integration)[41. Spring Session](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-session)[42. Monitoring and Management over JMX](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-jmx)[43. Testing](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing)[43.1. Test Scope Dependencies](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-test-scope-dependencies)[43.2. Testing Spring Applications](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-applications)[43.3. Testing Spring Boot Applications](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications)[43.3.1. Detecting Web Application Type](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-detecting-web-app-type)[43.3.2. Detecting Test Configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-detecting-config)[43.3.3. Excluding Test Configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-excluding-config)[43.3.4. Testing with a running server](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-with-running-server)[43.3.5. Mocking and Spying Beans](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-mocking-beans)[43.3.6. Auto-configured Tests](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-tests)[43.3.7. Auto-configured JSON Tests](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-json-tests)[43.3.8. Auto-configured Spring MVC Tests](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-mvc-tests)[43.3.9. Auto-configured Spring WebFlux Tests](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-webflux-tests)[43.3.10. Auto-configured Data JPA Tests](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-jpa-test)[43.3.11. Auto-configured JDBC Tests](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-jdbc-test)[43.3.12. Auto-configured jOOQ Tests](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-jooq-test)[43.3.13. Auto-configured Data MongoDB Tests](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-mongo-test)[43.3.14. Auto-configured Data Neo4j Tests](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-neo4j-test)[43.3.15. Auto-configured Data Redis Tests](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-redis-test)[43.3.16. Auto-configured Data LDAP Tests](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-ldap-test)[43.3.17. Auto-configured REST Clients](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-rest-client)[43.3.18. Auto-configured Spring REST Docs Tests](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-rest-docs)[Auto-configured Spring REST Docs Tests with Mock MVC](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-rest-docs-mock-mvc)[Auto-configured Spring REST Docs Tests with REST Assured](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-autoconfigured-rest-docs-rest-assured)[43.3.19. User Configuration and Slicing](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-testing-user-configuration)[43.3.20. Using Spock to Test Spring Boot Applications](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications-with-spock)[43.4. Test Utilities](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-test-utilities)[43.4.1. ConfigFileApplicationContextInitializer](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-configfileapplicationcontextinitializer-test-utility)[43.4.2. EnvironmentTestUtils](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-environment-test-utilities)[43.4.3. OutputCapture](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-output-capture-test-utility)[43.4.4. TestRestTemplate](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-rest-templates-test-utility)[44. WebSockets](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-websockets)[45. Web Services](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-webservices)[46. Creating Your Own Auto-configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-developing-auto-configuration)[46.1. Understanding Auto-configured Beans](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-understanding-auto-configured-beans)[46.2. Locating Auto-configuration Candidates](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-locating-auto-configuration-candidates)[46.3. Condition Annotations](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-condition-annotations)[46.3.1. Class Conditions](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-class-conditions)[46.3.2. Bean Conditions](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-bean-conditions)[46.3.3. Property Conditions](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-property-conditions)[46.3.4. Resource Conditions](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-resource-conditions)[46.3.5. Web Application Conditions](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-web-application-conditions)[46.3.6. SpEL Expression Conditions](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spel-conditions)[46.4. Testing your Auto-configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-test-autoconfig)[46.4.1. Simulating a Web Context](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_simulating_a_web_context)[46.4.2. Overriding the Classpath](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_overriding_the_classpath)[46.5. Creating Your Own Starter](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-custom-starter)[46.5.1. Naming](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-custom-starter-naming)[46.5.2. `autoconfigure` Module](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-custom-starter-module-autoconfigure)[46.5.3. Starter Module](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-custom-starter-module-starter)[47. Kotlin support](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-kotlin)[47.1. Requirements](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-kotlin-requirements)[47.2. Null-safety](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-kotlin-null-safety)[47.3. Kotlin API](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-kotlin-api)[47.3.1. runApplication](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-kotlin-api-runapplication)[47.3.2. Extensions](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-kotlin-api-extensions)[47.4. Dependency management](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-kotlin-dependency-management)[47.5. `@ConfigurationProperties`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-kotlin-configuration-properties)[47.6. Testing](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-kotlin-testing)[47.7. Resources](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-kotlin-resources)[47.7.1. Further reading](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-kotlin-resources-further-reading)[47.7.2. Examples](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-kotlin-resources-examples)[48. What to Read Next](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-whats-next)
+
+- [V. Spring Boot Actuator: Production-ready features](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready)
+
+ [49. Enabling Production-ready Features](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-enabling)[50. Endpoints](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints)[50.1. Enabling Endpoints](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-enabling-endpoints)[50.2. Exposing Endpoints](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-exposing-endpoints)[50.3. Securing HTTP Endpoints](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-security)[50.4. Configuring Endpoints](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-caching)[50.5. Hypermedia for Actuator Web Endpoints](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-hypermedia)[50.6. Actuator Web Endpoint Paths](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-custom-mapping)[50.7. CORS Support](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-cors)[50.8. Implementing Custom Endpoints](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-custom)[50.8.1. Receiving Input](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-custom-input)[Input type conversion](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-custom-input-conversion)[50.8.2. Custom Web Endpoints](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-custom-web)[Web Endpoint Request Predicates](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-custom-web-predicate)[Path](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-custom-web-predicate-path)[HTTP method](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-custom-web-predicate-http-method)[Consumes](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-custom-web-predicate-consumes)[Produces](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-custom-web-predicate-produces)[Web Endpoint Response Status](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-custom-web-response-status)[Web Endpoint Range Requests](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-custom-web-range-requests)[Web Endpoint Security](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-custom-web-security)[50.8.3. Servlet endpoints](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-custom-servlet)[50.8.4. Controller endpoints](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints-custom-controller)[50.9. Health Information](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-health)[50.9.1. Auto-configured HealthIndicators](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_auto_configured_healthindicators)[50.9.2. Writing Custom HealthIndicators](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_writing_custom_healthindicators)[50.9.3. Reactive Health Indicators](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#reactive-health-indicators)[50.9.4. Auto-configured ReactiveHealthIndicators](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_auto_configured_reactivehealthindicators)[50.10. Application Information](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-application-info)[50.10.1. Auto-configured InfoContributors](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-application-info-autoconfigure)[50.10.2. Custom Application Information](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-application-info-env)[50.10.3. Git Commit Information](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-application-info-git)[50.10.4. Build Information](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-application-info-build)[50.10.5. Writing Custom InfoContributors](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-application-info-custom)[51. Monitoring and Management over HTTP](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-monitoring)[51.1. Customizing the Management Endpoint Paths](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-customizing-management-server-context-path)[51.2. Customizing the Management Server Port](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-customizing-management-server-port)[51.3. Configuring Management-specific SSL](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-management-specific-ssl)[51.4. Customizing the Management Server Address](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-customizing-management-server-address)[51.5. Disabling HTTP Endpoints](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-disabling-http-endpoints)[52. Monitoring and Management over JMX](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-jmx)[52.1. Customizing MBean Names](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-custom-mbean-names)[52.2. Disabling JMX Endpoints](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-disable-jmx-endpoints)[52.3. Using Jolokia for JMX over HTTP](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-jolokia)[52.3.1. Customizing Jolokia](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-customizing-jolokia)[52.3.2. Disabling Jolokia](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-disabling-jolokia)[53. Loggers](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-loggers)[53.1. Configure a Logger](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-logger-configuration)[54. Metrics](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics)[54.1. Getting started](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-getting-started)[54.2. Supported monitoring systems](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-export)[54.2.1. Atlas](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-export-atlas)[54.2.2. Datadog](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-export-datadog)[54.2.3. Ganglia](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-export-ganglia)[54.2.4. Graphite](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-export-graphite)[54.2.5. Influx](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-export-influx)[54.2.6. JMX](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-export-jmx)[54.2.7. New Relic](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-export-newrelic)[54.2.8. Prometheus](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-export-prometheus)[54.2.9. SignalFx](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-export-signalfx)[54.2.10. Simple](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-export-simple)[54.2.11. StatsD](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-export-statsd)[54.2.12. Wavefront](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-export-wavefront)[54.3. Supported Metrics](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-meter)[54.3.1. Spring MVC Metrics](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-spring-mvc)[54.3.2. Spring WebFlux Metrics](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-web-flux)[54.3.3. RestTemplate Metrics](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-rest-template)[54.3.4. Spring Integration metrics](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-integration)[54.3.5. Cache Metrics](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-cache)[54.3.6. DataSource Metrics](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-jdbc)[54.3.7. RabbitMQ Metrics](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-rabbitmq)[54.4. Registering custom metrics](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-custom)[54.5. Customizing individual metrics](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-per-meter-properties)[54.5.1. Per-meter properties](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_per_meter_properties)[54.6. Metrics endpoint](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics-endpoint)[55. Auditing](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-auditing)[56. HTTP Tracing](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-http-tracing)[56.1. Custom HTTP tracing](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-http-tracing-custom)[57. Process Monitoring](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-process-monitoring)[57.1. Extending Configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-process-monitoring-configuration)[57.2. Programmatically](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-process-monitoring-programmatically)[58. Cloud Foundry Support](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-cloudfoundry)[58.1. Disabling Extended Cloud Foundry Actuator Support](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-cloudfoundry-disable)[58.2. Cloud Foundry Self-signed Certificates](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-cloudfoundry-ssl)[58.3. Custom context path](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_custom_context_path)[59. What to Read Next](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-whats-next)
+
+- [VI. Deploying Spring Boot Applications](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#deployment)
+
+ [60. Deploying to the Cloud](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cloud-deployment)[60.1. Cloud Foundry](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cloud-deployment-cloud-foundry)[60.1.1. Binding to Services](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cloud-deployment-cloud-foundry-services)[60.2. Heroku](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cloud-deployment-heroku)[60.3. OpenShift](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cloud-deployment-openshift)[60.4. Amazon Web Services (AWS)](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cloud-deployment-aws)[60.4.1. AWS Elastic Beanstalk](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_aws_elastic_beanstalk)[Using the Tomcat Platform](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_using_the_tomcat_platform)[Using the Java SE Platform](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_using_the_java_se_platform)[60.4.2. Summary](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_summary)[60.5. Boxfuse and Amazon Web Services](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cloud-deployment-boxfuse)[60.6. Google Cloud](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cloud-deployment-gae)[61. Installing Spring Boot Applications](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#deployment-install)[61.1. Supported Operating Systems](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#deployment-install-supported-operating-systems)[61.2. Unix/Linux Services](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#deployment-service)[61.2.1. Installation as an `init.d` Service (System V)](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#deployment-initd-service)[Securing an `init.d` Service](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#deployment-initd-service-securing)[61.2.2. Installation as a `systemd` Service](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#deployment-systemd-service)[61.2.3. Customizing the Startup Script](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#deployment-script-customization)[Customizing the Start Script when It Is Written](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#deployment-script-customization-when-it-written)[Customizing a Script When It Runs](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#deployment-script-customization-when-it-runs)[61.3. Microsoft Windows Services](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#deployment-windows)[62. What to Read Next](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#deployment-whats-next)
+
+- [VII. Spring Boot CLI](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cli)
+
+ [63. Installing the CLI](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cli-installation)[64. Using the CLI](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cli-using-the-cli)[64.1. Running Applications with the CLI](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cli-run)[64.1.1. Deduced “grab” Dependencies](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cli-deduced-grab-annotations)[64.1.2. Deduced “grab” Coordinates](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cli-default-grab-deduced-coordinates)[64.1.3. Default Import Statements](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cli-default-import-statements)[64.1.4. Automatic Main Method](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cli-automatic-main-method)[64.1.5. Custom Dependency Management](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cli-default-grab-deduced-coordinates-custom-dependency-management)[64.2. Applications with Multiple Source Files](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cli-multiple-source-files)[64.3. Packaging Your Application](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cli-jar)[64.4. Initialize a New Project](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cli-init)[64.5. Using the Embedded Shell](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cli-shell)[64.6. Adding Extensions to the CLI](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cli-install-uninstall)[65. Developing Applications with the Groovy Beans DSL](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cli-groovy-beans-dsl)[66. Configuring the CLI with `settings.xml`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cli-maven-settings)[67. What to Read Next](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cli-whats-next)
+
+- [VIII. Build tool plugins](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#build-tool-plugins)
+
+ [68. Spring Boot Maven Plugin](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#build-tool-plugins-maven-plugin)[68.1. Including the Plugin](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#build-tool-plugins-include-maven-plugin)[68.2. Packaging Executable Jar and War Files](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#build-tool-plugins-maven-packaging)[69. Spring Boot Gradle Plugin](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#build-tool-plugins-gradle-plugin)[70. Spring Boot AntLib Module](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#build-tool-plugins-antlib)[70.1. Spring Boot Ant Tasks](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_spring_boot_ant_tasks)[70.1.1. `spring-boot:exejar`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#spring-boot-ant-exejar)[70.1.2. Examples](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_examples)[70.2. `spring-boot:findmainclass`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#spring-boot-ant-findmainclass)[70.2.1. Examples](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_examples_2)[71. Supporting Other Build Systems](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#build-tool-plugins-other-build-systems)[71.1. Repackaging Archives](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#build-tool-plugins-repackaging-archives)[71.2. Nested Libraries](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#build-tool-plugins-nested-libraries)[71.3. Finding a Main Class](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#build-tool-plugins-find-a-main-class)[71.4. Example Repackage Implementation](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#build-tool-plugins-repackage-implementation)[72. What to Read Next](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#build-tool-plugins-whats-next)
+
+- [IX. ‘How-to’ guides](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto)
+
+ [73. Spring Boot Application](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-spring-boot-application)[73.1. Create Your Own FailureAnalyzer](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-failure-analyzer)[73.2. Troubleshoot Auto-configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-troubleshoot-auto-configuration)[73.3. Customize the Environment or ApplicationContext Before It Starts](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-customize-the-environment-or-application-context)[73.4. Build an ApplicationContext Hierarchy (Adding a Parent or Root Context)](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-build-an-application-context-hierarchy)[73.5. Create a Non-web Application](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-create-a-non-web-application)[74. Properties and Configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-properties-and-configuration)[74.1. Automatically Expand Properties at Build Time](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-automatic-expansion)[74.1.1. Automatic Property Expansion Using Maven](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-automatic-expansion-maven)[74.1.2. Automatic Property Expansion Using Gradle](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-automatic-expansion-gradle)[74.2. Externalize the Configuration of `SpringApplication`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-externalize-configuration)[74.3. Change the Location of External Properties of an Application](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-change-the-location-of-external-properties)[74.4. Use ‘Short’ Command Line Arguments](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-use-short-command-line-arguments)[74.5. Use YAML for External Properties](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-use-yaml-for-external-properties)[74.6. Set the Active Spring Profiles](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-set-active-spring-profiles)[74.7. Change Configuration Depending on the Environment](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-change-configuration-depending-on-the-environment)[74.8. Discover Built-in Options for External Properties](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-discover-build-in-options-for-external-properties)[75. Embedded Web Servers](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-embedded-web-servers)[75.1. Use Another Web Server](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-use-another-web-server)[75.2. Configure Jetty](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-configure-jetty)[75.3. Add a Servlet, Filter, or Listener to an Application](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-add-a-servlet-filter-or-listener)[75.3.1. Add a Servlet, Filter, or Listener by Using a Spring Bean](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-add-a-servlet-filter-or-listener-as-spring-bean)[Disable Registration of a Servlet or Filter](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-disable-registration-of-a-servlet-or-filter)[75.3.2. Add Servlets, Filters, and Listeners by Using Classpath Scanning](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-add-a-servlet-filter-or-listener-using-scanning)[75.4. Change the HTTP Port](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-change-the-http-port)[75.5. Use a Random Unassigned HTTP Port](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-user-a-random-unassigned-http-port)[75.6. Discover the HTTP Port at Runtime](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-discover-the-http-port-at-runtime)[75.7. Configure SSL](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-configure-ssl)[75.8. Configure HTTP/2](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-configure-http2)[75.8.1. HTTP/2 with Undertow](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-configure-http2-undertow)[75.8.2. HTTP/2 with Jetty](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-configure-http2-jetty)[75.8.3. HTTP/2 with Tomcat](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-configure-http2-tomcat)[75.9. Configure Access Logging](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-configure-accesslogs)[75.10. Running Behind a Front-end Proxy Server](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-use-tomcat-behind-a-proxy-server)[75.10.1. Customize Tomcat’s Proxy Configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-customize-tomcat-behind-a-proxy-server)[75.11. Configure Tomcat](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-configure-tomcat)[75.12. Enable Multiple Connectors with Tomcat](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-enable-multiple-connectors-in-tomcat)[75.13. Use Tomcat’s LegacyCookieProcessor](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-use-tomcat-legacycookieprocessor)[75.14. Configure Undertow](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-configure-undertow)[75.15. Enable Multiple Listeners with Undertow](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-enable-multiple-listeners-in-undertow)[75.16. Create WebSocket Endpoints Using @ServerEndpoint](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-create-websocket-endpoints-using-serverendpoint)[75.17. Enable HTTP Response Compression](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#how-to-enable-http-response-compression)[76. Spring MVC](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-spring-mvc)[76.1. Write a JSON REST Service](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-write-a-json-rest-service)[76.2. Write an XML REST Service](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-write-an-xml-rest-service)[76.3. Customize the Jackson ObjectMapper](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-customize-the-jackson-objectmapper)[76.4. Customize the @ResponseBody Rendering](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-customize-the-responsebody-rendering)[76.5. Handling Multipart File Uploads](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-multipart-file-upload-configuration)[76.6. Switch Off the Spring MVC DispatcherServlet](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-switch-off-the-spring-mvc-dispatcherservlet)[76.7. Switch off the Default MVC Configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-switch-off-default-mvc-configuration)[76.8. Customize ViewResolvers](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-customize-view-resolvers)[77. HTTP Clients](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-http-clients)[77.1. Configure RestTemplate to Use a Proxy](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-http-clients-proxy-configuration)[78. Logging](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-logging)[78.1. Configure Logback for Logging](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-configure-logback-for-logging)[78.1.1. Configure Logback for File-only Output](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-configure-logback-for-logging-fileonly)[78.2. Configure Log4j for Logging](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-configure-log4j-for-logging)[78.2.1. Use YAML or JSON to Configure Log4j 2](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-configure-log4j-for-logging-yaml-or-json-config)[79. Data Access](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-data-access)[79.1. Configure a Custom DataSource](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-configure-a-datasource)[79.2. Configure Two DataSources](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-two-datasources)[79.3. Use Spring Data Repositories](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-use-spring-data-repositories)[79.4. Separate @Entity Definitions from Spring Configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-separate-entity-definitions-from-spring-configuration)[79.5. Configure JPA Properties](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-configure-jpa-properties)[79.6. Configure Hibernate Naming Strategy](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-configure-hibernate-naming-strategy)[79.7. Use a Custom EntityManagerFactory](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-use-custom-entity-manager)[79.8. Use Two EntityManagers](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-use-two-entity-managers)[79.9. Use a Traditional `persistence.xml` File](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-use-traditional-persistence-xml)[79.10. Use Spring Data JPA and Mongo Repositories](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-use-spring-data-jpa--and-mongo-repositories)[79.11. Expose Spring Data Repositories as REST Endpoint](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-use-exposing-spring-data-repositories-rest-endpoint)[79.12. Configure a Component that is Used by JPA](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-configure-a-component-that-is-used-by-JPA)[79.13. Configure jOOQ with Two DataSources](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-configure-jOOQ-with-multiple-datasources)[80. Database Initialization](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-database-initialization)[80.1. Initialize a Database Using JPA](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-initialize-a-database-using-jpa)[80.2. Initialize a Database Using Hibernate](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-initialize-a-database-using-hibernate)[80.3. Initialize a Database](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-initialize-a-database-using-spring-jdbc)[80.4. Initialize a Spring Batch Database](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-initialize-a-spring-batch-database)[80.5. Use a Higher-level Database Migration Tool](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-use-a-higher-level-database-migration-tool)[80.5.1. Execute Flyway Database Migrations on Startup](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-execute-flyway-database-migrations-on-startup)[80.5.2. Execute Liquibase Database Migrations on Startup](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-execute-liquibase-database-migrations-on-startup)[81. Messaging](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-messaging)[81.1. Disable Transacted JMS Session](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-jms-disable-transaction)[82. Batch Applications](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-batch-applications)[82.1. Execute Spring Batch Jobs on Startup](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-execute-spring-batch-jobs-on-startup)[83. Actuator](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-actuator)[83.1. Change the HTTP Port or Address of the Actuator Endpoints](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-change-the-http-port-or-address-of-the-actuator-endpoints)[83.2. Customize the ‘whitelabel’ Error Page](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-customize-the-whitelabel-error-page)[84. Security](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-security)[84.1. Switch off the Spring Boot Security Configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-switch-off-spring-boot-security-configuration)[84.2. Change the AuthenticationManager and Add User Accounts](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-change-the-authenticationmanager-and-add-user-accounts)[84.3. Enable HTTPS When Running behind a Proxy Server](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-enable-https)[85. Hot Swapping](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-hotswapping)[85.1. Reload Static Content](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-reload-static-content)[85.2. Reload Templates without Restarting the Container](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-reload-thymeleaf-template-content)[85.2.1. Thymeleaf Templates](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-reload-thymeleaf-content)[85.2.2. FreeMarker Templates](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-reload-freemarker-content)[85.2.3. Groovy Templates](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-reload-groovy-template-content)[85.3. Fast Application Restarts](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-reload-fast-restart)[85.4. Reload Java Classes without Restarting the Container](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-reload-java-classes-without-restarting)[86. Build](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-build)[86.1. Generate Build Information](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-build-info)[86.2. Generate Git Information](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-git-info)[86.3. Customize Dependency Versions](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-customize-dependency-versions)[86.4. Create an Executable JAR with Maven](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-create-an-executable-jar-with-maven)[86.5. Use a Spring Boot Application as a Dependency](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-create-an-additional-executable-jar)[86.6. Extract Specific Libraries When an Executable Jar Runs](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-extract-specific-libraries-when-an-executable-jar-runs)[86.7. Create a Non-executable JAR with Exclusions](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-create-a-nonexecutable-jar)[86.8. Remote Debug a Spring Boot Application Started with Maven](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-remote-debug-maven-run)[86.9. Build an Executable Archive from Ant without Using `spring-boot-antlib`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-build-an-executable-archive-with-ant)[87. Traditional Deployment](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-traditional-deployment)[87.1. Create a Deployable War File](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-create-a-deployable-war-file)[87.2. Create a Deployable War File for Older Servlet Containers](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-create-a-deployable-war-file-for-older-containers)[87.3. Convert an Existing Application to Spring Boot](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-convert-an-existing-application-to-spring-boot)[87.4. Deploying a WAR to WebLogic](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-weblogic)[87.5. Deploying a WAR in an Old (Servlet 2.5) Container](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-servlet-2-5)[87.6. Use Jedis Instead of Lettuce](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-use-jedis-instead-of-lettuce)
+
+- [X. Appendices](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#appendix)
+
+ [A. Common application properties](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#common-application-properties)[B. Configuration Metadata](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#configuration-metadata)[B.1. Metadata Format](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#configuration-metadata-format)[B.1.1. Group Attributes](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#configuration-metadata-group-attributes)[B.1.2. Property Attributes](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#configuration-metadata-property-attributes)[B.1.3. Hint Attributes](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#configuration-metadata-hints-attributes)[B.1.4. Repeated Metadata Items](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#configuration-metadata-repeated-items)[B.2. Providing Manual Hints](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#configuration-metadata-providing-manual-hints)[B.2.1. Value Hint](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_value_hint)[B.2.2. Value Providers](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_value_providers)[Any](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_any)[Class Reference](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_class_reference)[Handle As](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_handle_as)[Logger Name](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_logger_name)[Spring Bean Reference](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_spring_bean_reference)[Spring Profile Name](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#_spring_profile_name)[B.3. Generating Your Own Metadata by Using the Annotation Processor](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#configuration-metadata-annotation-processor)[B.3.1. Nested Properties](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#configuration-metadata-nested-properties)[B.3.2. Adding Additional Metadata](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#configuration-metadata-additional-metadata)[C. Auto-configuration classes](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#auto-configuration-classes)[C.1. From the “spring-boot-autoconfigure” module](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#auto-configuration-classes-from-autoconfigure-module)[C.2. From the “spring-boot-actuator-autoconfigure” module](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#auto-configuration-classes-from-actuator)[D. Test auto-configuration annotations](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#test-auto-configuration)[E. The Executable Jar Format](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#executable-jar)[E.1. Nested JARs](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#executable-jar-nested-jars)[E.1.1. The Executable Jar File Structure](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#executable-jar-jar-file-structure)[E.1.2. The Executable War File Structure](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#executable-jar-war-file-structure)[E.2. Spring Boot’s “JarFile” Class](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#executable-jar-jarfile)[E.2.1. Compatibility with the Standard Java “JarFile”](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#executable-jar-jarfile-compatibility)[E.3. Launching Executable Jars](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#executable-jar-launching)[E.3.1. Launcher Manifest](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#executable-jar-launcher-manifest)[E.3.2. Exploded Archives](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#executable-jar-exploded-archives)[E.4. `PropertiesLauncher` Features](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#executable-jar-property-launcher-features)[E.5. Executable Jar Restrictions](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#executable-jar-restrictions)[E.6. Alternative Single Jar Solutions](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#executable-jar-alternatives)[F. Dependency versions](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#appendix-dependency-versions)
+
+# Part I. Spring Boot Documentation
+
+
+
+This section provides a brief overview of Spring Boot reference documentation. It serves as a map for the rest of the document.
+
+## 1. About the Documentation
+
+The Spring Boot reference guide is available as
+
+- [HTML](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/html)
+- [PDF](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/pdf/spring-boot-reference.pdf)
+- [EPUB](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/epub/spring-boot-reference.epub)
+
+The latest copy is available at [docs.spring.io/spring-boot/docs/current/reference](https://docs.spring.io/spring-boot/docs/current/reference).
+
+Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically.
+
+## 2. Getting Help
+
+If you have trouble with Spring Boot, we would like to help.
+
+- Try the [How-to documents](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto). They provide solutions to the most common questions.
+- Learn the Spring basics. Spring Boot builds on many other Spring projects. Check the [spring.io](https://spring.io/) web-site for a wealth of reference documentation. If you are starting out with Spring, try one of the [guides](https://spring.io/guides).
+- Ask a question. We monitor [stackoverflow.com](https://stackoverflow.com/) for questions tagged with [`spring-boot`](https://stackoverflow.com/tags/spring-boot).
+- Report bugs with Spring Boot at [github.com/spring-projects/spring-boot/issues](https://github.com/spring-projects/spring-boot/issues).
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| All of Spring Boot is open source, including the documentation. If you find problems with the docs or if you want to improve them, please [get involved](https://github.com/spring-projects/spring-boot/tree/master). |
+
+## 3. First Steps
+
+If you are getting started with Spring Boot or 'Spring' in general, start with [the following topics](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started):
+
+- **From scratch:** [Overview](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-introducing-spring-boot) | [Requirements](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-system-requirements) | [Installation](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-installing-spring-boot)
+- **Tutorial:** [Part 1](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-first-application) | [Part 2](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-first-application-code)
+- **Running your example:** [Part 1](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-first-application-run) | [Part 2](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-first-application-executable-jar)
+
+## 4. Working with Spring Boot
+
+Ready to actually start using Spring Boot? [We have you covered](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot):
+
+- **Build systems:** [Maven](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-maven) | [Gradle](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-gradle) | [Ant](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-ant) | [Starters](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-starter)
+- **Best practices:** [Code Structure](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-structuring-your-code) | [@Configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-configuration-classes) | [@EnableAutoConfiguration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-auto-configuration) | [Beans and Dependency Injection](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-spring-beans-and-dependency-injection)
+- **Running your code** [IDE](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-running-from-an-ide) | [Packaged](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-running-as-a-packaged-application) | [Maven](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-running-with-the-maven-plugin) | [Gradle](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-running-with-the-gradle-plugin)
+- **Packaging your app:** [Production jars](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-packaging-for-production)
+- **Spring Boot CLI:** [Using the CLI](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cli)
+
+## 5. Learning about Spring Boot Features
+
+Need more details about Spring Boot’s core features? [The following content is for you](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features):
+
+- **Core Features:** [SpringApplication](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-application) | [External Configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config) | [Profiles](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-profiles) | [Logging](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-logging)
+- **Web Applications:** [MVC](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc) | [Embedded Containers](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-embedded-container)
+- **Working with data:** [SQL](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-sql) | [NO-SQL](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-nosql)
+- **Messaging:** [Overview](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-messaging) | [JMS](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-jms)
+- **Testing:** [Overview](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing) | [Boot Applications](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-testing-spring-boot-applications) | [Utils](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-test-utilities)
+- **Extending:** [Auto-configuration](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-developing-auto-configuration) | [@Conditions](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-condition-annotations)
+
+## 6. Moving to Production
+
+When you are ready to push your Spring Boot application to production, we have [some tricks](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready) that you might like:
+
+- **Management endpoints:** [Overview](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints) | [Customization](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#)
+- **Connection options:** [HTTP](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-monitoring) | [JMX](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-jmx)
+- **Monitoring:** [Metrics](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-metrics) | [Auditing](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-auditing) | [Tracing](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#) | [Process](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-process-monitoring)
+
+## 7. Advanced Topics
+
+Finally, we have a few topics for more advanced users:
+
+- **Spring Boot Applications Deployment:** [Cloud Deployment](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#cloud-deployment) | [OS Service](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#deployment-service)
+- **Build tool plugins:** [Maven](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#build-tool-plugins-maven-plugin) | [Gradle](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#build-tool-plugins-gradle-plugin)
+- **Appendix:** [Application Properties](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#common-application-properties) | [Auto-configuration classes](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#auto-configuration-classes) | [Executable Jars](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#executable-jar)
+
+# Part II. Getting Started
+
+
+
+If you are getting started with Spring Boot, or “Spring” in general, start by reading this section. It answers the basic “what?”, “how?” and “why?” questions. It includes an introduction to Spring Boot, along with installation instructions. We then walk you through building your first Spring Boot application, discussing some core principles as we go.
+
+## 8. Introducing Spring Boot
+
+Spring Boot makes it easy to create stand-alone, production-grade Spring-based Applications that you can run. We take an opinionated view of the Spring platform and third-party libraries, so that you can get started with minimum fuss. Most Spring Boot applications need very little Spring configuration.
+
+You can use Spring Boot to create Java applications that can be started by using `java -jar` or more traditional war deployments. We also provide a command line tool that runs “spring scripts”.
+
+Our primary goals are:
+
+- Provide a radically faster and widely accessible getting-started experience for all Spring development.
+- Be opinionated out of the box but get out of the way quickly as requirements start to diverge from the defaults.
+- Provide a range of non-functional features that are common to large classes of projects (such as embedded servers, security, metrics, health checks, and externalized configuration).
+- Absolutely no code generation and no requirement for XML configuration.
+
+## 9. System Requirements
+
+Spring Boot 2.0.0.BUILD-SNAPSHOT requires [Java 8 or 9](https://www.java.com/) and [Spring Framework 5.0.4.RELEASE](https://docs.spring.io/spring/docs/5.0.4.RELEASE/spring-framework-reference/) or above. Explicit build support is provided for Maven 3.2+ and Gradle 4.
+
+## 9.1 Servlet Containers
+
+Spring Boot supports the following embedded servlet containers:
+
+| Name | Servlet Version |
+| ------------ | --------------- |
+| Tomcat 8.5 | 3.1 |
+| Jetty 9.4 | 3.1 |
+| Undertow 1.4 | 3.1 |
+
+You can also deploy Spring Boot applications to any Servlet 3.0+ compatible container.
+
+## 10. Installing Spring Boot
+
+Spring Boot can be used with “classic” Java development tools or installed as a command line tool. Either way, you need [Java SDK v1.8](https://www.java.com/) or higher. Before you begin, you should check your current Java installation by using the following command:
+
+```
+$ java -version
+```
+
+If you are new to Java development or if you want to experiment with Spring Boot, you might want to try the [Spring Boot CLI](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-installing-the-cli) (Command Line Interface) first. Otherwise, read on for “classic” installation instructions.
+
+## 10.1 Installation Instructions for the Java Developer
+
+You can use Spring Boot in the same way as any standard Java library. To do so, include the appropriate `spring-boot-*.jar` files on your classpath. Spring Boot does not require any special tools integration, so you can use any IDE or text editor. Also, there is nothing special about a Spring Boot application, so you can run and debug a Spring Boot application as you would any other Java program.
+
+Although you *could* copy Spring Boot jars, we generally recommend that you use a build tool that supports dependency management (such as Maven or Gradle).
+
+### 10.1.1 Maven Installation
+
+Spring Boot is compatible with Apache Maven 3.2 or above. If you do not already have Maven installed, you can follow the instructions at [maven.apache.org](https://maven.apache.org/).
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| On many operating systems, Maven can be installed with a package manager. If you use OSX Homebrew, try `brew install maven`. Ubuntu users can run `sudo apt-get install maven`. Windows users with [Chocolatey](https://chocolatey.org/) can run `choco install maven` from an elevated (administrator) prompt. |
+
+Spring Boot dependencies use the `org.springframework.boot` `groupId`. Typically, your Maven POM file inherits from the `spring-boot-starter-parent`project and declares dependencies to one or more [“Starters”](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-starter). Spring Boot also provides an optional [Maven plugin](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#build-tool-plugins-maven-plugin) to create executable jars.
+
+The following listing shows a typical `pom.xml` file:
+
+```
+
+
+ 4.0.0
+
+ com.example
+ myproject
+ 0.0.1-SNAPSHOT
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.0.BUILD-SNAPSHOT
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
+
+
+ spring-snapshots
+ https://repo.spring.io/snapshot
+ true
+
+
+ spring-milestones
+ https://repo.spring.io/milestone
+
+
+
+
+ spring-snapshots
+ https://repo.spring.io/snapshot
+
+
+ spring-milestones
+ https://repo.spring.io/milestone
+
+
+
+```
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| The `spring-boot-starter-parent` is a great way to use Spring Boot, but it might not be suitable all of the time. Sometimes you may need to inherit from a different parent POM, or you might not like our default settings. In those cases, see [Section 13.2.2, “Using Spring Boot without the Parent POM”](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-maven-without-a-parent) for an alternative solution that uses an `import` scope. |
+
+### 10.1.2 Gradle Installation
+
+Spring Boot is compatible with Gradle 4. If you do not already have Gradle installed, you can follow the instructions at [gradle.org/](https://gradle.org/).
+
+Spring Boot dependencies can be declared by using the `org.springframework.boot` `group`. Typically, your project declares dependencies to one or more[“Starters”](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-starter). Spring Boot provides a useful [Gradle plugin](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#build-tool-plugins-gradle-plugin) that can be used to simplify dependency declarations and to create executable jars.
+
+**Gradle Wrapper**
+
+The Gradle Wrapper provides a nice way of “obtaining” Gradle when you need to build a project. It is a small script and library that you commit alongside your code to bootstrap the build process. See [docs.gradle.org/4.2.1/userguide/gradle_wrapper.html](https://docs.gradle.org/4.2.1/userguide/gradle_wrapper.html) for details.
+
+The following example shows a typical `build.gradle` file:
+
+```
+buildscript {
+ repositories {
+ jcenter()
+ maven { url 'https://repo.spring.io/snapshot' }
+ maven { url 'https://repo.spring.io/milestone' }
+ }
+ dependencies {
+ classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.0.0.BUILD-SNAPSHOT'
+ }
+}
+
+apply plugin: 'java'
+apply plugin: 'org.springframework.boot'
+apply plugin: 'io.spring.dependency-management'
+
+jar {
+ baseName = 'myproject'
+ version = '0.0.1-SNAPSHOT'
+}
+
+repositories {
+ jcenter()
+ maven { url "https://repo.spring.io/snapshot" }
+ maven { url "https://repo.spring.io/milestone" }
+}
+
+dependencies {
+ compile("org.springframework.boot:spring-boot-starter-web")
+ testCompile("org.springframework.boot:spring-boot-starter-test")
+}
+```
+
+## 10.2 Installing the Spring Boot CLI
+
+The Spring Boot CLI (Command Line Interface) is a command line tool that you can use to quickly prototype with Spring. It lets you run [Groovy](http://groovy-lang.org/) scripts, which means that you have a familiar Java-like syntax without so much boilerplate code.
+
+You do not need to use the CLI to work with Spring Boot, but it is definitely the quickest way to get a Spring application off the ground.
+
+### 10.2.1 Manual Installation
+
+You can download the Spring CLI distribution from the Spring software repository:
+
+- [spring-boot-cli-2.0.0.BUILD-SNAPSHOT-bin.zip](https://repo.spring.io/snapshot/org/springframework/boot/spring-boot-cli/2.0.0.BUILD-SNAPSHOT/spring-boot-cli-2.0.0.BUILD-SNAPSHOT-bin.zip)
+- [spring-boot-cli-2.0.0.BUILD-SNAPSHOT-bin.tar.gz](https://repo.spring.io/snapshot/org/springframework/boot/spring-boot-cli/2.0.0.BUILD-SNAPSHOT/spring-boot-cli-2.0.0.BUILD-SNAPSHOT-bin.tar.gz)
+
+Cutting edge [snapshot distributions](https://repo.spring.io/snapshot/org/springframework/boot/spring-boot-cli/) are also available.
+
+Once downloaded, follow the [INSTALL.txt](https://raw.github.com/spring-projects/spring-boot/master/spring-boot-project/spring-boot-cli/src/main/content/INSTALL.txt) instructions from the unpacked archive. In summary, there is a `spring` script (`spring.bat` for Windows) in a `bin/`directory in the `.zip` file. Alternatively, you can use `java -jar` with the `.jar` file (the script helps you to be sure that the classpath is set correctly).
+
+### 10.2.2 Installation with SDKMAN!
+
+SDKMAN! (The Software Development Kit Manager) can be used for managing multiple versions of various binary SDKs, including Groovy and the Spring Boot CLI. Get SDKMAN! from [sdkman.io](http://sdkman.io/) and install Spring Boot by using the following commands:
+
+```
+$ sdk install springboot
+$ spring --version
+Spring Boot v2.0.0.BUILD-SNAPSHOT
+```
+
+If you develop features for the CLI and want easy access to the version you built, use the following commands:
+
+```
+$ sdk install springboot dev /path/to/spring-boot/spring-boot-cli/target/spring-boot-cli-2.0.0.BUILD-SNAPSHOT-bin/spring-2.0.0.BUILD-SNAPSHOT/
+$ sdk default springboot dev
+$ spring --version
+Spring CLI v2.0.0.BUILD-SNAPSHOT
+```
+
+The preceding instructions install a local instance of `spring` called the `dev` instance. It points at your target build location, so every time you rebuild Spring Boot,`spring` is up-to-date.
+
+You can see it by running the following command:
+
+```
+$ sdk ls springboot
+
+================================================================================
+Available Springboot Versions
+================================================================================
+> + dev
+* 2.0.0.BUILD-SNAPSHOT
+
+================================================================================
++ - local version
+* - installed
+> - currently in use
+================================================================================
+```
+
+### 10.2.3 OSX Homebrew Installation
+
+If you are on a Mac and use [Homebrew](https://brew.sh/), you can install the Spring Boot CLI by using the following commands:
+
+```
+$ brew tap pivotal/tap
+$ brew install springboot
+```
+
+Homebrew installs `spring` to `/usr/local/bin`.
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| If you do not see the formula, your installation of brew might be out-of-date. In that case, run `brew update` and try again. |
+
+### 10.2.4 MacPorts Installation
+
+If you are on a Mac and use [MacPorts](https://www.macports.org/), you can install the Spring Boot CLI by using the following command:
+
+```
+$ sudo port install spring-boot-cli
+```
+
+### 10.2.5 Command-line Completion
+
+The Spring Boot CLI includes scripts that provide command completion for the [BASH](https://en.wikipedia.org/wiki/Bash_(Unix_shell)) and [zsh](https://en.wikipedia.org/wiki/Z_shell) shells. You can `source` the script (also named `spring`) in any shell or put it in your personal or system-wide bash completion initialization. On a Debian system, the system-wide scripts are in `/shell-completion/bash` and all scripts in that directory are executed when a new shell starts. For example, to run the script manually if you have installed by using SDKMAN!, use the following commands:
+
+```
+$ . ~/.sdkman/candidates/springboot/current/shell-completion/bash/spring
+$ spring
+ grab help jar run test version
+
+```
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| If you install the Spring Boot CLI by using Homebrew or MacPorts, the command-line completion scripts are automatically registered with your shell. |
+
+### 10.2.6 Quick-start Spring CLI Example
+
+You can use the following web application to test your installation. To start, create a file called `app.groovy`, as follows:
+
+```
+@RestController
+class ThisWillActuallyRun {
+
+ @RequestMapping("/")
+ String home() {
+ "Hello World!"
+ }
+
+}
+
+```
+
+Then run it from a shell, as follows:
+
+```
+$ spring run app.groovy
+
+```
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| The first run of your application is slow, as dependencies are downloaded. Subsequent runs are much quicker. |
+
+Open `localhost:8080` in your favorite web browser. You should see the following output:
+
+```
+Hello World!
+
+```
+
+## 10.3 Upgrading from an Earlier Version of Spring Boot
+
+If you are upgrading from an earlier release of Spring Boot, check the [“migration guide” on the project wiki](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide) that provides detailed upgrade instructions. Check also the[“release notes”](https://github.com/spring-projects/spring-boot/wiki) for a list of “new and noteworthy” features for each release.
+
+To upgrade an existing CLI installation, use the appropriate package manager command (for example, `brew upgrade`) or, if you manually installed the CLI, follow the[standard instructions](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-manual-cli-installation), remembering to update your `PATH` environment variable to remove any older references.
+
+## 11. Developing Your First Spring Boot Application
+
+This section describes how to develop a simple “Hello World!” web application that highlights some of Spring Boot’s key features. We use Maven to build this project, since most IDEs support it.
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| The [spring.io](https://spring.io/) web site contains many “Getting Started” [guides](https://spring.io/guides) that use Spring Boot. If you need to solve a specific problem, check there first.You can shortcut the steps below by going to [start.spring.io](https://start.spring.io/) and choosing the "Web" starter from the dependencies searcher. Doing so generates a new project structure so that you can [start coding right away](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started-first-application-code). Check the [Spring Initializr documentation](https://github.com/spring-io/initializr) for more details. |
+
+Before we begin, open a terminal and run the following commands to ensure that you have valid versions of Java and Maven installed:
+
+```
+$ java -version
+java version "1.8.0_102"
+Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
+Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
+$ mvn -v
+Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T16:41:47+00:00)
+Maven home: /usr/local/Cellar/maven/3.3.9/libexec
+Java version: 1.8.0_102, vendor: Oracle Corporation
+
+```
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| This sample needs to be created in its own folder. Subsequent instructions assume that you have created a suitable folder and that it is your current directory. |
+
+## 11.1 Creating the POM
+
+We need to start by creating a Maven `pom.xml` file. The `pom.xml` is the recipe that is used to build your project. Open your favorite text editor and add the following:
+
+```
+
+
+ 4.0.0
+
+ com.example
+ myproject
+ 0.0.1-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.0.BUILD-SNAPSHOT
+
+
+
+
+
+
+
+ spring-snapshots
+ https://repo.spring.io/snapshot
+ true
+
+
+ spring-milestones
+ https://repo.spring.io/milestone
+
+
+
+
+ spring-snapshots
+ https://repo.spring.io/snapshot
+
+
+ spring-milestones
+ https://repo.spring.io/milestone
+
+
+
+
+```
+
+The preceding listing should give you a working build. You can test it by running `mvn package` (for now, you can ignore the “jar will be empty - no content was marked for inclusion!” warning).
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| At this point, you could import the project into an IDE (most modern Java IDEs include built-in support for Maven). For simplicity, we continue to use a plain text editor for this example. |
+
+## 11.2 Adding Classpath Dependencies
+
+Spring Boot provides a number of “Starters” that let you add jars to your classpath. Our sample application has already used `spring-boot-starter-parent` in the `parent` section of the POM. The `spring-boot-starter-parent` is a special starter that provides useful Maven defaults. It also provides a[`dependency-management`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-dependency-management) section so that you can omit `version` tags for “blessed” dependencies.
+
+Other “Starters” provide dependencies that you are likely to need when developing a specific type of application. Since we are developing a web application, we add a`spring-boot-starter-web` dependency. Before that, we can look at what we currently have by running the following command:
+
+```
+$ mvn dependency:tree
+
+[INFO] com.example:myproject:jar:0.0.1-SNAPSHOT
+
+```
+
+The `mvn dependency:tree` command prints a tree representation of your project dependencies. You can see that `spring-boot-starter-parent` provides no dependencies by itself. To add the necessary dependencies, edit your `pom.xml` and add the `spring-boot-starter-web` dependency immediately below the `parent` section:
+
+```
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+```
+
+If you run `mvn dependency:tree` again, you see that there are now a number of additional dependencies, including the Tomcat web server and Spring Boot itself.
+
+## 11.3 Writing the Code
+
+To finish our application, we need to create a single Java file. By default, Maven compiles sources from `src/main/java`, so you need to create that folder structure and then add a file named `src/main/java/Example.java` to contain the following code:
+
+```
+import org.springframework.boot.*;
+import org.springframework.boot.autoconfigure.*;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@EnableAutoConfiguration
+public class Example {
+
+ @RequestMapping("/")
+ String home() {
+ return "Hello World!";
+ }
+
+ public static void main(String[] args) throws Exception {
+ SpringApplication.run(Example.class, args);
+ }
+
+}
+
+```
+
+Although there is not much code here, quite a lot is going on. We step through the important parts in the next few sections.
+
+### 11.3.1 The @RestController and @RequestMapping Annotations
+
+The first annotation on our `Example` class is `@RestController`. This is known as a *stereotype* annotation. It provides hints for people reading the code and for Spring that the class plays a specific role. In this case, our class is a web `@Controller`, so Spring considers it when handling incoming web requests.
+
+The `@RequestMapping` annotation provides “routing” information. It tells Spring that any HTTP request with the `/` path should be mapped to the `home` method. The`@RestController` annotation tells Spring to render the resulting string directly back to the caller.
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| The `@RestController` and `@RequestMapping` annotations are Spring MVC annotations. (They are not specific to Spring Boot.) See the [MVC section](https://docs.spring.io/spring/docs/5.0.4.RELEASE/spring-framework-reference/web.html#mvc)in the Spring Reference Documentation for more details. |
+
+### 11.3.2 The @EnableAutoConfiguration Annotation
+
+The second class-level annotation is `@EnableAutoConfiguration`. This annotation tells Spring Boot to “guess” how you want to configure Spring, based on the jar dependencies that you have added. Since `spring-boot-starter-web` added Tomcat and Spring MVC, the auto-configuration assumes that you are developing a web application and sets up Spring accordingly.
+
+**Starters and Auto-Configuration**
+
+Auto-configuration is designed to work well with “Starters”, but the two concepts are not directly tied. You are free to pick and choose jar dependencies outside of the starters. Spring Boot still does its best to auto-configure your application.
+
+### 11.3.3 The “main” Method
+
+The final part of our application is the `main` method. This is just a standard method that follows the Java convention for an application entry point. Our main method delegates to Spring Boot’s `SpringApplication` class by calling `run`. `SpringApplication` bootstraps our application, starting Spring, which, in turn, starts the auto-configured Tomcat web server. We need to pass `Example.class` as an argument to the `run` method to tell `SpringApplication` which is the primary Spring component. The `args` array is also passed through to expose any command-line arguments.
+
+## 11.4 Running the Example
+
+At this point, your application should work. Since you used the `spring-boot-starter-parent` POM, you have a useful `run` goal that you can use to start the application. Type `mvn spring-boot:run` from the root project directory to start the application. You should see output similar to the following:
+
+```
+$ mvn spring-boot:run
+
+ . ____ _ __ _ _
+ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
+( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
+ \\/ ___)| |_)| | | | | || (_| | ) ) ) )
+ ' |____| .__|_| |_|_| |_\__, | / / / /
+ =========|_|==============|___/=/_/_/_/
+ :: Spring Boot :: (v2.0.0.BUILD-SNAPSHOT)
+....... . . .
+....... . . . (log output here)
+....... . . .
+........ Started Example in 2.222 seconds (JVM running for 6.514)
+
+```
+
+If you open a web browser to `localhost:8080`, you should see the following output:
+
+```
+Hello World!
+
+```
+
+To gracefully exit the application, press `ctrl-c`.
+
+## 11.5 Creating an Executable Jar
+
+We finish our example by creating a completely self-contained executable jar file that we could run in production. Executable jars (sometimes called “fat jars”) are archives containing your compiled classes along with all of the jar dependencies that your code needs to run.
+
+**Executable jars and Java**
+
+Java does not provide a standard way to load nested jar files (jar files that are themselves contained within a jar). This can be problematic if you are looking to distribute a self-contained application.
+
+To solve this problem, many developers use “uber” jars. An uber jar packages all the classes from all the application’s dependencies into a single archive. The problem with this approach is that it becomes hard to see which libraries are in your application. It can also be problematic if the same filename is used (but with different content) in multiple jars.
+
+Spring Boot takes a [different approach](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#executable-jar) and lets you actually nest jars directly.
+
+To create an executable jar, we need to add the `spring-boot-maven-plugin` to our `pom.xml`. To do so, insert the following lines just below the `dependencies`section:
+
+```
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+```
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| The `spring-boot-starter-parent` POM includes `` configuration to bind the `repackage` goal. If you do not use the parent POM, you need to declare this configuration yourself. See the [plugin documentation](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/maven-plugin/usage.html) for details. |
+
+Save your `pom.xml` and run `mvn package` from the command line, as follows:
+
+```
+$ mvn package
+
+[INFO] Scanning for projects...
+[INFO]
+[INFO] ------------------------------------------------------------------------
+[INFO] Building myproject 0.0.1-SNAPSHOT
+[INFO] ------------------------------------------------------------------------
+[INFO] .... ..
+[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ myproject ---
+[INFO] Building jar: /Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar
+[INFO]
+[INFO] --- spring-boot-maven-plugin:2.0.0.BUILD-SNAPSHOT:repackage (default) @ myproject ---
+[INFO] ------------------------------------------------------------------------
+[INFO] BUILD SUCCESS
+[INFO] ------------------------------------------------------------------------
+
+```
+
+If you look in the `target` directory, you should see `myproject-0.0.1-SNAPSHOT.jar`. The file should be around 10 MB in size. If you want to peek inside, you can use `jar tvf`, as follows:
+
+```
+$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar
+
+```
+
+You should also see a much smaller file named `myproject-0.0.1-SNAPSHOT.jar.original` in the `target` directory. This is the original jar file that Maven created before it was repackaged by Spring Boot.
+
+To run that application, use the `java -jar` command, as follows:
+
+```
+$ java -jar target/myproject-0.0.1-SNAPSHOT.jar
+
+ . ____ _ __ _ _
+ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
+( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
+ \\/ ___)| |_)| | | | | || (_| | ) ) ) )
+ ' |____| .__|_| |_|_| |_\__, | / / / /
+ =========|_|==============|___/=/_/_/_/
+ :: Spring Boot :: (v2.0.0.BUILD-SNAPSHOT)
+....... . . .
+....... . . . (log output here)
+....... . . .
+........ Started Example in 2.536 seconds (JVM running for 2.864)
+
+```
+
+As before, to exit the application, press `ctrl-c`.
+
+## 12. What to Read Next
+
+Hopefully, this section provided some of the Spring Boot basics and got you on your way to writing your own applications. If you are a task-oriented type of developer, you might want to jump over to [spring.io](https://spring.io/) and check out some of the [getting started](https://spring.io/guides/) guides that solve specific “How do I do that with Spring?” problems. We also have Spring Boot-specific “[How-to](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto)” reference documentation.
+
+The [Spring Boot repository](https://github.com/spring-projects/spring-boot) also has a [bunch of samples](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples) you can run. The samples are independent of the rest of the code (that is, you do not need to build the rest to run or use the samples).
+
+Otherwise, the next logical step is to read *Part III, “Using Spring Boot”*. If you are really impatient, you could also jump ahead and read about *Spring Boot features*.
+
+# Part III. Using Spring Boot
+
+
+
+This section goes into more detail about how you should use Spring Boot. It covers topics such as build systems, auto-configuration, and how to run your applications. We also cover some Spring Boot best practices. Although there is nothing particularly special about Spring Boot (it is just another library that you can consume), there are a few recommendations that, when followed, make your development process a little easier.
+
+If you are starting out with Spring Boot, you should probably read the *Getting Started* guide before diving into this section.
+
+## 13. Build Systems
+
+It is strongly recommended that you choose a build system that supports [*dependency management*](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-dependency-management) and that can consume artifacts published to the “Maven Central” repository. We would recommend that you choose Maven or Gradle. It is possible to get Spring Boot to work with other build systems (Ant, for example), but they are not particularly well supported.
+
+## 13.1 Dependency Management
+
+Each release of Spring Boot provides a curated list of dependencies that it supports. In practice, you do not need to provide a version for any of these dependencies in your build configuration, as Spring Boot manages that for you. When you upgrade Spring Boot itself, these dependencies are upgraded as well in a consistent way.
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| You can still specify a version and override Spring Boot’s recommendations if you need to do so. |
+
+The curated list contains all the spring modules that you can use with Spring Boot as well as a refined list of third party libraries. The list is available as a standard [Bills of Materials (`spring-boot-dependencies`)](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-maven-without-a-parent) that can be used with both [Maven](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-maven-parent-pom) and [Gradle](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-gradle).
+
+| ![[Warning]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/warning.png) |
+| ------------------------------------------------------------ |
+| Each release of Spring Boot is associated with a base version of the Spring Framework. We **highly** recommend that you not specify its version. |
+
+## 13.2 Maven
+
+Maven users can inherit from the `spring-boot-starter-parent` project to obtain sensible defaults. The parent project provides the following features:
+
+- Java 1.8 as the default compiler level.
+- UTF-8 source encoding.
+- A [Dependency Management section](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-dependency-management), inherited from the spring-boot-dependencies pom, that manages the versions of common dependencies. This dependency management lets you omit tags for those dependencies when used in your own pom.
+- Sensible [resource filtering](https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html).
+- Sensible plugin configuration ([exec plugin](http://www.mojohaus.org/exec-maven-plugin/), [Git commit ID](https://github.com/ktoso/maven-git-commit-id-plugin), and [shade](https://maven.apache.org/plugins/maven-shade-plugin/)).
+- Sensible resource filtering for `application.properties` and `application.yml` including profile-specific files (for example, `application-dev.properties` and `application-dev.yml`)
+
+Note that, since the `application.properties` and `application.yml` files accept Spring style placeholders (`${…}`), the Maven filtering is changed to use `@..@`placeholders. (You can override that by setting a Maven property called `resource.delimiter`.)
+
+### 13.2.1 Inheriting the Starter Parent
+
+To configure your project to inherit from the `spring-boot-starter-parent`, set the `parent` as follows:
+
+```
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.0.BUILD-SNAPSHOT
+
+
+```
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| You should need to specify only the Spring Boot version number on this dependency. If you import additional starters, you can safely omit the version number. |
+
+With that setup, you can also override individual dependencies by overriding a property in your own project. For instance, to upgrade to another Spring Data release train, you would add the following to your `pom.xml`:
+
+```
+
+ Fowler-SR2
+
+
+```
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| Check the [`spring-boot-dependencies` pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-dependencies/pom.xml) for a list of supported properties. |
+
+### 13.2.2 Using Spring Boot without the Parent POM
+
+Not everyone likes inheriting from the `spring-boot-starter-parent` POM. You may have your own corporate standard parent that you need to use or you may prefer to explicitly declare all your Maven configuration.
+
+If you do not want to use the `spring-boot-starter-parent`, you can still keep the benefit of the dependency management (but not the plugin management) by using a `scope=import` dependency, as follows:
+
+```
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ 2.0.0.BUILD-SNAPSHOT
+ pom
+ import
+
+
+
+
+```
+
+The preceding sample setup does not let you override individual dependencies by using a property, as explained above. To achieve the same result, you need to add an entry in the `dependencyManagement` of your project **before** the `spring-boot-dependencies` entry. For instance, to upgrade to another Spring Data release train, you could add the following element to your `pom.xml`:
+
+```
+
+
+
+
+ org.springframework.data
+ spring-data-releasetrain
+ Fowler-SR2
+ pom
+ import
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ 2.0.0.BUILD-SNAPSHOT
+ pom
+ import
+
+
+
+
+```
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| In the preceding example, we specify a *BOM*, but any dependency type can be overridden in the same way. |
+
+### 13.2.3 Using the Spring Boot Maven Plugin
+
+Spring Boot includes a [Maven plugin](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#build-tool-plugins-maven-plugin) that can package the project as an executable jar. Add the plugin to your `` section if you want to use it, as shown in the following example:
+
+```
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+```
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| If you use the Spring Boot starter parent pom, you need to add only the plugin. There is no need to configure it unless you want to change the settings defined in the parent. |
+
+## 13.3 Gradle
+
+To learn about using Spring Boot with Gradle, please refer to the documentation for Spring Boot’s Gradle plugin:
+
+- Reference ([HTML](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/gradle-plugin/reference/html) and [PDF](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/gradle-plugin/reference/pdf/spring-boot-gradle-plugin-reference.pdf))
+- [API](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/gradle-plugin/api)
+
+## 13.4 Ant
+
+It is possible to build a Spring Boot project using Apache Ant+Ivy. The `spring-boot-antlib` “AntLib” module is also available to help Ant create executable jars.
+
+To declare dependencies, a typical `ivy.xml` file looks something like the following example:
+
+```
+
+
+
+
+
+
+
+
+
+
+
+```
+
+A typical `build.xml` looks like the following example:
+
+```
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| If you do not want to use the `spring-boot-antlib` module, see the *Section 86.9, “Build an Executable Archive from Ant without Using spring-boot-antlib”* “How-to” . |
+
+## 13.5 Starters
+
+Starters are a set of convenient dependency descriptors that you can include in your application. You get a one-stop shop for all the Spring and related technologies that you need without having to hunt through sample code and copy-paste loads of dependency descriptors. For example, if you want to get started using Spring and JPA for database access, include the `spring-boot-starter-data-jpa` dependency in your project.
+
+The starters contain a lot of the dependencies that you need to get a project up and running quickly and with a consistent, supported set of managed transitive dependencies.
+
+**What’s in a name**
+
+All **official** starters follow a similar naming pattern; `spring-boot-starter-*`, where `*` is a particular type of application. This naming structure is intended to help when you need to find a starter. The Maven integration in many IDEs lets you search dependencies by name. For example, with the appropriate Eclipse or STS plugin installed, you can press `ctrl-space` in the POM editor and type “spring-boot-starter” for a complete list.
+
+As explained in the “[Creating Your Own Starter](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-custom-starter)” section, third party starters should not start with `spring-boot`, as it is reserved for official Spring Boot artifacts. Rather, a third-party starter typically starts with the name of the project. For example, a third-party starter project called `thirdpartyproject` would typically be named `thirdpartyproject-spring-boot-starter`.
+
+The following application starters are provided by Spring Boot under the `org.springframework.boot` group:
+
+
+
+**Table 13.1. Spring Boot application starters**
+
+| Name | Description | Pom |
+| --------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
+| `spring-boot-starter` | Core starter, including auto-configuration support, logging and YAML | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter/pom.xml) |
+| `spring-boot-starter-activemq` | Starter for JMS messaging using Apache ActiveMQ | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-activemq/pom.xml) |
+| `spring-boot-starter-amqp` | Starter for using Spring AMQP and Rabbit MQ | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-amqp/pom.xml) |
+| `spring-boot-starter-aop` | Starter for aspect-oriented programming with Spring AOP and AspectJ | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-aop/pom.xml) |
+| `spring-boot-starter-artemis` | Starter for JMS messaging using Apache Artemis | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-artemis/pom.xml) |
+| `spring-boot-starter-batch` | Starter for using Spring Batch | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-batch/pom.xml) |
+| `spring-boot-starter-cache` | Starter for using Spring Framework’s caching support | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-cache/pom.xml) |
+| `spring-boot-starter-cloud-connectors` | Starter for using Spring Cloud Connectors which simplifies connecting to services in cloud platforms like Cloud Foundry and Heroku | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-cloud-connectors/pom.xml) |
+| `spring-boot-starter-data-cassandra` | Starter for using Cassandra distributed database and Spring Data Cassandra | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-data-cassandra/pom.xml) |
+| `spring-boot-starter-data-cassandra-reactive` | Starter for using Cassandra distributed database and Spring Data Cassandra Reactive | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-data-cassandra-reactive/pom.xml) |
+| `spring-boot-starter-data-couchbase` | Starter for using Couchbase document-oriented database and Spring Data Couchbase | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-data-couchbase/pom.xml) |
+| `spring-boot-starter-data-couchbase-reactive` | Starter for using Couchbase document-oriented database and Spring Data Couchbase Reactive | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-data-couchbase-reactive/pom.xml) |
+| `spring-boot-starter-data-elasticsearch` | Starter for using Elasticsearch search and analytics engine and Spring Data Elasticsearch | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-data-elasticsearch/pom.xml) |
+| `spring-boot-starter-data-jpa` | Starter for using Spring Data JPA with Hibernate | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-data-jpa/pom.xml) |
+| `spring-boot-starter-data-ldap` | Starter for using Spring Data LDAP | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-data-ldap/pom.xml) |
+| `spring-boot-starter-data-mongodb` | Starter for using MongoDB document-oriented database and Spring Data MongoDB | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-data-mongodb/pom.xml) |
+| `spring-boot-starter-data-mongodb-reactive` | Starter for using MongoDB document-oriented database and Spring Data MongoDB Reactive | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-data-mongodb-reactive/pom.xml) |
+| `spring-boot-starter-data-neo4j` | Starter for using Neo4j graph database and Spring Data Neo4j | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-data-neo4j/pom.xml) |
+| `spring-boot-starter-data-redis` | Starter for using Redis key-value data store with Spring Data Redis and the Lettuce client | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-data-redis/pom.xml) |
+| `spring-boot-starter-data-redis-reactive` | Starter for using Redis key-value data store with Spring Data Redis reactive and the Lettuce client | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-data-redis-reactive/pom.xml) |
+| `spring-boot-starter-data-rest` | Starter for exposing Spring Data repositories over REST using Spring Data REST | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-data-rest/pom.xml) |
+| `spring-boot-starter-data-solr` | Starter for using the Apache Solr search platform with Spring Data Solr | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-data-solr/pom.xml) |
+| `spring-boot-starter-freemarker` | Starter for building MVC web applications using FreeMarker views | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-freemarker/pom.xml) |
+| `spring-boot-starter-groovy-templates` | Starter for building MVC web applications using Groovy Templates views | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-groovy-templates/pom.xml) |
+| `spring-boot-starter-hateoas` | Starter for building hypermedia-based RESTful web application with Spring MVC and Spring HATEOAS | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-hateoas/pom.xml) |
+| `spring-boot-starter-integration` | Starter for using Spring Integration | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-integration/pom.xml) |
+| `spring-boot-starter-jdbc` | Starter for using JDBC with the Tomcat JDBC connection pool | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-jdbc/pom.xml) |
+| `spring-boot-starter-jersey` | Starter for building RESTful web applications using JAX-RS and Jersey. An alternative to [`spring-boot-starter-web`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#spring-boot-starter-web) | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-jersey/pom.xml) |
+| `spring-boot-starter-jooq` | Starter for using jOOQ to access SQL databases. An alternative to [`spring-boot-starter-data-jpa`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#spring-boot-starter-data-jpa) or [`spring-boot-starter-jdbc`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#spring-boot-starter-jdbc) | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-jooq/pom.xml) |
+| `spring-boot-starter-json` | Starter for reading and writing json | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-json/pom.xml) |
+| `spring-boot-starter-jta-atomikos` | Starter for JTA transactions using Atomikos | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-jta-atomikos/pom.xml) |
+| `spring-boot-starter-jta-bitronix` | Starter for JTA transactions using Bitronix | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-jta-bitronix/pom.xml) |
+| `spring-boot-starter-jta-narayana` | Spring Boot Narayana JTA Starter | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-jta-narayana/pom.xml) |
+| `spring-boot-starter-mail` | Starter for using Java Mail and Spring Framework’s email sending support | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-mail/pom.xml) |
+| `spring-boot-starter-mustache` | Starter for building web applications using Mustache views | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-mustache/pom.xml) |
+| `spring-boot-starter-quartz` | Spring Boot Quartz Starter | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-quartz/pom.xml) |
+| `spring-boot-starter-security` | Starter for using Spring Security | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-security/pom.xml) |
+| `spring-boot-starter-test` | Starter for testing Spring Boot applications with libraries including JUnit, Hamcrest and Mockito | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-test/pom.xml) |
+| `spring-boot-starter-thymeleaf` | Starter for building MVC web applications using Thymeleaf views | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-thymeleaf/pom.xml) |
+| `spring-boot-starter-validation` | Starter for using Java Bean Validation with Hibernate Validator | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-validation/pom.xml) |
+| `spring-boot-starter-web` | Starter for building web, including RESTful, applications using Spring MVC. Uses Tomcat as the default embedded container | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-web/pom.xml) |
+| `spring-boot-starter-web-services` | Starter for using Spring Web Services | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-web-services/pom.xml) |
+| `spring-boot-starter-webflux` | Starter for building WebFlux applications using Spring Framework’s Reactive Web support | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-webflux/pom.xml) |
+| `spring-boot-starter-websocket` | Starter for building WebSocket applications using Spring Framework’s WebSocket support | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-websocket/pom.xml) |
+
+In addition to the application starters, the following starters can be used to add *production ready* features:
+
+
+
+**Table 13.2. Spring Boot production starters**
+
+| Name | Description | Pom |
+| ------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
+| `spring-boot-starter-actuator` | Starter for using Spring Boot’s Actuator which provides production ready features to help you monitor and manage your application | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-actuator/pom.xml) |
+
+Finally, Spring Boot also includes the following starters that can be used if you want to exclude or swap specific technical facets:
+
+
+
+**Table 13.3. Spring Boot technical starters**
+
+| Name | Description | Pom |
+| ----------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
+| `spring-boot-starter-jetty` | Starter for using Jetty as the embedded servlet container. An alternative to [`spring-boot-starter-tomcat`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#spring-boot-starter-tomcat) | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-jetty/pom.xml) |
+| `spring-boot-starter-log4j2` | Starter for using Log4j2 for logging. An alternative to [`spring-boot-starter-logging`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#spring-boot-starter-logging) | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-log4j2/pom.xml) |
+| `spring-boot-starter-logging` | Starter for logging using Logback. Default logging starter | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-logging/pom.xml) |
+| `spring-boot-starter-reactor-netty` | Starter for using Reactor Netty as the embedded reactive HTTP server. | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-reactor-netty/pom.xml) |
+| `spring-boot-starter-tomcat` | Starter for using Tomcat as the embedded servlet container. Default servlet container starter used by [`spring-boot-starter-web`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#spring-boot-starter-web) | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-tomcat/pom.xml) |
+| `spring-boot-starter-undertow` | Starter for using Undertow as the embedded servlet container. An alternative to [`spring-boot-starter-tomcat`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#spring-boot-starter-tomcat) | [Pom](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/spring-boot-starter-undertow/pom.xml) |
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| For a list of additional community contributed starters, see the [README file](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-starters/README.adoc) in the `spring-boot-starters` module on GitHub. |
+
+## 14. Structuring Your Code
+
+Spring Boot does not require any specific code layout to work. However, there are some best practices that help.
+
+## 14.1 Using the “default” Package
+
+When a class does not include a `package` declaration, it is considered to be in the “default package”. The use of the “default package” is generally discouraged and should be avoided. It can cause particular problems for Spring Boot applications that use the `@ComponentScan`, `@EntityScan`, or `@SpringBootApplication`annotations, since every class from every jar is read.
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| We recommend that you follow Java’s recommended package naming conventions and use a reversed domain name (for example, `com.example.project`). |
+
+## 14.2 Locating the Main Application Class
+
+We generally recommend that you locate your main application class in a root package above other classes. The `@EnableAutoConfiguration` annotation is often placed on your main class, and it implicitly defines a base “search package” for certain items. For example, if you are writing a JPA application, the package of the`@EnableAutoConfiguration` annotated class is used to search for `@Entity` items.
+
+Using a root package also lets the `@ComponentScan` annotation be used without needing to specify a `basePackage` attribute. You can also use the `@SpringBootApplication` annotation if your main class is in the root package.
+
+The following listing shows a typical layout:
+
+```
+com
+ +- example
+ +- myapplication
+ +- Application.java
+ |
+ +- customer
+ | +- Customer.java
+ | +- CustomerController.java
+ | +- CustomerService.java
+ | +- CustomerRepository.java
+ |
+ +- order
+ +- Order.java
+ +- OrderController.java
+ +- OrderService.java
+ +- OrderRepository.java
+
+```
+
+The `Application.java` file would declare the `main` method, along with the basic `@Configuration`, as follows:
+
+```
+package com.example.myapplication;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@EnableAutoConfiguration
+@ComponentScan
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
+
+```
+
+## 15. Configuration Classes
+
+Spring Boot favors Java-based configuration. Although it is possible to use `SpringApplication` with XML sources, we generally recommend that your primary source be a single `@Configuration` class. Usually the class that defines the `main` method is a good candidate as the primary `@Configuration`.
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| Many Spring configuration examples have been published on the Internet that use XML configuration. If possible, always try to use the equivalent Java-based configuration. Searching for `Enable*` annotations can be a good starting point. |
+
+## 15.1 Importing Additional Configuration Classes
+
+You need not put all your `@Configuration` into a single class. The `@Import` annotation can be used to import additional configuration classes. Alternatively, you can use `@ComponentScan` to automatically pick up all Spring components, including `@Configuration` classes.
+
+## 15.2 Importing XML Configuration
+
+If you absolutely must use XML based configuration, we recommend that you still start with a `@Configuration` class. You can then use an `@ImportResource`annotation to load XML configuration files.
+
+## 16. Auto-configuration
+
+Spring Boot auto-configuration attempts to automatically configure your Spring application based on the jar dependencies that you have added. For example, if `HSQLDB`is on your classpath, and you have not manually configured any database connection beans, then Spring Boot auto-configures an in-memory database.
+
+You need to opt-in to auto-configuration by adding the `@EnableAutoConfiguration` or `@SpringBootApplication` annotations to one of your `@Configuration` classes.
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| You should only ever add one `@EnableAutoConfiguration` annotation. We generally recommend that you add it to your primary `@Configuration`class. |
+
+## 16.1 Gradually Replacing Auto-configuration
+
+Auto-configuration is non-invasive. At any point, you can start to define your own configuration to replace specific parts of the auto-configuration. For example, if you add your own `DataSource` bean, the default embedded database support backs away.
+
+If you need to find out what auto-configuration is currently being applied, and why, start your application with the `--debug` switch. Doing so enables debug logs for a selection of core loggers and logs a conditions report to the console.
+
+## 16.2 Disabling Specific Auto-configuration Classes
+
+If you find that specific auto-configuration classes that you do not want are being applied, you can use the exclude attribute of `@EnableAutoConfiguration` to disable them, as shown in the following example:
+
+```
+import org.springframework.boot.autoconfigure.*;
+import org.springframework.boot.autoconfigure.jdbc.*;
+import org.springframework.context.annotation.*;
+
+@Configuration
+@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
+public class MyConfiguration {
+}
+
+```
+
+If the class is not on the classpath, you can use the `excludeName` attribute of the annotation and specify the fully qualified name instead. Finally, you can also control the list of auto-configuration classes to exclude by using the `spring.autoconfigure.exclude` property.
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| You can define exclusions both at the annotation level and by using the property. |
+
+## 17. Spring Beans and Dependency Injection
+
+You are free to use any of the standard Spring Framework techniques to define your beans and their injected dependencies. For simplicity, we often find that using`@ComponentScan` (to find your beans) and using `@Autowired` (to do constructor injection) works well.
+
+If you structure your code as suggested above (locating your application class in a root package), you can add `@ComponentScan` without any arguments. All of your application components (`@Component`, `@Service`, `@Repository`, `@Controller` etc.) are automatically registered as Spring Beans.
+
+The following example shows a `@Service` Bean that uses constructor injection to obtain a required `RiskAssessor` bean:
+
+```
+package com.example.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DatabaseAccountService implements AccountService {
+
+ private final RiskAssessor riskAssessor;
+
+ @Autowired
+ public DatabaseAccountService(RiskAssessor riskAssessor) {
+ this.riskAssessor = riskAssessor;
+ }
+
+ // ...
+
+}
+
+```
+
+If a bean has one constructor, you can omit the `@Autowired`, as shown in the following example:
+
+```
+@Service
+public class DatabaseAccountService implements AccountService {
+
+ private final RiskAssessor riskAssessor;
+
+ public DatabaseAccountService(RiskAssessor riskAssessor) {
+ this.riskAssessor = riskAssessor;
+ }
+
+ // ...
+
+}
+
+```
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| Notice how using constructor injection lets the `riskAssessor` field be marked as `final`, indicating that it cannot be subsequently changed. |
+
+## 18. Using the @SpringBootApplication Annotation
+
+Many Spring Boot developers always have their main class annotated with `@Configuration`, `@EnableAutoConfiguration`, and `@ComponentScan`. Since these annotations are so frequently used together (especially if you follow the [best practices](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-structuring-your-code) above), Spring Boot provides a convenient `@SpringBootApplication`alternative.
+
+The `@SpringBootApplication` annotation is equivalent to using `@Configuration`, `@EnableAutoConfiguration`, and `@ComponentScan` with their default attributes, as shown in the following example:
+
+```
+package com.example.myapplication;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class, args);
+ }
+
+}
+
+```
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| `@SpringBootApplication` also provides aliases to customize the attributes of `@EnableAutoConfiguration` and `@ComponentScan`. |
+
+## 19. Running Your Application
+
+One of the biggest advantages of packaging your application as a jar and using an embedded HTTP server is that you can run your application as you would any other. Debugging Spring Boot applications is also easy. You do not need any special IDE plugins or extensions.
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| This section only covers jar based packaging. If you choose to package your application as a war file, you should refer to your server and IDE documentation. |
+
+## 19.1 Running from an IDE
+
+You can run a Spring Boot application from your IDE as a simple Java application. However, you first need to import your project. Import steps vary depending on your IDE and build system. Most IDEs can import Maven projects directly. For example, Eclipse users can select `Import…` → `Existing Maven Projects` from the `File` menu.
+
+If you cannot directly import your project into your IDE, you may be able to generate IDE metadata by using a build plugin. Maven includes plugins for [Eclipse](https://maven.apache.org/plugins/maven-eclipse-plugin/) and [IDEA](https://maven.apache.org/plugins/maven-idea-plugin/). Gradle offers plugins for [various IDEs](https://docs.gradle.org/4.2.1/userguide/userguide.html).
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| If you accidentally run a web application twice, you see a “Port already in use” error. STS users can use the `Relaunch` button rather than the `Run` button to ensure that any existing instance is closed. |
+
+## 19.2 Running as a Packaged Application
+
+If you use the Spring Boot Maven or Gradle plugins to create an executable jar, you can run your application using `java -jar`, as shown in the following example:
+
+```
+$ java -jar target/myapplication-0.0.1-SNAPSHOT.jar
+
+```
+
+It is also possible to run a packaged application with remote debugging support enabled. Doing so lets you attach a debugger to your packaged application, as shown in the following example:
+
+```
+$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
+ -jar target/myapplication-0.0.1-SNAPSHOT.jar
+
+```
+
+## 19.3 Using the Maven Plugin
+
+The Spring Boot Maven plugin includes a `run` goal that can be used to quickly compile and run your application. Applications run in an exploded form, as they do in your IDE. The following example shows a typical Maven command to run a Spring Boot application:
+
+```
+$ mvn spring-boot:run
+
+```
+
+You might also want to use the `MAVEN_OPTS` operating system environment variable, as shown in the following example:
+
+```
+$ export MAVEN_OPTS=-Xmx1024m
+
+```
+
+## 19.4 Using the Gradle Plugin
+
+The Spring Boot Gradle plugin also includes a `bootRun` task that can be used to run your application in an exploded form. The `bootRun` task is added whenever you apply the `org.springframework.boot` and `java` plugins and is shown in the following example:
+
+```
+$ gradle bootRun
+
+```
+
+You might also want to use the `JAVA_OPTS` operating system environment variable, as shown in the following example:
+
+```
+$ export JAVA_OPTS=-Xmx1024m
+
+```
+
+## 19.5 Hot Swapping
+
+Since Spring Boot applications are just plain Java applications, JVM hot-swapping should work out of the box. JVM hot swapping is somewhat limited with the bytecode that it can replace. For a more complete solution, [JRebel](https://zeroturnaround.com/software/jrebel/) can be used.
+
+The `spring-boot-devtools` module also includes support for quick application restarts. See the [Chapter 20, *Developer Tools*](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools) section later in this chapter and the[Hot swapping “How-to”](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-hotswapping) for details.
+
+## 20. Developer Tools
+
+Spring Boot includes an additional set of tools that can make the application development experience a little more pleasant. The `spring-boot-devtools` module can be included in any project to provide additional development-time features. To include devtools support, add the module dependency to your build, as shown in the following listings for Maven and Gradle:
+
+**Maven.**
+
+```
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+
+
+
+```
+
+
+
+**Gradle.**
+
+```
+dependencies {
+ compile("org.springframework.boot:spring-boot-devtools")
+}
+
+```
+
+
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| Developer tools are automatically disabled when running a fully packaged application. If your application is launched from `java -jar` or if it is started from a special classloader, then it is considered a “production application”. Flagging the dependency as optional is a best practice that prevents devtools from being transitively applied to other modules that use your project. Gradle does not support `optional` dependencies out-of-the-box, so you may want to have a look at the [`propdeps-plugin`](https://github.com/spring-projects/gradle-plugins/tree/master/propdeps-plugin). |
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| Repackaged archives do not contain devtools by default. If you want to use a [certain remote devtools feature](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-remote), you need to disable the `excludeDevtools`build property to include it. The property is supported with both the Maven and Gradle plugins. |
+
+## 20.1 Property Defaults
+
+Several of the libraries supported by Spring Boot use caches to improve performance. For example, [template engines](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-template-engines) cache compiled templates to avoid repeatedly parsing template files. Also, Spring MVC can add HTTP caching headers to responses when serving static resources.
+
+While caching is very beneficial in production, it can be counter-productive during development, preventing you from seeing the changes you just made in your application. For this reason, spring-boot-devtools disables the caching options by default.
+
+Cache options are usually configured by settings in your `application.properties` file. For example, Thymeleaf offers the `spring.thymeleaf.cache` property. Rather than needing to set these properties manually, the `spring-boot-devtools` module automatically applies sensible development-time configuration.
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| For a complete list of the properties that are applied by the devtools, see [DevToolsPropertyDefaultsPostProcessor](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-devtools/src/main/java/org/springframework/boot/devtools/env/DevToolsPropertyDefaultsPostProcessor.java). |
+
+## 20.2 Automatic Restart
+
+Applications that use `spring-boot-devtools` automatically restart whenever files on the classpath change. This can be a useful feature when working in an IDE, as it gives a very fast feedback loop for code changes. By default, any entry on the classpath that points to a folder is monitored for changes. Note that certain resources, such as static assets and view templates, [do not need to restart the application](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-restart-exclude).
+
+**Triggering a restart**
+
+As DevTools monitors classpath resources, the only way to trigger a restart is to update the classpath. The way in which you cause the classpath to be updated depends on the IDE that you are using. In Eclipse, saving a modified file causes the classpath to be updated and triggers a restart. In IntelliJ IDEA, building the project (`Build -> Make Project`) has the same effect.
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| As long as forking is enabled, you can also start your application by using the supported build plugins (Maven and Gradle), since DevTools needs an isolated application classloader to operate properly. By default, Gradle and Maven do that when they detect DevTools on the classpath. |
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| Automatic restart works very well when used with LiveReload. [See the LiveReload section](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-livereload) for details. If you use JRebel, automatic restarts are disabled in favor of dynamic class reloading. Other devtools features (such as LiveReload and property overrides) can still be used. |
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| DevTools relies on the application context’s shutdown hook to close it during a restart. It does not work correctly if you have disabled the shutdown hook (`SpringApplication.setRegisterShutdownHook(false)`). |
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| When deciding if an entry on the classpath should trigger a restart when it changes, DevTools automatically ignores projects named `spring-boot`,`spring-boot-devtools`, `spring-boot-autoconfigure`, `spring-boot-actuator`, and `spring-boot-starter`. |
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| DevTools needs to customize the `ResourceLoader` used by the `ApplicationContext`. If your application provides one already, it is going to be wrapped. Direct override of the `getResource` method on the `ApplicationContext` is not supported. |
+
+
+
+**Restart vs Reload**
+
+The restart technology provided by Spring Boot works by using two classloaders. Classes that do not change (for example, those from third-party jars) are loaded into a *base* classloader. Classes that you are actively developing are loaded into a *restart* classloader. When the application is restarted, the *restart* classloader is thrown away and a new one is created. This approach means that application restarts are typically much faster than “cold starts”, since the *base* classloader is already available and populated.
+
+If you find that restarts are not quick enough for your applications or you encounter classloading issues, you could consider reloading technologies such as [JRebel](https://zeroturnaround.com/software/jrebel/)from ZeroTurnaround. These work by rewriting classes as they are loaded to make them more amenable to reloading.
+
+### 20.2.1 Logging changes in condition evaluation
+
+By default, each time your application restarts, a report showing the condition evaluation delta is logged. The report shows the changes to your application’s auto-configuration as you make changes such as adding or removing beans and setting configuration properties.
+
+To disable the logging of the report, set the following property:
+
+```
+spring.devtools.restart.log-condition-evaluation-delta=false
+
+```
+
+### 20.2.2 Excluding Resources
+
+Certain resources do not necessarily need to trigger a restart when they are changed. For example, Thymeleaf templates can be edited in-place. By default, changing resources in `/META-INF/maven`, `/META-INF/resources`, `/resources`, `/static`, `/public`, or `/templates` does not trigger a restart but does trigger a [live reload](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-livereload). If you want to customize these exclusions, you can use the `spring.devtools.restart.exclude` property. For example, to exclude only `/static` and `/public` you would set the following property:
+
+```
+spring.devtools.restart.exclude=static/**,public/**
+
+```
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| If you want to keep those defaults and *add* additional exclusions, use the `spring.devtools.restart.additional-exclude` property instead. |
+
+### 20.2.3 Watching Additional Paths
+
+You may want your application to be restarted or reloaded when you make changes to files that are not on the classpath. To do so, use the`spring.devtools.restart.additional-paths` property to configure additional paths to watch for changes. You can use the `spring.devtools.restart.exclude` property [described earlier](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-restart-exclude) to control whether changes beneath the additional paths trigger a full restart or a [live reload](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-livereload).
+
+### 20.2.4 Disabling Restart
+
+If you do not want to use the restart feature, you can disable it by using the `spring.devtools.restart.enabled` property. In most cases, you can set this property in your `application.properties` (doing so still initializes the restart classloader, but it does not watch for file changes).
+
+If you need to *completely* disable restart support (for example, because it does not work with a specific library), you need to set the `spring.devtools.restart.enabled` `System` property to `false` before calling `SpringApplication.run(…)`, as shown in the following example:
+
+```
+public static void main(String[] args) {
+ System.setProperty("spring.devtools.restart.enabled", "false");
+ SpringApplication.run(MyApp.class, args);
+}
+
+```
+
+### 20.2.5 Using a Trigger File
+
+If you work with an IDE that continuously compiles changed files, you might prefer to trigger restarts only at specific times. To do so, you can use a “trigger file”, which is a special file that must be modified when you want to actually trigger a restart check. Changing the file only triggers the check and the restart only occurs if Devtools has detected it has to do something. The trigger file can be updated manually or with an IDE plugin.
+
+To use a trigger file, set the `spring.devtools.restart.trigger-file` property to the path of your trigger file.
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| You might want to set `spring.devtools.restart.trigger-file` as a [global setting](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-globalsettings), so that all your projects behave in the same way. |
+
+### 20.2.6 Customizing the Restart Classloader
+
+As described earlier in the [Restart vs Reload](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-spring-boot-restart-vs-reload) section, restart functionality is implemented by using two classloaders. For most applications, this approach works well. However, it can sometimes cause classloading issues.
+
+By default, any open project in your IDE is loaded with the “restart” classloader, and any regular `.jar` file is loaded with the “base” classloader. If you work on a multi-module project, and not every module is imported into your IDE, you may need to customize things. To do so, you can create a `META-INF/spring-devtools.properties` file.
+
+The `spring-devtools.properties` file can contain properties prefixed with `restart.exclude` and `restart.include`. The `include` elements are items that should be pulled up into the “restart” classloader, and the `exclude` elements are items that should be pushed down into the “base” classloader. The value of the property is a regex pattern that is applied to the classpath, as shown in the following example:
+
+```
+restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
+restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
+
+```
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| All property keys must be unique. As long as a property starts with `restart.include.` or `restart.exclude.` it is considered. |
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| All `META-INF/spring-devtools.properties` from the classpath are loaded. You can package files inside your project, or in the libraries that the project consumes. |
+
+### 20.2.7 Known Limitations
+
+Restart functionality does not work well with objects that are deserialized by using a standard `ObjectInputStream`. If you need to deserialize data, you may need to use Spring’s `ConfigurableObjectInputStream` in combination with `Thread.currentThread().getContextClassLoader()`.
+
+Unfortunately, several third-party libraries deserialize without considering the context classloader. If you find such a problem, you need to request a fix with the original authors.
+
+## 20.3 LiveReload
+
+The `spring-boot-devtools` module includes an embedded LiveReload server that can be used to trigger a browser refresh when a resource is changed. LiveReload browser extensions are freely available for Chrome, Firefox and Safari from [livereload.com](https://livereload.com/extensions/).
+
+If you do not want to start the LiveReload server when your application runs, you can set the `spring.devtools.livereload.enabled` property to `false`.
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| You can only run one LiveReload server at a time. Before starting your application, ensure that no other LiveReload servers are running. If you start multiple applications from your IDE, only the first has LiveReload support. |
+
+## 20.4 Global Settings
+
+You can configure global devtools settings by adding a file named `.spring-boot-devtools.properties` to your `$HOME` folder (note that the filename starts with “.”). Any properties added to this file apply to *all* Spring Boot applications on your machine that use devtools. For example, to configure restart to always use a [trigger file](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-restart-triggerfile), you would add the following property:
+
+**~/.spring-boot-devtools.properties.**
+
+```
+spring.devtools.reload.trigger-file=.reloadtrigger
+
+```
+
+
+
+## 20.5 Remote Applications
+
+The Spring Boot developer tools are not limited to local development. You can also use several features when running applications remotely. Remote support is opt-in. To enable it, you need to make sure that `devtools` is included in the repackaged archive, as shown in the following listing:
+
+```
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ false
+
+
+
+
+
+```
+
+Then you need to set a `spring.devtools.remote.secret` property, as shown in the following example:
+
+```
+spring.devtools.remote.secret=mysecret
+
+```
+
+| ![[Warning]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/warning.png) |
+| ------------------------------------------------------------ |
+| Enabling `spring-boot-devtools` on a remote application is a security risk. You should never enable support on a production deployment. |
+
+Remote devtools support is provided in two parts: a server-side endpoint that accepts connections and a client application that you run in your IDE. The server component is automatically enabled when the `spring.devtools.remote.secret` property is set. The client component must be launched manually.
+
+### 20.5.1 Running the Remote Client Application
+
+The remote client application is designed to be run from within your IDE. You need to run `org.springframework.boot.devtools.RemoteSpringApplication`with the same classpath as the remote project that you connect to. The application’s single required argument is the remote URL to which it connects.
+
+For example, if you are using Eclipse or STS and you have a project named `my-app` that you have deployed to Cloud Foundry, you would do the following:
+
+- Select `Run Configurations…` from the `Run` menu.
+- Create a new `Java Application` “launch configuration”.
+- Browse for the `my-app` project.
+- Use `org.springframework.boot.devtools.RemoteSpringApplication` as the main class.
+- Add `https://myapp.cfapps.io` to the `Program arguments` (or whatever your remote URL is).
+
+A running remote client might resemble the following listing:
+
+```
+ . ____ _ __ _ _
+ /\\ / ___'_ __ _ _(_)_ __ __ _ ___ _ \ \ \ \
+( ( )\___ | '_ | '_| | '_ \/ _` | | _ \___ _ __ ___| |_ ___ \ \ \ \
+ \\/ ___)| |_)| | | | | || (_| []::::::[] / -_) ' \/ _ \ _/ -_) ) ) ) )
+ ' |____| .__|_| |_|_| |_\__, | |_|_\___|_|_|_\___/\__\___|/ / / /
+ =========|_|==============|___/===================================/_/_/_/
+ :: Spring Boot Remote :: 2.0.0.BUILD-SNAPSHOT
+
+2015-06-10 18:25:06.632 INFO 14938 --- [ main] o.s.b.devtools.RemoteSpringApplication : Starting RemoteSpringApplication on pwmbp with PID 14938 (/Users/pwebb/projects/spring-boot/code/spring-boot-devtools/target/classes started by pwebb in /Users/pwebb/projects/spring-boot/code/spring-boot-samples/spring-boot-sample-devtools)
+2015-06-10 18:25:06.671 INFO 14938 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2a17b7b6: startup date [Wed Jun 10 18:25:06 PDT 2015]; root of context hierarchy
+2015-06-10 18:25:07.043 WARN 14938 --- [ main] o.s.b.d.r.c.RemoteClientConfiguration : The connection to http://localhost:8080 is insecure. You should use a URL starting with 'https://'.
+2015-06-10 18:25:07.074 INFO 14938 --- [ main] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
+2015-06-10 18:25:07.130 INFO 14938 --- [ main] o.s.b.devtools.RemoteSpringApplication : Started RemoteSpringApplication in 0.74 seconds (JVM running for 1.105)
+
+```
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| Because the remote client is using the same classpath as the real application it can directly read application properties. This is how the `spring.devtools.remote.secret` property is read and passed to the server for authentication. |
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| It is always advisable to use `https://` as the connection protocol, so that traffic is encrypted and passwords cannot be intercepted. |
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| If you need to use a proxy to access the remote application, configure the `spring.devtools.remote.proxy.host` and `spring.devtools.remote.proxy.port` properties. |
+
+### 20.5.2 Remote Update
+
+The remote client monitors your application classpath for changes in the same way as the [local restart](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-restart). Any updated resource is pushed to the remote application and (*if required*) triggers a restart. This can be helpful if you iterate on a feature that uses a cloud service that you do not have locally. Generally, remote updates and restarts are much quicker than a full rebuild and deploy cycle.
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| Files are only monitored when the remote client is running. If you change a file before starting the remote client, it is not pushed to the remote server. |
+
+## 21. Packaging Your Application for Production
+
+Executable jars can be used for production deployment. As they are self-contained, they are also ideally suited for cloud-based deployment.
+
+For additional “production ready” features, such as health, auditing, and metric REST or JMX end-points, consider adding `spring-boot-actuator`. See *Part V, “Spring Boot Actuator: Production-ready features”* for details.
+
+## 22. What to Read Next
+
+You should now understand how you can use Spring Boot and some best practices that you should follow. You can now go on to learn about specific *Spring Boot features*in depth, or you could skip ahead and read about the “[production ready](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready)” aspects of Spring Boot.
+
+# Part IV. Spring Boot features
+
+
+
+This section dives into the details of Spring Boot. Here you can learn about the key features that you may want to use and customize. If you have not already done so, you might want to read the "[Part II, “Getting Started”](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#getting-started)" and "[Part III, “Using Spring Boot”](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot)" sections, so that you have a good grounding of the basics.
+
+## 23. SpringApplication
+
+The `SpringApplication` class provides a convenient way to bootstrap a Spring application that is started from a `main()` method. In many situations, you can delegate to the static `SpringApplication.run` method, as shown in the following example:
+
+```
+public static void main(String[] args) {
+ SpringApplication.run(MySpringConfiguration.class, args);
+}
+
+```
+
+When your application starts, you should see something similar to the following output:
+
+```
+ . ____ _ __ _ _
+ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
+( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
+ \\/ ___)| |_)| | | | | || (_| | ) ) ) )
+ ' |____| .__|_| |_|_| |_\__, | / / / /
+ =========|_|==============|___/=/_/_/_/
+ :: Spring Boot :: v2.0.0.BUILD-SNAPSHOT
+
+2013-07-31 00:08:16.117 INFO 56603 --- [ main] o.s.b.s.app.SampleApplication : Starting SampleApplication v0.1.0 on mycomputer with PID 56603 (/apps/myapp.jar started by pwebb)
+2013-07-31 00:08:16.166 INFO 56603 --- [ main] ationConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6e5a8246: startup date [Wed Jul 31 00:08:16 PDT 2013]; root of context hierarchy
+2014-03-04 13:09:54.912 INFO 41370 --- [ main] .t.TomcatServletWebServerFactory : Server initialized with port: 8080
+2014-03-04 13:09:56.501 INFO 41370 --- [ main] o.s.b.s.app.SampleApplication : Started SampleApplication in 2.992 seconds (JVM running for 3.658)
+
+```
+
+By default, `INFO` logging messages are shown, including some relevant startup details, such as the user that launched the application. If you need a log level other than `INFO`, you can set it, as described in [Section 26.4, “Log Levels”](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-custom-log-levels),
+
+## 23.1 Startup Failure
+
+If your application fails to start, registered `FailureAnalyzers` get a chance to provide a dedicated error message and a concrete action to fix the problem. For instance, if you start a web application on port `8080` and that port is already in use, you should see something similar to the following message:
+
+```
+***************************
+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.
+
+```
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| Spring Boot provides numerous `FailureAnalyzer` implementations, and you can [add your own](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-failure-analyzer). |
+
+If no failure analyzers are able to handle the exception, you can still display the full conditions report to better understand what went wrong. To do so, you need to [enable the `debug` property](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config) or [enable `DEBUG` logging](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-custom-log-levels) for`org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener`.
+
+For instance, if you are running your application by using `java -jar`, you can enable the `debug` property as follows:
+
+```
+$ java -jar myproject-0.0.1-SNAPSHOT.jar --debug
+
+```
+
+## 23.2 Customizing the Banner
+
+The banner that is printed on start up can be changed by adding a `banner.txt` file to your classpath or by setting the `spring.banner.location` property to the location of such a file. If the file has an encoding other than UTF-8, you can set `spring.banner.charset`. In addition to a text file, you can also add a `banner.gif`, `banner.jpg`, or `banner.png` image file to your classpath or set the `spring.banner.image.location` property. Images are converted into an ASCII art representation and printed above any text banner.
+
+Inside your `banner.txt` file, you can use any of the following placeholders:
+
+
+
+**Table 23.1. Banner variables**
+
+| Variable | Description |
+| ------------------------------------------------------------ | ------------------------------------------------------------ |
+| `${application.version}` | The version number of your application, as declared in `MANIFEST.MF`. For example,`Implementation-Version: 1.0` is printed as `1.0`. |
+| `${application.formatted-version}` | The version number of your application, as declared in `MANIFEST.MF` and formatted for display (surrounded with brackets and prefixed with `v`). For example `(v1.0)`. |
+| `${spring-boot.version}` | The Spring Boot version that you are using. For example `2.0.0.BUILD-SNAPSHOT`. |
+| `${spring-boot.formatted-version}` | The Spring Boot version that you are using, formatted for display (surrounded with brackets and prefixed with `v`). For example `(v2.0.0.BUILD-SNAPSHOT)`. |
+| `${Ansi.NAME}` (or `${AnsiColor.NAME}`, `${AnsiBackground.NAME}`, `${AnsiStyle.NAME}`) | Where `NAME` is the name of an ANSI escape code. See [`AnsiPropertySource`](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/ansi/AnsiPropertySource.java) for details. |
+| `${application.title}` | The title of your application, as declared in `MANIFEST.MF`. For example`Implementation-Title: MyApp` is printed as `MyApp`. |
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| The `SpringApplication.setBanner(…)` method can be used if you want to generate a banner programmatically. Use the `org.springframework.boot.Banner` interface and implement your own `printBanner()` method. |
+
+You can also use the `spring.main.banner-mode` property to determine if the banner has to be printed on `System.out` (`console`), sent to the configured logger (`log`), or not produced at all (`off`).
+
+The printed banner is registered as a singleton bean under the following name: `springBootBanner`.
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| YAML maps `off` to `false`, so be sure to add quotes if you want to disable the banner in your application, as shown in the following example:`spring: main: banner-mode: "off"` |
+
+## 23.3 Customizing SpringApplication
+
+If the `SpringApplication` defaults are not to your taste, you can instead create a local instance and customize it. For example, to turn off the banner, you could write:
+
+```
+public static void main(String[] args) {
+ SpringApplication app = new SpringApplication(MySpringConfiguration.class);
+ app.setBannerMode(Banner.Mode.OFF);
+ app.run(args);
+}
+
+```
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| The constructor arguments passed to `SpringApplication` are configuration sources for Spring beans. In most cases, these are references to `@Configuration` classes, but they could also be references to XML configuration or to packages that should be scanned. |
+
+It is also possible to configure the `SpringApplication` by using an `application.properties` file. See *Chapter 24, Externalized Configuration* for details.
+
+For a complete list of the configuration options, see the [`SpringApplication` Javadoc](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/api/org/springframework/boot/SpringApplication.html).
+
+## 23.4 Fluent Builder API
+
+If you need to build an `ApplicationContext` hierarchy (multiple contexts with a parent/child relationship) or if you prefer using a “fluent” builder API, you can use the `SpringApplicationBuilder`.
+
+The `SpringApplicationBuilder` lets you chain together multiple method calls and includes `parent` and `child` methods that let you create a hierarchy, as shown in the following example:
+
+```
+new SpringApplicationBuilder()
+ .sources(Parent.class)
+ .child(Application.class)
+ .bannerMode(Banner.Mode.OFF)
+ .run(args);
+
+```
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| There are some restrictions when creating an `ApplicationContext` hierarchy. For example, Web components **must** be contained within the child context, and the same `Environment` is used for both parent and child contexts. See the [`SpringApplicationBuilder` Javadoc](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/api/org/springframework/boot/builder/SpringApplicationBuilder.html) for full details. |
+
+## 23.5 Application Events and Listeners
+
+In addition to the usual Spring Framework events, such as [`ContextRefreshedEvent`](https://docs.spring.io/spring/docs/5.0.4.RELEASE/javadoc-api/org/springframework/context/event/ContextRefreshedEvent.html), a `SpringApplication` sends some additional application events.
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| Some events are actually triggered before the `ApplicationContext` is created, so you cannot register a listener on those as a `@Bean`. You can register them with the `SpringApplication.addListeners(…)` method or the `SpringApplicationBuilder.listeners(…)` method.If you want those listeners to be registered automatically, regardless of the way the application is created, you can add a `META-INF/spring.factories`file to your project and reference your listener(s) by using the `org.springframework.context.ApplicationListener` key, as shown in the following example:`org.springframework.context.ApplicationListener=com.example.project.MyListener` |
+
+Application events are sent in the following order, as your application runs:
+
+1. An `ApplicationStartingEvent` is sent at the start of a run but before any processing, except for the registration of listeners and initializers.
+2. An `ApplicationEnvironmentPreparedEvent` is sent when the `Environment` to be used in the context is known but before the context is created.
+3. An `ApplicationPreparedEvent` is sent just before the refresh is started but after bean definitions have been loaded.
+4. An `ApplicationStartedEvent` is sent after the context has been refreshed but before any application and command-line runners have been called.
+5. An `ApplicationReadyEvent` is sent after any application and command-line runners have been called. It indicates that the application is ready to service requests.
+6. An `ApplicationFailedEvent` is sent if there is an exception on startup.
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| You often need not use application events, but it can be handy to know that they exist. Internally, Spring Boot uses events to handle a variety of tasks. |
+
+Application events are sent by using Spring Framework’s event publishing mechanism. Part of this mechanism ensures that an event published to the listeners in a child context is also published to the listeners in any ancestor contexts. As a result of this, if your application uses a hierarchy of `SpringApplication` instances, a listener may receive multiple instances of the same type of application event.
+
+To allow your listener to distinguish between an event for its context and an event for a descendant context, it should request that its application context is injected and then compare the injected context with the context of the event. The context can be injected by implementing `ApplicationContextAware` or, if the listener is a bean, by using `@Autowired`.
+
+## 23.6 Web Environment
+
+A `SpringApplication` attempts to create the right type of `ApplicationContext` on your behalf. By default, an `AnnotationConfigApplicationContext` or`AnnotationConfigServletWebServerApplicationContext` is used, depending on whether you are developing a web application or not.
+
+The algorithm used to determine a “web environment” is fairly simplistic (it is based on the presence of a few classes). If you need to override the default, you can use`setWebEnvironment(boolean webEnvironment)`.
+
+It is also possible to take complete control of the `ApplicationContext` type that is used by calling `setApplicationContextClass(…)`.
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| It is often desirable to call `setWebEnvironment(false)` when using `SpringApplication` within a JUnit test. |
+
+## 23.7 Accessing Application Arguments
+
+If you need to access the application arguments that were passed to `SpringApplication.run(…)`, you can inject a`org.springframework.boot.ApplicationArguments` bean. The `ApplicationArguments` interface provides access to both the raw `String[]` arguments as well as parsed `option` and `non-option` arguments, as shown in the following example:
+
+```
+import org.springframework.boot.*
+import org.springframework.beans.factory.annotation.*
+import org.springframework.stereotype.*
+
+@Component
+public class MyBean {
+
+ @Autowired
+ public MyBean(ApplicationArguments args) {
+ boolean debug = args.containsOption("debug");
+ List files = args.getNonOptionArgs();
+ // if run with "--debug logfile.txt" debug=true, files=["logfile.txt"]
+ }
+
+}
+
+```
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| Spring Boot also registers a `CommandLinePropertySource` with the Spring `Environment`. This lets you also inject single application arguments by using the `@Value` annotation. |
+
+## 23.8 Using the ApplicationRunner or CommandLineRunner
+
+If you need to run some specific code once the `SpringApplication` has started, you can implement the `ApplicationRunner` or `CommandLineRunner`interfaces. Both interfaces work in the same way and offer a single `run` method, which is called just before `SpringApplication.run(…)` completes.
+
+The `CommandLineRunner` interfaces provides access to application arguments as a simple string array, whereas the `ApplicationRunner` uses the `ApplicationArguments` interface discussed earlier. The following example shows a `CommandLineRunner` with a `run` method:
+
+```
+import org.springframework.boot.*
+import org.springframework.stereotype.*
+
+@Component
+public class MyBean implements CommandLineRunner {
+
+ public void run(String... args) {
+ // Do something...
+ }
+
+}
+
+```
+
+If several `CommandLineRunner` or `ApplicationRunner` beans are defined that must be called in a specific order, you can additionally implement the`org.springframework.core.Ordered` interface or use the `org.springframework.core.annotation.Order` annotation.
+
+## 23.9 Application Exit
+
+Each `SpringApplication` registers a shutdown hook with the JVM to ensure that the `ApplicationContext` closes gracefully on exit. All the standard Spring lifecycle callbacks (such as the `DisposableBean` interface or the `@PreDestroy` annotation) can be used.
+
+In addition, beans may implement the `org.springframework.boot.ExitCodeGenerator` interface if they wish to return a specific exit code when `SpringApplication.exit()` is called. This exit code can then be passed to `System.exit()` to return it as a status code, as shown in the following example:
+
+```
+@SpringBootApplication
+public class ExitCodeApplication {
+
+ @Bean
+ public ExitCodeGenerator exitCodeGenerator() {
+ return () -> 42;
+ }
+
+ public static void main(String[] args) {
+ System.exit(SpringApplication
+ .exit(SpringApplication.run(ExitCodeApplication.class, args)));
+ }
+
+}
+
+```
+
+Also, the `ExitCodeGenerator` interface may be implemented by exceptions. When such an exception is encountered, Spring Boot returns the exit code provided by the implemented `getExitCode()` method.
+
+## 23.10 Admin Features
+
+It is possible to enable admin-related features for the application by specifying the `spring.application.admin.enabled` property. This exposes the[`SpringApplicationAdminMXBean`](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/admin/SpringApplicationAdminMXBean.java) on the platform `MBeanServer`. You could use this feature to administer your Spring Boot application remotely. This feature could also be useful for any service wrapper implementation.
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| If you want to know on which HTTP port the application is running, get the property with a key of `local.server.port`. |
+
+| ![[Caution]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/caution.png) | Caution |
+| ------------------------------------------------------------ | ------- |
+| Take care when enabling this feature, as the MBean exposes a method to shutdown the application. | |
+
+## 24. Externalized Configuration
+
+Spring Boot lets you externalize your configuration so that you can work with the same application code in different environments. You can use properties files, YAML files, environment variables, and command-line arguments to externalize configuration. Property values can be injected directly into your beans by using the `@Value`annotation, accessed through Spring’s `Environment` abstraction, or be [bound to structured objects](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-typesafe-configuration-properties) through `@ConfigurationProperties`.
+
+Spring Boot uses a very particular `PropertySource` order that is designed to allow sensible overriding of values. Properties are considered in the following order:
+
+1. [Devtools global settings properties](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#using-boot-devtools-globalsettings) on your home directory (`~/.spring-boot-devtools.properties` when devtools is active).
+2. [`@TestPropertySource`](https://docs.spring.io/spring/docs/5.0.4.RELEASE/javadoc-api/org/springframework/test/context/TestPropertySource.html) annotations on your tests.
+3. [`@SpringBootTest#properties`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/api/org/springframework/boot/test/context/SpringBootTest.html) annotation attribute on your tests.
+4. Command line arguments.
+5. Properties from `SPRING_APPLICATION_JSON` (inline JSON embedded in an environment variable or system property).
+6. `ServletConfig` init parameters.
+7. `ServletContext` init parameters.
+8. JNDI attributes from `java:comp/env`.
+9. Java System properties (`System.getProperties()`).
+10. OS environment variables.
+11. A `RandomValuePropertySource` that has properties only in `random.*`.
+12. [Profile-specific application properties](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-profile-specific-properties) outside of your packaged jar (`application-{profile}.properties` and YAML variants).
+13. [Profile-specific application properties](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-profile-specific-properties) packaged inside your jar (`application-{profile}.properties` and YAML variants).
+14. Application properties outside of your packaged jar (`application.properties` and YAML variants).
+15. Application properties packaged inside your jar (`application.properties` and YAML variants).
+16. [`@PropertySource`](https://docs.spring.io/spring/docs/5.0.4.RELEASE/javadoc-api/org/springframework/context/annotation/PropertySource.html) annotations on your `@Configuration` classes.
+17. Default properties (specified by setting `SpringApplication.setDefaultProperties`).
+
+To provide a concrete example, suppose you develop a `@Component` that uses a `name` property, as shown in the following example:
+
+```
+import org.springframework.stereotype.*
+import org.springframework.beans.factory.annotation.*
+
+@Component
+public class MyBean {
+
+ @Value("${name}")
+ private String name;
+
+ // ...
+
+}
+
+```
+
+On your application classpath (for example, inside your jar) you can have an `application.properties` file that provides a sensible default property value for `name`. When running in a new environment, an `application.properties` file can be provided outside of your jar that overrides the `name`. For one-off testing, you can launch with a specific command line switch (for example, `java -jar app.jar --name="Spring"`).
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| The `SPRING_APPLICATION_JSON` properties can be supplied on the command line with an environment variable. For example, you could use the following line in a UN*X shell:`$ SPRING_APPLICATION_JSON='{"acme":{"name":"test"}}' java -jar myapp.jar`In the preceding example, you end up with `acme.name=test` in the Spring `Environment`. You can also supply the JSON as `spring.application.json` in a System property, as shown in the following example:`$ java -Dspring.application.json='{"name":"test"}' -jar myapp.jar`You can also supply the JSON by using a command line argument, as shown in the following example:`$ java -jar myapp.jar --spring.application.json='{"name":"test"}'`You can also supply the JSON as a JNDI variable, as follows: `java:comp/env/spring.application.json`. |
+
+## 24.1 Configuring Random Values
+
+The `RandomValuePropertySource` is useful for injecting random values (for example, into secrets or test cases). It can produce integers, longs, uuids, or strings, as shown in the following example:
+
+```
+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]}
+
+```
+
+The `random.int*` syntax is `OPEN value (,max) CLOSE` where the `OPEN,CLOSE` are any character and `value,max` are integers. If `max` is provided, then `value` is the minimum value and `max` is the maximum value (exclusive).
+
+## 24.2 Accessing Command Line Properties
+
+By default, `SpringApplication` converts any command line option arguments (that is, arguments starting with `--`, such as `--server.port=9000`) to a `property` and adds them to the Spring `Environment`. As mentioned previously, command line properties always take precedence over other property sources.
+
+If you do not want command line properties to be added to the `Environment`, you can disable them by using `SpringApplication.setAddCommandLineProperties(false)`.
+
+## 24.3 Application Property Files
+
+`SpringApplication` loads properties from `application.properties` files in the following locations and adds them to the Spring `Environment`:
+
+1. A `/config` subdirectory of the current directory
+2. The current directory
+3. A classpath `/config` package
+4. The classpath root
+
+The list is ordered by precedence (properties defined in locations higher in the list override those defined in lower locations).
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| You can also [use YAML ('.yml') files](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-yaml) as an alternative to '.properties'. |
+
+If you do not like `application.properties` as the configuration file name, you can switch to another file name by specifying a `spring.config.name`environment property. You can also refer to an explicit location by using the `spring.config.location` environment property (which is a comma-separated list of directory locations or file paths). The following example shows how to specify a different file name:
+
+```
+$ java -jar myproject.jar --spring.config.name=myproject
+
+```
+
+The following example shows how to specify two locations:
+
+```
+$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
+
+```
+
+| ![[Warning]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/warning.png) |
+| ------------------------------------------------------------ |
+| `spring.config.name` and `spring.config.location` are used very early to determine which files have to be loaded, so they must be defined as an environment property (typically an OS environment variable, a system property, or a command-line argument). |
+
+If `spring.config.location` contains directories (as opposed to files), they should end in `/` (and, at runtime, be appended with the names generated from `spring.config.name` before being loaded, including profile-specific file names). Files specified in `spring.config.location` are used as-is, with no support for profile-specific variants, and are overridden by any profile-specific properties.
+
+Config locations are searched in reverse order. By default, the configured locations are `classpath:/,classpath:/config/,file:./,file:./config/`. The resulting search order is the following:
+
+1. `file:./config/`
+2. `file:./`
+3. `classpath:/config/`
+4. `classpath:/`
+
+When custom config locations are configured by using `spring.config.location`, they replace the default locations. For example, if `spring.config.location`is configured with the value `classpath:/custom-config/,file:./custom-config/`, the search order becomes the following:
+
+1. `file:./custom-config/`
+2. `classpath:custom-config/`
+
+Alternatively, when custom config locations are configured by using `spring.config.additional-location`, they are used in addition to the default locations. Additional locations are searched before the default locations. For example, if additional locations of `classpath:/custom-config/,file:./custom-config/` are configured, the search order becomes the following:
+
+1. `file:./custom-config/`
+2. `classpath:custom-config/`
+3. `file:./config/`
+4. `file:./`
+5. `classpath:/config/`
+6. `classpath:/`
+
+This search ordering lets you specify default values in one configuration file and then selectively override those values in another. You can provide default values for your application in `application.properties` (or whatever other basename you choose with `spring.config.name`) in one of the default locations. These default values can then be overridden at runtime with a different file located in one of the custom locations.
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| If you use environment variables rather than system properties, most operating systems disallow period-separated key names, but you can use underscores instead (for example, `SPRING_CONFIG_NAME` instead of `spring.config.name`). |
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| If your application runs in a container, then JNDI properties (in `java:comp/env`) or servlet context initialization parameters can be used instead of, or as well as, environment variables or system properties. |
+
+## 24.4 Profile-specific Properties
+
+In addition to `application.properties` files, profile-specific properties can also be defined by using the following naming convention: `application-{profile}.properties`. The `Environment` has a set of default profiles (by default, `[default]`) that are used if no active profiles are set. In other words, if no profiles are explicitly activated, then properties from `application-default.properties` are loaded.
+
+Profile-specific properties are loaded from the same locations as standard `application.properties`, with profile-specific files always overriding the non-specific ones, whether or not the profile-specific files are inside or outside your packaged jar.
+
+If several profiles are specified, a last-wins strategy applies. For example, profiles specified by the `spring.profiles.active` property are added after those configured through the `SpringApplication` API and therefore take precedence.
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| If you have specified any files in `spring.config.location`, profile-specific variants of those files are not considered. Use directories in`spring.config.location` if you want to also use profile-specific properties. |
+
+## 24.5 Placeholders in Properties
+
+The values in `application.properties` are filtered through the existing `Environment` when they are used, so you can refer back to previously defined values (for example, from System properties).
+
+```
+app.name=MyApp
+app.description=${app.name} is a Spring Boot application
+
+```
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| You can also use this technique to create “short” variants of existing Spring Boot properties. See the *Section 74.4, “Use ‘Short’ Command Line Arguments”*how-to for details. |
+
+## 24.6 Using YAML Instead of Properties
+
+[YAML](http://yaml.org/) is a superset of JSON and, as such, is a convenient format for specifying hierarchical configuration data. The `SpringApplication` class automatically supports YAML as an alternative to properties whenever you have the [SnakeYAML](http://www.snakeyaml.org/) library on your classpath.
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| If you use “Starters”, SnakeYAML is automatically provided by `spring-boot-starter`. |
+
+### 24.6.1 Loading YAML
+
+Spring Framework provides two convenient classes that can be used to load YAML documents. The `YamlPropertiesFactoryBean` loads YAML as `Properties`and the `YamlMapFactoryBean` loads YAML as a `Map`.
+
+For example, consider the following YAML document:
+
+```
+environments:
+ dev:
+ url: http://dev.example.com
+ name: Developer Setup
+ prod:
+ url: http://another.example.com
+ name: My Cool App
+
+```
+
+The preceding example would be transformed into the following properties:
+
+```
+environments.dev.url=http://dev.example.com
+environments.dev.name=Developer Setup
+environments.prod.url=http://another.example.com
+environments.prod.name=My Cool App
+
+```
+
+YAML lists are represented as property keys with `[index]` dereferencers. For example, consider the following YAML:
+
+```
+my:
+servers:
+ - dev.example.com
+ - another.example.com
+
+```
+
+The preceding example would be transformed into these properties:
+
+```
+my.servers[0]=dev.example.com
+my.servers[1]=another.example.com
+
+```
+
+To bind to properties like that by using the Spring `DataBinder` utilities (which is what `@ConfigurationProperties` does), you need to have a property in the target bean of type `java.util.List` (or `Set`) and you either need to provide a setter or initialize it with a mutable value. For example, the following example binds to the properties shown previously:
+
+```
+@ConfigurationProperties(prefix="my")
+public class Config {
+
+ private List servers = new ArrayList();
+
+ public List getServers() {
+ return this.servers;
+ }
+}
+
+```
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| When lists are configured in more than one place, overriding works by replacing the entire list. In the preceding example, when `my.servers` is defined in several places, the entire list from the `PropertySource` with higher precedence overrides any other configuration for that list. Both comma-separated lists and YAML lists can be used for completely overriding the contents of the list. |
+
+### 24.6.2 Exposing YAML as Properties in the Spring Environment
+
+The `YamlPropertySourceLoader` class can be used to expose YAML as a `PropertySource` in the Spring `Environment`. Doing so lets you use the `@Value`annotation with placeholders syntax to access YAML properties.
+
+### 24.6.3 Multi-profile YAML Documents
+
+You can specify multiple profile-specific YAML documents in a single file by using a `spring.profiles` key to indicate when the document applies, as shown in the following example:
+
+```
+server:
+ address: 192.168.1.100
+---
+spring:
+ profiles: development
+server:
+ address: 127.0.0.1
+---
+spring:
+ profiles: production
+server:
+ address: 192.168.1.120
+
+```
+
+In the preceding example, if the `development` profile is active, the `server.address` property is `127.0.0.1`. Similarly, if the `production` profile is active, the`server.address` property is `192.168.1.120`. If the `development` and `production` profiles are **not** enabled, then the value for the property is `192.168.1.100`.
+
+If none are explicitly active when the application context starts, the default profiles are activated. So, in the following YAML, we set a value for `spring.security.user.password` that is available **only** in the "default" profile:
+
+```
+server:
+ port: 8000
+---
+spring:
+ profiles: default
+ security:
+ user:
+ password: weak
+
+```
+
+Whereas, in the following example, the password is always set because it is not attached to any profile, and it would have to be explicitly reset in all other profiles as necessary:
+
+```
+server:
+ port: 8000
+spring:
+ security:
+ user:
+ password: weak
+
+```
+
+Spring profiles designated by using the `spring.profiles` element may optionally be negated by using the `!` character. If both negated and non-negated profiles are specified for a single document, at least one non-negated profile must match, and no negated profiles may match.
+
+### 24.6.4 YAML Shortcomings
+
+YAML files cannot be loaded by using the `@PropertySource` annotation. So, in the case that you need to load values that way, you need to use a properties file.
+
+### 24.6.5 Merging YAML Lists
+
+As [we showed earlier](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-loading-yaml), any YAML content is ultimately transformed to properties. That process may be counter-intuitive when overriding “list” properties through a profile.
+
+For example, assume a `MyPojo` object with `name` and `description` attributes that are `null` by default. The following example exposes a list of `MyPojo` objects from `AcmeProperties`:
+
+```
+@ConfigurationProperties("acme")
+public class AcmeProperties {
+
+ private final List list = new ArrayList<>();
+
+ public List getList() {
+ return this.list;
+ }
+
+}
+
+```
+
+Consider the following configuration:
+
+```
+acme:
+ list:
+ - name: my name
+ description: my description
+---
+spring:
+ profiles: dev
+acme:
+ list:
+ - name: my another name
+
+```
+
+If the `dev` profile is not active, `AcmeProperties.list` contains one `MyPojo` entry, as previously defined. If the `dev` profile is enabled, however, the `list` *still*contains only one entry (with a name of `my another name` and a description of `null`). This configuration *does not* add a second `MyPojo` instance to the list, and it does not merge the items.
+
+When a collection is specified in multiple profiles, the one with the highest priority (and only that one) is used. Consider the following example:
+
+```
+acme:
+ list:
+ - name: my name
+ description: my description
+ - name: another name
+ description: another description
+---
+spring:
+ profiles: dev
+acme:
+ list:
+ - name: my another name
+
+```
+
+In the preceding example, if the `dev` profile is active, `AcmeProperties.list` contains *one* `MyPojo` entry (with a name of `my another name` and a description of `null`).
+
+## 24.7 Type-safe Configuration Properties
+
+Using the `@Value("${property}")` annotation to inject configuration properties can sometimes be cumbersome, especially if you are working with multiple properties or your data is hierarchical in nature. Spring Boot provides an alternative method of working with properties that lets strongly typed beans govern and validate the configuration of your application, as shown in the following example:
+
+```
+package com.example;
+
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@ConfigurationProperties("acme")
+public class AcmeProperties {
+
+ private boolean enabled;
+
+ private InetAddress remoteAddress;
+
+ private final Security security = new Security();
+
+ public boolean isEnabled() { ... }
+
+ public void setEnabled(boolean enabled) { ... }
+
+ public InetAddress getRemoteAddress() { ... }
+
+ public void setRemoteAddress(InetAddress remoteAddress) { ... }
+
+ public Security getSecurity() { ... }
+
+ public static class Security {
+
+ private String username;
+
+ private String password;
+
+ private List roles = new ArrayList<>(Collections.singleton("USER"));
+
+ public String getUsername() { ... }
+
+ public void setUsername(String username) { ... }
+
+ public String getPassword() { ... }
+
+ public void setPassword(String password) { ... }
+
+ public List getRoles() { ... }
+
+ public void setRoles(List roles) { ... }
+
+ }
+}
+
+```
+
+The preceding POJO defines the following properties:
+
+- `acme.enabled`, with a value of `false` by default.
+- `acme.remote-address`, with a type that can be coerced from `String`.
+- `acme.security.username`, with a nested "security" object whose name is determined by the name of the property. In particular, the return type is not used at all there and could have been `SecurityProperties`.
+- `acme.security.password`.
+- `acme.security.roles`, with a collection of `String`.
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| Getters and setters are usually mandatory, since binding is through standard Java Beans property descriptors, just like in Spring MVC. A setter may be omitted in the following cases:Maps, as long as they are initialized, need a getter but not necessarily a setter, since they can be mutated by the binder.Collections and arrays can be accessed either through an index (typically with YAML) or by using a single comma-separated value (properties). In the latter case, a setter is mandatory. We recommend to always add a setter for such types. If you initialize a collection, make sure it is not immutable (as in the preceding example).If nested POJO properties are initialized (like the `Security` field in the preceding example), a setter is not required. If you want the binder to create the instance on the fly by using its default constructor, you need a setter.Some people use Project Lombok to add getters and setters automatically. Make sure that Lombok does not generate any particular constructor for such a type, as it is used automatically by the container to instantiate the object. |
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| See also the [differences between `@Value` and `@ConfigurationProperties`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-vs-value). |
+
+You also need to list the properties classes to register in the `@EnableConfigurationProperties` annotation, as shown in the following example:
+
+```
+@Configuration
+@EnableConfigurationProperties(AcmeProperties.class)
+public class MyConfiguration {
+}
+
+```
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| When the `@ConfigurationProperties` bean is registered that way, the bean has a conventional name: `-`, where `` is the environment key prefix specified in the `@ConfigurationProperties` annotation and `` is the fully qualified name of the bean. If the annotation does not provide any prefix, only the fully qualified name of the bean is used.The bean name in the example above is `acme-com.example.AcmeProperties`. |
+
+Even if the preceding configuration creates a regular bean for `AcmeProperties`, we recommend that `@ConfigurationProperties` only deal with the environment and, in particular, does not inject other beans from the context. Having said that, the `@EnableConfigurationProperties` annotation is *also* automatically applied to your project so that any *existing* bean annotated with `@ConfigurationProperties` is configured from the `Environment`. You could shortcut `MyConfiguration`by making sure `AcmeProperties` is already a bean, as shown in the following example:
+
+```
+@Component
+@ConfigurationProperties(prefix="acme")
+public class AcmeProperties {
+
+ // ... see the preceding example
+
+}
+
+```
+
+This style of configuration works particularly well with the `SpringApplication` external YAML configuration, as shown in the following example:
+
+```
+# application.yml
+
+acme:
+ remote-address: 192.168.1.1
+ security:
+ username: admin
+ roles:
+ - USER
+ - ADMIN
+
+# additional configuration as required
+
+```
+
+To work with `@ConfigurationProperties` beans, you can inject them in the same way as any other bean, as shown in the following example:
+
+```
+@Service
+public class MyService {
+
+ private final AcmeProperties properties;
+
+ @Autowired
+ public MyService(AcmeProperties properties) {
+ this.properties = properties;
+ }
+
+ //...
+
+ @PostConstruct
+ public void openConnection() {
+ Server server = new Server(this.properties.getRemoteAddress());
+ // ...
+ }
+
+}
+
+```
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| Using `@ConfigurationProperties` also lets you generate metadata files that can be used by IDEs to offer auto-completion for your own keys. See the[Appendix B, *Configuration Metadata*](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#configuration-metadata) appendix for details. |
+
+### 24.7.1 Third-party Configuration
+
+As well as using `@ConfigurationProperties` to annotate a class, you can also use it on public `@Bean` methods. Doing so can be particularly useful when you want to bind properties to third-party components that are outside of your control.
+
+To configure a bean from the `Environment` properties, add `@ConfigurationProperties` to its bean registration, as shown in the following example:
+
+```
+@ConfigurationProperties(prefix = "another")
+@Bean
+public AnotherComponent anotherComponent() {
+ ...
+}
+
+```
+
+Any property defined with the `another` prefix is mapped onto that `AnotherComponent` bean in manner similar to the preceding `AcmeProperties` example.
+
+### 24.7.2 Relaxed Binding
+
+Spring Boot uses some relaxed rules for binding `Environment` properties to `@ConfigurationProperties` beans, so there does not need to be an exact match between the `Environment` property name and the bean property name. Common examples where this is useful include dash-separated environment properties (for example, `context-path` binds to `contextPath`), and capitalized environment properties (for example, `PORT` binds to `port`).
+
+For example, consider the following `@ConfigurationProperties` class:
+
+```
+@ConfigurationProperties(prefix="acme.my-project.person")
+public class OwnerProperties {
+
+ private String firstName;
+
+ public String getFirstName() {
+ return this.firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+}
+
+```
+
+In the preceding example, the following properties names can all be used:
+
+
+
+**Table 24.1. relaxed binding**
+
+| Property | Note |
+| ----------------------------------- | ------------------------------------------------------------ |
+| `acme.my-project.person.firstName` | Standard camel case syntax. |
+| `acme.my-project.person.first-name` | Kebab case, which is recommended for use in `.properties` and `.yml` files. |
+| `acme.my-project.person.first_name` | Underscore notation, which is an alternative format for use in `.properties` and `.yml` files. |
+| `ACME_MYPROJECT_PERSON_FIRSTNAME` | Upper case format, which is recommended when using system environment variables. |
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| The `prefix` value for the annotation *must* be in kebab case (lowercase and separated by `-`, such as `acme.my-project.person`). |
+
+
+
+**Table 24.2. relaxed binding rules per property source**
+
+| Property Source | Simple | List |
+| --------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
+| Properties Files | Camel case, kebab case, or underscore notation | Standard list syntax using `[ ]` or comma-separated values |
+| YAML Files | Camel case, kebab case, or underscore notation | Standard YAML list syntax or comma-separated values |
+| Environment Variables | Upper case format with underscore as the delimiter. `_` should not be used within a property name | Numeric values surrounded by underscores, such as `MY_ACME_1_OTHER = my.acme[1].other` |
+| System properties | Camel case, kebab case, or underscore notation | Standard list syntax using `[ ]` or comma-separated values |
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| We recommend that, when possible, properties are stored in lower-case kebab format, such as `my.property-name=acme`. |
+
+### 24.7.3 Properties Conversion
+
+Spring Boot attempts to coerce the external application properties to the right type when it binds to the `@ConfigurationProperties` beans. If you need custom type conversion, you can provide a `ConversionService` bean (with a bean named `conversionService`) or custom property editors (through a `CustomEditorConfigurer` bean) or custom `Converters` (with bean definitions annotated as `@ConfigurationPropertiesBinding`).
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| As this bean is requested very early during the application lifecycle, make sure to limit the dependencies that your `ConversionService` is using. Typically, any dependency that you require may not be fully initialized at creation time. You may want to rename your custom `ConversionService` if it is not required for configuration keys coercion and only rely on custom converters qualified with `@ConfigurationPropertiesBinding`. |
+
+#### Converting durations
+
+Spring Boot has dedicated support for expressing durations. If you expose a `java.time.Duration` property, the following formats in application properties are available:
+
+- A regular `long` representation (using milliseconds as the default unit unless a `@DefaultUnit` has been specified)
+- The standard ISO-8601 format [used by `java.util.Duration`](https://docs.oracle.com/javase/8/docs/api//java/time/Duration.html#parse-java.lang.CharSequence-)
+- A more readable format where the value and the unit are coupled (e.g. `10s` means 10 seconds)
+
+Consider the following example:
+
+```
+@ConfigurationProperties("app.system")
+public class AppSystemProperties {
+
+ @DurationUnit(ChronoUnit.SECONDS)
+ private Duration sessionTimeout = Duration.ofSeconds(30);
+
+ private Duration readTimeout = Duration.ofMillis(1000);
+
+ public Duration getSessionTimeout() {
+ return this.sessionTimeout;
+ }
+
+ public void setSessionTimeout(Duration sessionTimeout) {
+ this.sessionTimeout = sessionTimeout;
+ }
+
+ public Duration getReadTimeout() {
+ return this.readTimeout;
+ }
+
+ public void setReadTimeout(Duration readTimeout) {
+ this.readTimeout = readTimeout;
+ }
+
+}
+
+```
+
+To specify a session timeout of 30 seconds, `30`, `PT30S` and `30s` are all equivalent. A read timeout of 500ms can be specified in any of the following form: `500`, `PT0.5S` and `500ms`.
+
+You can also use any of the supported unit. These are:
+
+- `ns` for nanoseconds
+- `ms` for milliseconds
+- `s` for seconds
+- `m` for minutes
+- `h` for hours
+- `d` for days
+
+The default unit is milliseconds and can be overridden using `@DefaultUnit` as illustrated in the sample above.
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| If you are upgrading from a previous version that is simply using `Long` to express the duration, make sure to define the unit (using `@DefaultUnit`) if it isn’t milliseconds alongside the switch to `Duration`. Doing so gives a transparent upgrade path while supporting a much richer format. |
+
+### 24.7.4 @ConfigurationProperties Validation
+
+Spring Boot attempts to validate `@ConfigurationProperties` classes whenever they are annotated with Spring’s `@Validated` annotation. You can use JSR-303 `javax.validation` constraint annotations directly on your configuration class. To do so, ensure that a compliant JSR-303 implementation is on your classpath and then add constraint annotations to your fields, as shown in the following example:
+
+```
+@ConfigurationProperties(prefix="acme")
+@Validated
+public class AcmeProperties {
+
+ @NotNull
+ private InetAddress remoteAddress;
+
+ // ... getters and setters
+
+}
+
+```
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| You can also trigger validation by annotating the `@Bean` method that creates the configuration properties with `@Validated`. |
+
+Although nested properties will also be validated when bound, it’s good practice to also annotate the associated field as `@Valid`. This ensure that validation is triggered even if no nested properties are found. The following example builds on the preceding `AcmeProperties` example:
+
+```
+@ConfigurationProperties(prefix="acme")
+@Validated
+public class AcmeProperties {
+
+ @NotNull
+ private InetAddress remoteAddress;
+
+ @Valid
+ private final Security security = new Security();
+
+ // ... getters and setters
+
+ public static class Security {
+
+ @NotEmpty
+ public String username;
+
+ // ... getters and setters
+
+ }
+
+}
+
+```
+
+You can also add a custom Spring `Validator` by creating a bean definition called `configurationPropertiesValidator`. The `@Bean` method should be declared `static`. The configuration properties validator is created very early in the application’s lifecycle, and declaring the `@Bean` method as static lets the bean be created without having to instantiate the `@Configuration` class. Doing so avoids any problems that may be caused by early instantiation. There is a [property validation sample](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-property-validation) that shows how to set things up.
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| The `spring-boot-actuator` module includes an endpoint that exposes all `@ConfigurationProperties` beans. Point your web browser to`/actuator/configprops` or use the equivalent JMX endpoint. See the "[Production ready features](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#production-ready-endpoints)" section for details. |
+
+### 24.7.5 @ConfigurationProperties vs. @Value
+
+The `@Value` annotation is a core container feature, and it does not provide the same features as type-safe configuration properties. The following table summarizes the features that are supported by `@ConfigurationProperties` and `@Value`:
+
+| Feature | `@ConfigurationProperties` | `@Value` |
+| ------------------------------------------------------------ | -------------------------- | -------- |
+| [Relaxed binding](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-relaxed-binding) | Yes | No |
+| [Meta-data support](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#configuration-metadata) | Yes | No |
+| `SpEL` evaluation | No | Yes |
+
+If you define a set of configuration keys for your own components, we recommend you group them in a POJO annotated with `@ConfigurationProperties`. You should also be aware that, since `@Value` does not support relaxed binding, it is not a good candidate if you need to provide the value by using environment variables.
+
+Finally, while you can write a `SpEL` expression in `@Value`, such expressions are not processed from [application property files](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-application-property-files).
+
+## 25. Profiles
+
+Spring Profiles provide a way to segregate parts of your application configuration and make it be available only in certain environments. Any `@Component` or `@Configuration` can be marked with `@Profile` to limit when it is loaded, as shown in the following example:
+
+```
+@Configuration
+@Profile("production")
+public class ProductionConfiguration {
+
+ // ...
+
+}
+
+```
+
+You can use a `spring.profiles.active` `Environment` property to specify which profiles are active. You can specify the property in any of the ways described earlier in this chapter. For example, you could include it in your `application.properties`, as shown in the following example:
+
+```
+spring.profiles.active=dev,hsqldb
+
+```
+
+You could also specify it on the command line by using the following switch: `--spring.profiles.active=dev,hsqldb`.
+
+## 25.1 Adding Active Profiles
+
+The `spring.profiles.active` property follows the same ordering rules as other properties: The highest `PropertySource` wins. This means that you can specify active profiles in `application.properties` and then **replace** them by using the command line switch.
+
+Sometimes, it is useful to have profile-specific properties that **add** to the active profiles rather than replace them. The `spring.profiles.include` property can be used to unconditionally add active profiles. The `SpringApplication` entry point also has a Java API for setting additional profiles (that is, on top of those activated by the `spring.profiles.active` property). See the `setAdditionalProfiles()` method in [SpringApplication](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/api/org/springframework/boot/SpringApplication.html).
+
+For example, when an application with the following properties is run by using the switch, `--spring.profiles.active=prod`, the `proddb` and `prodmq` profiles are also activated:
+
+```
+---
+my.property: fromyamlfile
+---
+spring.profiles: prod
+spring.profiles.include:
+ - proddb
+ - prodmq
+
+```
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| Remember that the `spring.profiles` property can be defined in a YAML document to determine when this particular document is included in the configuration. See [Section 74.7, “Change Configuration Depending on the Environment”](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#howto-change-configuration-depending-on-the-environment) for more details. |
+
+## 25.2 Programmatically Setting Profiles
+
+You can programmatically set active profiles by calling `SpringApplication.setAdditionalProfiles(…)` before your application runs. It is also possible to activate profiles by using Spring’s `ConfigurableEnvironment` interface.
+
+## 25.3 Profile-specific Configuration Files
+
+Profile-specific variants of both `application.properties` (or `application.yml`) and files referenced through `@ConfigurationProperties` are considered as files and loaded. See "[Section 24.4, “Profile-specific Properties”](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-profile-specific-properties)" for details.
+
+## 26. Logging
+
+Spring Boot uses [Commons Logging](https://commons.apache.org/logging) for all internal logging but leaves the underlying log implementation open. Default configurations are provided for [Java Util Logging](https://docs.oracle.com/javase/8/docs/api//java/util/logging/package-summary.html), [Log4J2](https://logging.apache.org/log4j/2.x/), and [Logback](http://logback.qos.ch/). In each case, loggers are pre-configured to use console output with optional file output also available.
+
+By default, if you use the “Starters”, Logback is used for logging. Appropriate Logback routing is also included to ensure that dependent libraries that use Java Util Logging, Commons Logging, Log4J, or SLF4J all work correctly.
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| There are a lot of logging frameworks available for Java. Do not worry if the above list seems confusing. Generally, you do not need to change your logging dependencies and the Spring Boot defaults work just fine. |
+
+## 26.1 Log Format
+
+The default log output from Spring Boot resembles the following example:
+
+```
+2014-03-05 10:57:51.112 INFO 45469 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/7.0.52
+2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
+2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1358 ms
+2014-03-05 10:57:51.698 INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
+2014-03-05 10:57:51.702 INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
+
+```
+
+The following items are output:
+
+- Date and Time: Millisecond precision and easily sortable.
+- Log Level: `ERROR`, `WARN`, `INFO`, `DEBUG`, or `TRACE`.
+- Process ID.
+- A `---` separator to distinguish the start of actual log messages.
+- Thread name: Enclosed in square brackets (may be truncated for console output).
+- Logger name: This is usually the source class name (often abbreviated).
+- The log message.
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| Logback does not have a `FATAL` level. It is mapped to `ERROR`. |
+
+## 26.2 Console Output
+
+The default log configuration echoes messages to the console as they are written. By default, `ERROR`-level, `WARN`-level, and `INFO`-level messages are logged. You can also enable a “debug” mode by starting your application with a `--debug` flag.
+
+```
+$ java -jar myapp.jar --debug
+
+```
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| You can also specify `debug=true` in your `application.properties`. |
+
+When the debug mode is enabled, a selection of core loggers (embedded container, Hibernate, and Spring Boot) are configured to output more information. Enabling the debug mode does *not* configure your application to log all messages with `DEBUG` level.
+
+Alternatively, you can enable a “trace” mode by starting your application with a `--trace` flag (or `trace=true` in your `application.properties`). Doing so enables trace logging for a selection of core loggers (embedded container, Hibernate schema generation, and the whole Spring portfolio).
+
+### 26.2.1 Color-coded Output
+
+If your terminal supports ANSI, color output is used to aid readability. You can set `spring.output.ansi.enabled` to a [supported value](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/api/org/springframework/boot/ansi/AnsiOutput.Enabled.html) to override the auto detection.
+
+Color coding is configured by using the `%clr` conversion word. In its simplest form, the converter colors the output according to the log level, as shown in the following example:
+
+```
+%clr(%5p)
+
+```
+
+The following table describes the mapping of log levels to colors:
+
+| Level | Color |
+| ------- | ------ |
+| `FATAL` | Red |
+| `ERROR` | Red |
+| `WARN` | Yellow |
+| `INFO` | Green |
+| `DEBUG` | Green |
+| `TRACE` | Green |
+
+Alternatively, you can specify the color or style that should be used by providing it as an option to the conversion. For example, to make the text yellow, use the following setting:
+
+```
+%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow}
+
+```
+
+The following colors and styles are supported:
+
+- `blue`
+- `cyan`
+- `faint`
+- `green`
+- `magenta`
+- `red`
+- `yellow`
+
+## 26.3 File Output
+
+By default, Spring Boot logs only to the console and does not write log files. If you want to write log files in addition to the console output, you need to set a`logging.file` or `logging.path` property (for example, in your `application.properties`).
+
+The following table shows how the `logging.*` properties can be used together:
+
+
+
+**Table 26.1. Logging properties**
+
+| `logging.file` | `logging.path` | Example | Description |
+| -------------- | ------------------ | ---------- | ------------------------------------------------------------ |
+| *(none)* | *(none)* | | Console only logging. |
+| Specific file | *(none)* | `my.log` | Writes to the specified log file. Names can be an exact location or relative to the current directory. |
+| *(none)* | Specific directory | `/var/log` | Writes `spring.log` to the specified directory. Names can be an exact location or relative to the current directory. |
+
+Log files rotate when they reach 10 MB and, as with console output, `ERROR`-level, `WARN`-level, and `INFO`-level messages are logged by default. Size limits can be changed using the `logging.file.max-size` property. Previously rotated files are archived indefinitely unless the `logging.file.max-history` property has been set.
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| The logging system is initialized early in the application lifecycle. Consequently, logging properties are not found in property files loaded through `@PropertySource` annotations. |
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| Logging properties are independent of the actual logging infrastructure. As a result, specific configuration keys (such as `logback.configurationFile`for Logback) are not managed by spring Boot. |
+
+## 26.4 Log Levels
+
+All the supported logging systems can have the logger levels set in the Spring `Environment` (for example, in `application.properties`) by using`logging.level.=` where `level` is one of TRACE, DEBUG, INFO, WARN, ERROR, FATAL, or OFF. The `root` logger can be configured by using `logging.level.root`.
+
+The following example shows potential logging settings in `application.properties`:
+
+```
+logging.level.root=WARN
+logging.level.org.springframework.web=DEBUG
+logging.level.org.hibernate=ERROR
+
+```
+
+## 26.5 Custom Log Configuration
+
+The various logging systems can be activated by including the appropriate libraries on the classpath and can be further customized by providing a suitable configuration file in the root of the classpath or in a location specified by the following Spring `Environment` property: `logging.config`.
+
+You can force Spring Boot to use a particular logging system by using the `org.springframework.boot.logging.LoggingSystem` system property. The value should be the fully qualified class name of a `LoggingSystem` implementation. You can also disable Spring Boot’s logging configuration entirely by using a value of `none`.
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| Since logging is initialized **before** the `ApplicationContext` is created, it is not possible to control logging from `@PropertySources` in Spring `@Configuration` files. System properties and the conventional Spring Boot external configuration files work fine.) |
+
+Depending on your logging system, the following files are loaded:
+
+| Logging System | Customization |
+| ----------------------- | ------------------------------------------------------------ |
+| Logback | `logback-spring.xml`, `logback-spring.groovy`, `logback.xml`, or `logback.groovy` |
+| Log4j2 | `log4j2-spring.xml` or `log4j2.xml` |
+| JDK (Java Util Logging) | `logging.properties` |
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| When possible, we recommend that you use the `-spring` variants for your logging configuration (for example, `logback-spring.xml` rather than `logback.xml`). If you use standard configuration locations, Spring cannot completely control log initialization. |
+
+| ![[Warning]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/warning.png) |
+| ------------------------------------------------------------ |
+| There are known classloading issues with Java Util Logging that cause problems when running from an 'executable jar'. We recommend that you avoid it when running from an 'executable jar' if at all possible. |
+
+To help with the customization, some other properties are transferred from the Spring `Environment` to System properties, as described in the following table:
+
+| Spring Environment | System Property | Comments |
+| ----------------------------------- | ------------------------------- | ------------------------------------------------------------ |
+| `logging.exception-conversion-word` | `LOG_EXCEPTION_CONVERSION_WORD` | The conversion word used when logging exceptions. |
+| `logging.file` | `LOG_FILE` | If defined, it is used in the default log configuration. |
+| `logging.file.max-size` | `LOG_FILE_MAX_SIZE` | Maximum log file size (if LOG_FILE enabled). (Only supported with the default Logback setup.) |
+| `logging.file.max-history` | `LOG_FILE_MAX_HISTORY` | Maximum number of archive log files to keep (if LOG_FILE enabled). (Only supported with the default Logback setup.) |
+| `logging.path` | `LOG_PATH` | If defined, it is used in the default log configuration. |
+| `logging.pattern.console` | `CONSOLE_LOG_PATTERN` | The log pattern to use on the console (stdout). (Only supported with the default Logback setup.) |
+| `logging.pattern.dateformat` | `LOG_DATEFORMAT_PATTERN` | Appender pattern for log date format. (Only supported with the default Logback setup.) |
+| `logging.pattern.file` | `FILE_LOG_PATTERN` | The log pattern to use in a file (if `LOG_FILE` is enabled). (Only supported with the default Logback setup.) |
+| `logging.pattern.level` | `LOG_LEVEL_PATTERN` | The format to use when rendering the log level (default `%5p`). (Only supported with the default Logback setup.) |
+| `PID` | `PID` | The current process ID (discovered if possible and when not already defined as an OS environment variable). |
+
+All the supported logging systems can consult System properties when parsing their configuration files. See the default configurations in `spring-boot.jar` for examples:
+
+- [Logback](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/logback/defaults.xml)
+- [Log4j 2](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/log4j2/log4j2.xml)
+- [Java Util logging](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot/src/main/resources/org/springframework/boot/logging/java/logging-file.properties)
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| If you want to use a placeholder in a logging property, you should use [Spring Boot’s syntax](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-placeholders-in-properties) and not the syntax of the underlying framework. Notably, if you use Logback, you should use `:` as the delimiter between a property name and its default value and not use `:-`. |
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| You can add MDC and other ad-hoc content to log lines by overriding only the `LOG_LEVEL_PATTERN` (or `logging.pattern.level` with Logback). For example, if you use `logging.pattern.level=user:%X{user} %5p`, then the default log format contains an MDC entry for "user", if it exists, as shown in the following example.`2015-09-30 12:30:04.031 user:someone INFO 22174 --- [ nio-8080-exec-0] demo.Controller Handling authenticated request` |
+
+## 26.6 Logback Extensions
+
+Spring Boot includes a number of extensions to Logback that can help with advanced configuration. You can use these extensions in your `logback-spring.xml`configuration file.
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| Because the standard `logback.xml` configuration file is loaded too early, you cannot use extensions in it. You need to either use `logback-spring.xml` or define a `logging.config` property. |
+
+| ![[Warning]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/warning.png) |
+| ------------------------------------------------------------ |
+| The extensions cannot be used with Logback’s [configuration scanning](http://logback.qos.ch/manual/configuration.html#autoScan). If you attempt to do so, making changes to the configuration file results in an error similar to one of the following being logged: |
+
+```
+ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProperty], current ElementPath is [[configuration][springProperty]]
+ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProfile], current ElementPath is [[configuration][springProfile]]
+
+```
+
+### 26.6.1 Profile-specific Configuration
+
+The `` tag lets you optionally include or exclude sections of configuration based on the active Spring profiles. Profile sections are supported anywhere within the `` element. Use the `name` attribute to specify which profile accepts the configuration. Multiple profiles can be specified with a comma-separated list. The following listing shows three sample profiles:
+
+```
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+### 26.6.2 Environment Properties
+
+The `` tag lets you expose properties from the Spring `Environment` for use within Logback. Doing so can be useful if you want to access values from your `application.properties` file in your Logback configuration. The tag works in a similar way to Logback’s standard `` tag. However, rather than specifying a direct `value`, you specify the `source` of the property (from the `Environment`). If you need to store the property somewhere other than in `local`scope, you can use the `scope` attribute. If you need a fallback value (in case the property is not set in the `Environment`), you can use the `defaultValue` attribute. The following example shows how to expose properties for use within Logback:
+
+```
+
+
+ ${fluentHost}
+ ...
+
+
+```
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| The `source` must be specified in kebab case (such as `my.property-name`). However, properties can be added to the `Environment` by using the relaxed rules. |
+
+## 27. Developing Web Applications
+
+Spring Boot is well suited for web application development. You can create a self-contained HTTP server by using embedded Tomcat, Jetty, Undertow, or Netty. Most web applications use the `spring-boot-starter-web` module to get up and running quickly. You can also choose to build reactive web applications by using the`spring-boot-starter-webflux` module.
+
+If you have not yet developed a Spring Boot web application, you can follow the "Hello World!" example in the *Getting started* section.
+
+## 27.1 The “Spring Web MVC Framework”
+
+The [Spring Web MVC framework](https://docs.spring.io/spring/docs/5.0.4.RELEASE/spring-framework-reference/web.html#mvc) (often referred to as simply “Spring MVC”) is a rich “model view controller” web framework. Spring MVC lets you create special `@Controller` or `@RestController` beans to handle incoming HTTP requests. Methods in your controller are mapped to HTTP by using `@RequestMapping`annotations.
+
+The following code shows a typical `@RestController` that serves JSON data:
+
+```
+@RestController
+@RequestMapping(value="/users")
+public class MyRestController {
+
+ @RequestMapping(value="/{user}", method=RequestMethod.GET)
+ public User getUser(@PathVariable Long user) {
+ // ...
+ }
+
+ @RequestMapping(value="/{user}/customers", method=RequestMethod.GET)
+ List getUserCustomers(@PathVariable Long user) {
+ // ...
+ }
+
+ @RequestMapping(value="/{user}", method=RequestMethod.DELETE)
+ public User deleteUser(@PathVariable Long user) {
+ // ...
+ }
+
+}
+
+```
+
+Spring MVC is part of the core Spring Framework, and detailed information is available in the [reference documentation](https://docs.spring.io/spring/docs/5.0.4.RELEASE/spring-framework-reference/web.html#mvc). There are also several guides that cover Spring MVC available at [spring.io/guides](https://spring.io/guides).
+
+### 27.1.1 Spring MVC Auto-configuration
+
+Spring Boot provides auto-configuration for Spring MVC that works well with most applications.
+
+The auto-configuration adds the following features on top of Spring’s defaults:
+
+- Inclusion of `ContentNegotiatingViewResolver` and `BeanNameViewResolver` beans.
+- Support for serving static resources, including support for WebJars (covered [later in this document](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-static-content))).
+- Automatic registration of `Converter`, `GenericConverter`, and `Formatter` beans.
+- Support for `HttpMessageConverters` (covered [later in this document](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-message-converters)).
+- Automatic registration of `MessageCodesResolver` (covered [later in this document](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-message-codes)).
+- Static `index.html` support.
+- Custom `Favicon` support (covered [later in this document](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-favicon)).
+- Automatic use of a `ConfigurableWebBindingInitializer` bean (covered [later in this document](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-spring-mvc-web-binding-initializer)).
+
+If you want to keep Spring Boot MVC features and you want to add additional [MVC configuration](https://docs.spring.io/spring/docs/5.0.4.RELEASE/spring-framework-reference/web.html#mvc) (interceptors, formatters, view controllers, and other features), you can add your own `@Configuration` class of type `WebMvcConfigurer` but **without** `@EnableWebMvc`. If you wish to provide custom instances of `RequestMappingHandlerMapping`, `RequestMappingHandlerAdapter`, or `ExceptionHandlerExceptionResolver`, you can declare a `WebMvcRegistrationsAdapter` instance to provide such components.
+
+If you want to take complete control of Spring MVC, you can add your own `@Configuration` annotated with `@EnableWebMvc`.
+
+### 27.1.2 HttpMessageConverters
+
+Spring MVC uses the `HttpMessageConverter` interface to convert HTTP requests and responses. Sensible defaults are included out of the box. For example, objects can be automatically converted to JSON (by using the Jackson library) or XML (by using the Jackson XML extension, if available, or by using JAXB if the Jackson XML extension is not available). By default, strings are encoded in `UTF-8`.
+
+If you need to add or customize converters, you can use Spring Boot’s `HttpMessageConverters` class, as shown in the following listing:
+
+```
+import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
+import org.springframework.context.annotation.*;
+import org.springframework.http.converter.*;
+
+@Configuration
+public class MyConfiguration {
+
+ @Bean
+ public HttpMessageConverters customConverters() {
+ HttpMessageConverter> additional = ...
+ HttpMessageConverter> another = ...
+ return new HttpMessageConverters(additional, another);
+ }
+
+}
+
+```
+
+Any `HttpMessageConverter` bean that is present in the context is added to the list of converters. You can also override default converters in the same way.
+
+### 27.1.3 Custom JSON Serializers and Deserializers
+
+If you use Jackson to serialize and deserialize JSON data, you might want to write your own `JsonSerializer` and `JsonDeserializer` classes. Custom serializers are usually [registered with Jackson through a module](http://wiki.fasterxml.com/JacksonHowToCustomDeserializers), but Spring Boot provides an alternative `@JsonComponent` annotation that makes it easier to directly register Spring Beans.
+
+You can use the `@JsonComponent` annotation directly on `JsonSerializer` or `JsonDeserializer` implementations. You can also use it on classes that contain serializers/deserializers as inner classes, as shown in the following example:
+
+```
+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 {
+ // ...
+ }
+
+ public static class Deserializer extends JsonDeserializer {
+ // ...
+ }
+
+}
+
+```
+
+All `@JsonComponent` beans in the `ApplicationContext` are automatically registered with Jackson. Because `@JsonComponent` is meta-annotated with `@Component`, the usual component-scanning rules apply.
+
+Spring Boot also provides [`JsonObjectSerializer`](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jackson/JsonObjectSerializer.java) and [`JsonObjectDeserializer`](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jackson/JsonObjectDeserializer.java) base classes that provide useful alternatives to the standard Jackson versions when serializing objects. See [`JsonObjectSerializer`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/api/org/springframework/boot/jackson/JsonObjectSerializer.html) and [`JsonObjectDeserializer`](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/api/org/springframework/boot/jackson/JsonObjectDeserializer.html) in the Javadoc for details.
+
+### 27.1.4 MessageCodesResolver
+
+Spring MVC has a strategy for generating error codes for rendering error messages from binding errors: `MessageCodesResolver`. If you set the`spring.mvc.message-codes-resolver.format` property `PREFIX_ERROR_CODE` or `POSTFIX_ERROR_CODE`, Spring Boot creates one for you (see the enumeration in [`DefaultMessageCodesResolver.Format`](https://docs.spring.io/spring/docs/5.0.4.RELEASE/javadoc-api/org/springframework/validation/DefaultMessageCodesResolver.Format.html)).
+
+### 27.1.5 Static Content
+
+By default, Spring Boot serves static content from a directory called `/static` (or `/public` or `/resources` or `/META-INF/resources`) in the classpath or from the root of the `ServletContext`. It uses the `ResourceHttpRequestHandler` from Spring MVC so that you can modify that behavior by adding your own `WebMvcConfigurer` and overriding the `addResourceHandlers` method.
+
+In a stand-alone web application, the default servlet from the container is also enabled and acts as a fallback, serving content from the root of the `ServletContext` if Spring decides not to handle it. Most of the time, this does not happen (unless you modify the default MVC configuration), because Spring can always handle requests through the `DispatcherServlet`.
+
+By default, resources are mapped on `/**`, but you can tune that with the `spring.mvc.static-path-pattern` property. For instance, relocating all resources to`/resources/**` can be achieved as follows:
+
+```
+spring.mvc.static-path-pattern=/resources/**
+
+```
+
+You can also customize the static resource locations by using the `spring.resources.static-locations` property (replacing the default values with a list of directory locations). The root Servlet context path, `"/"`, is automatically added as a location as well.
+
+In addition to the “standard” static resource locations mentioned earlier, a special case is made for [Webjars content](http://www.webjars.org/). Any resources with a path in `/webjars/**` are served from jar files if they are packaged in the Webjars format.
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| Do not use the `src/main/webapp` directory if your application is packaged as a jar. Although this directory is a common standard, it works **only** with war packaging, and it is silently ignored by most build tools if you generate a jar. |
+
+Spring Boot also supports the advanced resource handling features provided by Spring MVC, allowing use cases such as cache-busting static resources or using version agnostic URLs for Webjars.
+
+To use version agnostic URLs for Webjars, add the `webjars-locator-core` dependency. Then declare your Webjar. Using jQuery as an example, adding`"/webjars/jquery/dist/jquery.min.js"` results in `"/webjars/jquery/x.y.z/dist/jquery.min.js"`. where `x.y.z` is the Webjar version.
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| If you use JBoss, you need to declare the `webjars-locator-jboss-vfs` dependency instead of the `webjars-locator-core`. Otherwise, all Webjars resolve as a `404`. |
+
+To use cache busting, the following configuration configures a cache busting solution for all static resources, effectively adding a content hash, such as``, in URLs:
+
+```
+spring.resources.chain.strategy.content.enabled=true
+spring.resources.chain.strategy.content.paths=/**
+
+```
+
+| ![[Note]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/note.png) |
+| ------------------------------------------------------------ |
+| Links to resources are rewritten in templates at runtime, thanks to a `ResourceUrlEncodingFilter` that is auto-configured for Thymeleaf and FreeMarker. You should manually declare this filter when using JSPs. Other template engines are currently not automatically supported but can be with custom template macros/helpers and the use of the [`ResourceUrlProvider`](https://docs.spring.io/spring/docs/5.0.4.RELEASE/javadoc-api/org/springframework/web/servlet/resource/ResourceUrlProvider.html). |
+
+When loading resources dynamically with, for example, a JavaScript module loader, renaming files is not an option. That is why other strategies are also supported and can be combined. A "fixed" strategy adds a static version string in the URL without changing the file name, as shown in the following example:
+
+```
+spring.resources.chain.strategy.content.enabled=true
+spring.resources.chain.strategy.content.paths=/**
+spring.resources.chain.strategy.fixed.enabled=true
+spring.resources.chain.strategy.fixed.paths=/js/lib/
+spring.resources.chain.strategy.fixed.version=v12
+
+```
+
+With this configuration, JavaScript modules located under `"/js/lib/"` use a fixed versioning strategy (`"/v12/js/lib/mymodule.js"`), while other resources still use the content one (``).
+
+See [`ResourceProperties`](https://github.com/spring-projects/spring-boot/tree/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ResourceProperties.java) for more supported options.
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| This feature has been thoroughly described in a dedicated [blog post](https://spring.io/blog/2014/07/24/spring-framework-4-1-handling-static-web-resources) and in Spring Framework’s [reference documentation](https://docs.spring.io/spring/docs/5.0.4.RELEASE/spring-framework-reference/web.html#mvc-config-static-resources). |
+
+### 27.1.6 Welcome Page
+
+Spring Boot supports both static and templated welcome pages. It first looks for an `index.html` file in the configured static content locations. If one is not found, it then looks for an `index` template. If either is found, it is automatically used as the welcome page of the application.
+
+### 27.1.7 Custom Favicon
+
+Spring Boot looks for a `favicon.ico` in the configured static content locations and the root of the classpath (in that order). If such a file is present, it is automatically used as the favicon of the application.
+
+### 27.1.8 Path Matching and Content Negotiation
+
+Spring MVC can map incoming HTTP requests to handlers by looking at the request path and matching it to the mappings defined in your application (for example, `@GetMapping` annotations on Controller methods).
+
+Spring Boot chooses to disable suffix pattern matching by default, which means that requests like `"GET /projects/spring-boot.json"` won’t be matched to`@GetMapping("/projects/spring-boot")` mappings. This is considered as a [best practice for Spring MVC applications](https://docs.spring.io/spring/docs/5.0.4.RELEASE/spring-framework-reference/web.html#mvc-ann-requestmapping-suffix-pattern-match). This feature was mainly useful in the past for HTTP clients which did not send proper "Accept" request headers; we needed to make sure to send the correct Content Type to the client. Nowadays, Content Negotiation is much more reliable.
+
+There are other ways to deal with HTTP clients that don’t consistently send proper "Accept" request headers. Instead of using suffix matching, we can use a query parameter to ensure that requests like `"GET /projects/spring-boot?format=json"` will be mapped to `@GetMapping("/projects/spring-boot")`:
+
+```
+spring.mvc.contentnegotiation.favor-parameter=true
+
+# We can change the parameter name, which is "format" by default:
+# spring.mvc.contentnegotiation.parameter-name=myparam
+
+# We can also register additional file extensions/media types with:
+spring.mvc.contentnegotiation.media-types.markdown=text/markdown
+
+```
+
+If you understand the caveats and would still like your application to use suffix pattern matching, the following configuration is required:
+
+```
+spring.mvc.contentnegotiation.favor-path-extension=true
+
+# You can also restrict that feature to known extensions only
+# spring.mvc.pathmatch.use-registered-suffix-pattern=true
+
+# We can also register additional file extensions/media types with:
+# spring.mvc.contentnegotiation.media-types.adoc=text/asciidoc
+
+```
+
+### 27.1.9 ConfigurableWebBindingInitializer
+
+Spring MVC uses a `WebBindingInitializer` to initialize a `WebDataBinder` for a particular request. If you create your own `ConfigurableWebBindingInitializer` `@Bean`, Spring Boot automatically configures Spring MVC to use it.
+
+### 27.1.10 Template Engines
+
+As well as REST web services, you can also use Spring MVC to serve dynamic HTML content. Spring MVC supports a variety of templating technologies, including Thymeleaf, FreeMarker, and JSPs. Also, many other templating engines include their own Spring MVC integrations.
+
+Spring Boot includes auto-configuration support for the following templating engines:
+
+- [FreeMarker](https://freemarker.org/docs/)
+- [Groovy](http://docs.groovy-lang.org/docs/next/html/documentation/template-engines.html#_the_markuptemplateengine)
+- [Thymeleaf](http://www.thymeleaf.org/)
+- [Mustache](https://mustache.github.io/)
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| If possible, JSPs should be avoided. There are several [known limitations](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-jsp-limitations) when using them with embedded servlet containers. |
+
+When you use one of these templating engines with the default configuration, your templates are picked up automatically from `src/main/resources/templates`.
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| Depending on how you run your application, IntelliJ IDEA orders the classpath differently. Running your application in the IDE from its main method results in a different ordering than when you run your application by using Maven or Gradle or from its packaged jar. This can cause Spring Boot to fail to find the templates on the classpath. If you have this problem, you can reorder the classpath in the IDE to place the module’s classes and resources first. Alternatively, you can configure the template prefix to search every `templates` directory on the classpath, as follows: `classpath*:/templates/`. |
+
+### 27.1.11 Error Handling
+
+By default, Spring Boot provides an `/error` mapping that handles all errors in a sensible way, and it is registered as a “global” error page in the servlet container. For machine clients, it produces a JSON response with details of the error, the HTTP status, and the exception message. For browser clients, there is a “whitelabel” error view that renders the same data in HTML format (to customize it, add a `View` that resolves to `error`). To replace the default behavior completely, you can implement`ErrorController` and register a bean definition of that type or add a bean of type `ErrorAttributes` to use the existing mechanism but replace the contents.
+
+| ![[Tip]](https://docs.spring.io/spring-boot/docs/2.0.0.BUILD-SNAPSHOT/reference/htmlsingle/images/tip.png) |
+| ------------------------------------------------------------ |
+| The `BasicErrorController` can be used as a base class for a custom `ErrorController`. This is particularly useful if you want to add a handler for a new content type (the default is to handle `text/html` specifically and provide a fallback for everything else). To do so, extend `BasicErrorController`, add a public method with a `@RequestMapping` that has a `produces` attribute, and create a bean of your new type. |
+
+You can also define a class annotated with `@ControllerAdvice` to customize the JSON document to return for a particular controller and/or exception type, as shown in the following example:
+
+```
+@ControllerAdvice(basePackageClasses = AcmeController.class)
+public class AcmeControllerAdvice extends ResponseEntityExceptionHandler {
+
+ @ExceptionHandler(YourException.class)
+ @ResponseBody
+ ResponseEntity> handleControllerException(HttpServletRequest request, Throwable ex) {
+ HttpStatus status = getStatus(request);
+ return new ResponseEntity<>(new CustomErrorType(status.value(), ex.getMessage()), status);
+ }
+
+ private HttpStatus getStatus(HttpServletRequest request) {
+ Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
+ if (statusCode == null) {
+ return HttpStatus.INTERNAL_SERVER_ERROR;
+ }
+ return HttpStatus.valueOf(statusCode);
+ }
+
+}
+
+```
+
+In the preceding example, if `YourException` is thrown by a controller defined in the same package as `AcmeController`, a JSON representation of the `CustomErrorType` POJO is used instead of the `ErrorAttributes` representation.
+
+#### Custom Error Pages
+
+If you want to display a custom HTML error page for a given status code, you can add a file to an `/error` folder. Error pages can either be static HTML (that is, added under any of the static resource folders) or be built by using templates. The name of the file should be the exact status code or a series mask.
+
+For example, to map `404` to a static HTML file, your folder structure would be as follows:
+
+```
+src/
+ +- main/
+ +- java/
+ | +