添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
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 print or electronically.


Table of Contents

I. Spring Boot Documentation
1. About the Documentation
2. Getting Help
3. First Steps
4. Working with Spring Boot
5. Learning about Spring Boot Features
6. Moving to Production
7. Advanced Topics
II. Getting Started
8. Introducing Spring Boot
9. System Requirements
9.1. Servlet Containers
10. Installing Spring Boot
10.1. Installation Instructions for the Java Developer
10.1.1. Maven Installation
10.1.2. Gradle Installation
10.2. Installing the Spring Boot CLI
10.2.1. Manual Installation
10.2.2. Installation with SDKMAN!
10.2.3. OSX Homebrew Installation
10.2.4. MacPorts Installation
10.2.5. Command-line Completion
10.2.6. Quick-start Spring CLI Example
10.3. Upgrading from an Earlier Version of Spring Boot
11. Developing Your First Spring Boot Application
11.1. Creating the POM
11.2. Adding Classpath Dependencies
11.3. Writing the Code
11.3.1. The @RestController and @RequestMapping Annotations
11.3.2. The @EnableAutoConfiguration Annotation
11.3.3. The “main” Method
11.4. Running the Example
11.5. Creating an Executable Jar
12. What to Read Next
III. Using Spring Boot
13. Build Systems
13.1. Dependency Management
13.2. Maven
13.2.1. Inheriting the Starter Parent
13.2.2. Using Spring Boot without the Parent POM
13.2.3. Using the Spring Boot Maven Plugin
13.3. Gradle
13.4. Ant
13.5. Starters
14. Structuring Your Code
14.1. Using the “default” Package
14.2. Locating the Main Application Class
15. Configuration Classes
15.1. Importing Additional Configuration Classes
15.2. Importing XML Configuration
16. Auto-configuration
16.1. Gradually Replacing Auto-configuration
16.2. Disabling Specific Auto-configuration Classes
17. Spring Beans and Dependency Injection
18. Using the @SpringBootApplication Annotation
19. Running Your Application
19.1. Running from an IDE
19.2. Running as a Packaged Application
19.3. Using the Maven Plugin
19.4. Using the Gradle Plugin
19.5. Hot Swapping
20. Developer Tools
20.1. Property Defaults
20.2. Automatic Restart
20.2.1. Logging changes in condition evaluation
20.2.2. Excluding Resources
20.2.3. Watching Additional Paths
20.2.4. Disabling Restart
20.2.5. Using a Trigger File
20.2.6. Customizing the Restart Classloader
20.2.7. Known Limitations
20.3. LiveReload
20.4. Global Settings
20.5. Remote Applications
20.5.1. Running the Remote Client Application
20.5.2. Remote Update
21. Packaging Your Application for Production
22. What to Read Next
IV. Spring Boot features
23. SpringApplication
23.1. Startup Failure
23.2. Customizing the Banner
23.3. Customizing SpringApplication
23.4. Fluent Builder API
23.5. Application Events and Listeners
23.6. Web Environment
23.7. Accessing Application Arguments
23.8. Using the ApplicationRunner or CommandLineRunner
23.9. Application Exit
23.10. Admin Features
24. Externalized Configuration
24.1. Configuring Random Values
24.2. Accessing Command Line Properties
24.3. Application Property Files
24.4. Profile-specific Properties
24.5. Placeholders in Properties
24.6. Using YAML Instead of Properties
24.6.1. Loading YAML
24.6.2. Exposing YAML as Properties in the Spring Environment
24.6.3. Multi-profile YAML Documents
24.6.4. YAML Shortcomings
24.6.5. Merging YAML Lists
24.7. Type-safe Configuration Properties
24.7.1. Third-party Configuration
24.7.2. Relaxed Binding
24.7.3. Properties Conversion
24.7.4. @ConfigurationProperties Validation
24.7.5. @ConfigurationProperties vs. @Value
25. Profiles
25.1. Adding Active Profiles
25.2. Programmatically Setting Profiles
25.3. Profile-specific Configuration Files
26. Logging
26.1. Log Format
26.2. Console Output
26.2.1. Color-coded Output
26.3. File Output
26.4. Log Levels
26.5. Custom Log Configuration
26.6. Logback Extensions
26.6.1. Profile-specific Configuration
26.6.2. Environment Properties
27. Developing Web Applications
27.1. The ‘Spring Web MVC Framework’
27.1.1. Spring MVC Auto-configuration
27.1.2. HttpMessageConverters
27.1.3. Custom JSON Serializers and Deserializers
27.1.4. MessageCodesResolver
27.1.5. Static Content
27.1.6. Welcome Page
27.1.7. Custom Favicon
27.1.8. ConfigurableWebBindingInitializer
27.1.9. Template Engines
27.1.10. Error Handling
Custom Error Pages
Mapping Error Pages outside of Spring MVC
Error Handling on WebSphere Application Server
27.1.11. Spring HATEOAS
27.1.12. CORS Support
27.2. The ‘Spring WebFlux Framework’
27.2.1. Spring WebFlux Auto-configuration
27.2.2. HTTP Codecs with HttpMessageReaders and HttpMessageWriters
27.2.3. Static Content
27.2.4. Template Engines
27.2.5. Error Handling
Custom Error Pages
27.3. JAX-RS and Jersey
27.4. Embedded Servlet Container Support
27.4.1. Servlets, Filters, and listeners
Registering Servlets, Filters, and Listeners as Spring Beans
27.4.2. Servlet Context Initialization
Scanning for Servlets, Filters, and listeners
27.4.3. The ServletWebServerApplicationContext
27.4.4. Customizing Embedded Servlet Containers
Programmatic Customization
Customizing ConfigurableServletWebServerFactory Directly
27.4.5. JSP Limitations
28. Security
28.1. OAuth2
28.1.1. Client
28.2. Actuator Security
29. Working with SQL Databases
29.1. Configure a DataSource
29.1.1. Embedded Database Support
29.1.2. Connection to a Production Database
29.1.3. Connection to a JNDI DataSource
29.2. Using JdbcTemplate
29.3. JPA and ‘Spring Data’
29.3.1. Entity Classes
29.3.2. Spring Data JPA Repositories
29.3.3. Creating and Dropping JPA Databases
29.3.4. Open EntityManager in View
29.4. Using H2’s Web Console
29.4.1. Changing the H2 Console’s Path
29.5. Using jOOQ
29.5.1. Code Generation
29.5.2. Using DSLContext
29.5.3. jOOQ SQL Dialect
29.5.4. Customizing jOOQ
30. Working with NoSQL Technologies
30.1. Redis
30.1.1. Connecting to Redis
30.2. MongoDB
30.2.1. Connecting to a MongoDB Database
30.2.2. MongoTemplate
30.2.3. Spring Data MongoDB Repositories
30.2.4. Embedded Mongo
30.3. Neo4j
30.3.1. Connecting to a Neo4j Database
30.3.2. Using the Embedded Mode
30.3.3. Neo4jSession
30.3.4. Spring Data Neo4j Repositories
30.3.5. Repository Example
30.4. Gemfire
30.5. Solr
30.5.1. Connecting to Solr
30.5.2. Spring Data Solr Repositories
30.6. Elasticsearch
30.6.1. Connecting to Elasticsearch by Using Jest
30.6.2. Connecting to Elasticsearch by Using Spring Data
30.6.3. Spring Data Elasticsearch Repositories
30.7. Cassandra
30.7.1. Connecting to Cassandra
30.7.2. Spring Data Cassandra Repositories
30.8. Couchbase
30.8.1. Connecting to Couchbase
30.8.2. Spring Data Couchbase Repositories
30.9. LDAP
30.9.1. Connecting to an LDAP Server
30.9.2. Spring Data LDAP Repositories
30.9.3. Embedded In-memory LDAP Server
30.10. InfluxDB
30.10.1. Connecting to InfluxDB
31. Caching
31.1. Supported Cache Providers
31.1.1. Generic
31.1.2. JCache (JSR-107)
31.1.3. EhCache 2.x
31.1.4. Hazelcast
31.1.5. Infinispan
31.1.6. Couchbase
31.1.7. Redis
31.1.8. Caffeine
31.1.9. Simple
31.1.10. None
32. Messaging
32.1. JMS
32.1.1. ActiveMQ Support
32.1.2. Artemis Support
32.1.3. Using a JNDI ConnectionFactory
32.1.4. Sending a Message
32.1.5. Receiving a Message
32.2. AMQP
32.2.1. RabbitMQ support
32.2.2. Sending a Message
32.2.3. Receiving a Message
32.3. Apache Kafka Support
32.3.1. Sending a Message
32.3.2. Receiving a Message
32.3.3. Additional Kafka Properties
33. Calling REST Services with ‘RestTemplate’
33.1. RestTemplate Customization
34. Calling REST Services with ‘WebClient’
34.1. WebClient Customization
35. Validation
36. Sending Email
37. Distributed Transactions with JTA
37.1. Using an Atomikos Transaction Manager
37.2. Using a Bitronix Transaction Manager
37.3. Using a Narayana Transaction Manager
37.4. Using a Java EE Managed Transaction Manager
37.5. Mixing XA and Non-XA JMS Connections
37.6. Supporting an Alternative Embedded Transaction Manager
38. Hazelcast
39. Quartz Scheduler
40. Spring Integration
41. Spring Session
42. Monitoring and Management over JMX
43. Testing
43.1. Test Scope Dependencies
43.2. Testing Spring Applications
43.3. Testing Spring Boot Applications
43.3.1. Detecting Test Configuration
43.3.2. Excluding Test Configuration
43.3.3. Working with Random Ports
43.3.4. Mocking and Spying Beans
43.3.5. Auto-configured Tests
43.3.6. Auto-configured JSON Tests
43.3.7. Auto-configured Spring MVC Tests
43.3.8. Auto-configured Spring WebFlux Tests
43.3.9. Auto-configured Data JPA Tests
43.3.10. Auto-configured JDBC Tests
43.3.11. Auto-configured jOOQ Tests
43.3.12. Auto-configured Data MongoDB Tests
43.3.13. Auto-configured Data Neo4j Tests
43.3.14. Auto-configured Data Redis Tests
43.3.15. Auto-configured Data LDAP Tests
43.3.16. Auto-configured REST Clients
43.3.17. Auto-configured Spring REST Docs Tests
Auto-configured Spring REST Docs Tests with Mock MVC
Auto-configured Spring REST Docs Tests with REST Assured
43.3.18. User Configuration and Slicing
43.3.19. Using Spock to Test Spring Boot Applications
43.4. Test Utilities
43.4.1. ConfigFileApplicationContextInitializer
43.4.2. EnvironmentTestUtils
43.4.3. OutputCapture
43.4.4. TestRestTemplate
44. WebSockets
45. Web Services
46. Creating Your Own Auto-configuration
46.1. Understanding Auto-configured Beans
46.2. Locating Auto-configuration Candidates
46.3. Condition Annotations
46.3.1. Class Conditions
46.3.2. Bean Conditions
46.3.3. Property Conditions
46.3.4. Resource Conditions
46.3.5. Web Application Conditions
46.3.6. SpEL Expression Conditions
46.4. Creating Your Own Starter
46.4.1. Naming
46.4.2. autoconfigure Module
46.4.3. Starter Module
47. What to Read Next
V. Spring Boot Actuator: Production-ready features
48. Enabling Production-ready Features
49. Endpoints
49.1. Exposing Endpoints
49.2. Securing HTTP Endpoints
49.3. Customizing Endpoints
49.4. Hypermedia for Actuator Web Endpoints
49.5. Actuator Web Endpoint Paths
49.6. CORS Support
49.7. Adding Custom Endpoints
49.8. Health Information
49.8.1. Auto-configured HealthIndicators
49.8.2. Writing Custom HealthIndicators
49.8.3. Reactive Health Indicators
49.8.4. Auto-configured ReactiveHealthIndicators
49.9. Application Information
49.9.1. Auto-configured InfoContributors
49.9.2. Custom Application Information
49.9.3. Git Commit Information
49.9.4. Build Information
49.9.5. Writing Custom InfoContributors
50. Monitoring and Management over HTTP
50.1. Customizing the Management Endpoint Paths
50.2. Customizing the Management Server Port
50.3. Configuring Management-specific SSL
50.4. Customizing the Management Server Address
50.5. Disabling HTTP Endpoints
51. Monitoring and Management over JMX
51.1. Customizing MBean Names
51.2. Disabling JMX Endpoints
51.3. Using Jolokia for JMX over HTTP
51.3.1. Customizing Jolokia
51.3.2. Disabling Jolokia
52. Loggers
52.1. Configure a Logger
53. Metrics
53.1. Spring MVC Metrics
53.1.1. Spring MVC Metric Tags
53.2. WebFlux Metrics
53.2.1. WebFlux Metric Tags
53.3. RestTemplate Metrics
53.3.1. RestTemplate Metric Tags
53.4. DataSource metrics
53.5. Spring Integration Metrics
54. Auditing
55. Tracing
55.1. Custom tracing
56. Process Monitoring
56.1. Extend Configuration
56.2. Programmatically
57. Cloud Foundry Support
57.1. Disabling Extended Cloud Foundry Actuator Support
57.2. Cloud Foundry Self-signed Certificates
57.3. Custom Security Configuration
58. What to Read Next
VI. Deploying Spring Boot Applications
59. Deploying to the Cloud
59.1. Cloud Foundry
59.1.1. Binding to Services
59.2. Heroku
59.3. OpenShift
59.4. Amazon Web Services (AWS)
59.4.1. AWS Elastic Beanstalk
Using the Tomcat Platform
Using the Java SE Platform
59.4.2. Summary
59.5. Boxfuse and Amazon Web Services
59.6. Google Cloud
60. Installing Spring Boot Applications
60.1. Supported Operating Systems
60.2. Unix/Linux Services
60.2.1. Installation as an init.d Service (System V)
Securing an init.d Service
60.2.2. Installation as a systemd Service
60.2.3. Customizing the Startup Script
Customizing the Start Script when It Is Written
Customizing a Script When It Runs
60.3. Microsoft Windows Services
61. What to Read Next
VII. Spring Boot CLI
62. Installing the CLI
63. Using the CLI
63.1. Running Applications with the CLI
63.1.1. Deduced “grab” Dependencies
63.1.2. Deduced “grab” Coordinates
63.1.3. Default Import Statements
63.1.4. Automatic Main Method
63.1.5. Custom Dependency Management
63.2. Applications with Multiple Source Files
63.3. Packaging Your Application
63.4. Initialize a New Project
63.5. Using the Embedded Shell
63.6. Adding Extensions to the CLI
64. Developing Applications with the Groovy Beans DSL
65. Configuring the CLI with settings.xml
66. What to Read Next
VIII. Build tool plugins
67. Spring Boot Maven Plugin
67.1. Including the Plugin
67.2. Packaging Executable Jar and War Files
68. Spring Boot Gradle Plugin
69. Spring Boot AntLib Module
69.1. Spring Boot Ant Tasks
69.1.1. spring-boot:exejar
69.1.2. Examples
69.2. spring-boot:findmainclass
69.2.1. Examples
70. Supporting Other Build Systems
70.1. Repackaging Archives
70.2. Nested Libraries
70.3. Finding a Main Class
70.4. Example Repackage Implementation
71. What to Read Next
IX. ‘How-to’ guides
72. Spring Boot Application
72.1. Create Your Own FailureAnalyzer
72.2. Troubleshoot Auto-configuration
72.3. Customize the Environment or ApplicationContext Before It Starts
72.4. Build an ApplicationContext Hierarchy (Adding a Parent or Root Context)
72.5. Create a Non-web Application
73. Properties and Configuration
73.1. Automatically Expand Properties at Build Time
73.1.1. Automatic Property Expansion Using Maven
73.1.2. Automatic Property Expansion Using Gradle
73.2. Externalize the Configuration of SpringApplication
73.3. Change the Location of External Properties of an Application
73.4. Use ‘Short’ Command Line Arguments
73.5. Use YAML for External Properties
73.6. Set the Active Spring Profiles
73.7. Change Configuration Depending on the Environment
73.8. Discover Built-in Options for External Properties
74. Embedded Web Servers
74.1. Use Another Web Server
74.2. Configure Jetty
74.3. Add a Servlet, Filter, or Listener to an Application
74.3.1. Add a Servlet, Filter, or Listener by Using a Spring Bean
Disable Registration of a Servlet or Filter
74.3.2. Add Servlets, Filters, and Listeners by Using Classpath Scanning
74.4. Change the HTTP Port
74.5. Use a Random Unassigned HTTP Port
74.6. Discover the HTTP Port at Runtime
74.7. Configure SSL
74.8. Configure HTTP/2
74.8.1. HTTP/2 with Undertow
74.8.2. HTTP/2 with Tomcat
74.9. Configure Access Logging
74.10. Running Behind a Front-end Proxy Server
74.10.1. Customize Tomcat’s Proxy Configuration
74.11. Configure Tomcat
74.12. Enable Multiple Connectors with Tomcat
74.13. Use Tomcat’s LegacyCookieProcessor
74.14. Configure Undertow
74.15. Enable Multiple Listeners with Undertow
74.16. Create WebSocket Endpoints Using @ServerEndpoint
74.17. Enable HTTP Response Compression
75. Spring MVC
75.1. Write a JSON REST Service
75.2. Write an XML REST Service
75.3. Customize the Jackson ObjectMapper
75.4. Customize the @ResponseBody Rendering
75.5. Handling Multipart File Uploads
75.6. Switch Off the Spring MVC DispatcherServlet
75.7. Switch off the Default MVC Configuration
75.8. Customize ViewResolvers
76. HTTP Clients
76.1. Configure RestTemplate to Use a Proxy
77. Logging
77.1. Configure Logback for Logging
77.1.1. Configure Logback for File-only Output
77.2. Configure Log4j for Logging
77.2.1. Use YAML or JSON to Configure Log4j 2
78. Data Access
78.1. Configure a Custom DataSource
78.2. Configure Two DataSources
78.3. Use Spring Data Repositories
78.4. Separate @Entity Definitions from Spring Configuration
78.5. Configure JPA Properties
78.6. Configure Hibernate Naming Strategy
78.7. Use a Custom EntityManagerFactory
78.8. Use Two EntityManagers
78.9. Use a Traditional persistence.xml File
78.10. Use Spring Data JPA and Mongo Repositories
78.11. Expose Spring Data Repositories as REST Endpoint
78.12. Configure a Component that is Used by JPA
79. Database Initialization
79.1. Initialize a Database Using JPA
79.2. Initialize a Database Using Hibernate
79.3. Initialize a Database
79.4. Initialize a Spring Batch Database
79.5. Use a Higher-level Database Migration Tool
79.5.1. Execute Flyway Database Migrations on Startup
79.5.2. Execute Liquibase Database Migrations on Startup
80. Messaging
80.1. Disable Transacted JMS Session
81. Batch Applications
81.1. Execute Spring Batch Jobs on Startup
82. Actuator
82.1. Change the HTTP Port or Address of the Actuator Endpoints
82.2. Customize the ‘whitelabel’ Error Page
83. Security
83.1. Switch off the Spring Boot Security Configuration
83.2. Change the AuthenticationManager and Add User Accounts
83.3. Enable HTTPS When Running behind a Proxy Server
84. Hot Swapping
84.1. Reload Static Content
84.2. Reload Templates without Restarting the Container
84.2.1. Thymeleaf Templates
84.2.2. FreeMarker Templates
84.2.3. Groovy Templates
84.3. Fast Application Restarts
84.4. Reload Java Classes without Restarting the Container
85. Build
85.1. Generate Build Information
85.2. Generate Git Information
85.3. Customize Dependency Versions
85.4. Create an Executable JAR with Maven
85.5. Use a Spring Boot Application as a Dependency
85.6. Extract Specific Libraries When an Executable Jar Runs
85.7. Create a Non-executable JAR with Exclusions
85.8. Remote Debug a Spring Boot Application Started with Maven
85.9. Build an Executable Archive from Ant without Using spring-boot-antlib
86. Traditional Deployment
86.1. Create a Deployable War File
86.2. Create a Deployable War File for Older Servlet Containers
86.3. Convert an Existing Application to Spring Boot
86.4. Deploying a WAR to WebLogic
86.5. Deploying a WAR in an Old (Servlet 2.5) Container
86.6. Use Jedis Instead of Lettuce
X. Appendices
A. Common application properties
B. Configuration Metadata
B.1. Metadata Format
B.1.1. Group Attributes
B.1.2. Property Attributes
B.1.3. Hint Attributes
B.1.4. Repeated Metadata Items
B.2. Providing Manual Hints
B.2.1. Value Hint
B.2.2. Value Providers
Any
Class Reference
Handle As
Logger Name
Spring Bean Reference
Spring Profile Name
B.3. Generating Your Own Metadata by Using the Annotation Processor
B.3.1. Nested Properties
B.3.2. Adding Additional Metadata
C. Auto-configuration classes
C.1. From the “spring-boot-autoconfigure” module
C.2. From the “spring-boot-actuator-autoconfigure” module
D. Test auto-configuration annotations
E. The Executable Jar Format
E.1. Nested JARs
E.1.1. The Executable Jar File Structure
E.1.2. The Executable War File Structure
E.2. Spring Boot’s “JarFile” Class
E.2.1. Compatibility with the Standard Java “JarFile”
E.3. Launching Executable Jars
E.3.1. Launcher Manifest
E.3.2. Exploded Archives
E.4. PropertiesLauncher Features
E.5. Executable Jar Restrictions
E.6. Alternative Single Jar Solutions
F. Dependency versions

The Spring Boot reference guide is available as

The latest copy is available at 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 common questions.

  • Learn the Spring basics. Spring Boot builds on many other Spring projects. Check the spring.io web-site for a wealth of reference documentation. If you are starting out with Spring, try one of the guides .
  • Ask a question. We monitor stackoverflow.com for questions tagged with spring-boot .
  • Report bugs with Spring Boot at github.com/spring-projects/spring-boot/issues .
  • [Note] Note

    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 .

    Spring Boot 2.0.0.M7 requires Java 8 and Spring Framework 5.0.2.RELEASE or above. Explicit build support is provided for Maven 3.2+ and Gradle 4.

    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 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 (Command Line Interface) first, otherwise, read on for “classic” installation instructions.

    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).

    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 .

    [Tip] Tip

    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 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” . Spring Boot also provides an optional Maven plugin to create executable jars.

    The following listing shows a typical pom.xml file:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<groupId>com.example</groupId>
    	<artifactId>myproject</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<!-- Inherit defaults from Spring Boot -->
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.0.0.M7</version>
    	</parent>
    	<!-- Add typical dependencies for a web application -->
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    	</dependencies>
    	<!-- Package as an executable jar -->
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    			</plugin>
    		</plugins>
    	</build>
    	<!-- Add Spring repositories -->
    	<!-- (you don't need this if you are using a .RELEASE version) -->
    	<repositories>
    		<repository>
    			<id>spring-snapshots</id>
    			<url>http://repo.spring.io/snapshot</url>
    			<snapshots><enabled>true</enabled></snapshots>
    		</repository>
    		<repository>
    			<id>spring-milestones</id>
    			<url>http://repo.spring.io/milestone</url>
    		</repository>
    	</repositories>
    	<pluginRepositories>
    		<pluginRepository>
    			<id>spring-snapshots</id>
    			<url>http://repo.spring.io/snapshot</url>
    		</pluginRepository>
    		<pluginRepository>
    			<id>spring-milestones</id>
    			<url>http://repo.spring.io/milestone</url>
    		</pluginRepository>
    	</pluginRepositories>
    </project>
    [Tip] Tip

    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” for an alternative solution that uses an import scope.

    Spring Boot is compatible with Gradle 4. If you do not already have Gradle installed, you can follow the instructions at www.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” . Spring Boot provides a useful Gradle plugin that can be used to simplify dependency declarations and to create executable jars.

    The following example shows a typical build.gradle file:

    buildscript {
    	repositories {
    		jcenter()
    		maven { url 'http://repo.spring.io/snapshot' }
    		maven { url 'http://repo.spring.io/milestone' }
    	dependencies {
    		classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.0.0.M7'
    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 "http://repo.spring.io/snapshot" }
    	maven { url "http://repo.spring.io/milestone" }
    dependencies {
    	compile("org.springframework.boot:spring-boot-starter-web")
    	testCompile("org.springframework.boot:spring-boot-starter-test")
    }

    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 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.

    You can download the Spring CLI distribution from the Spring software repository:

    Cutting edge snapshot distributions are also available.

    Once downloaded, follow the 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).

    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 and install Spring Boot by using the following commands:

    $ sdk install springboot
    $ spring --version
    Spring Boot v2.0.0.M7

    If you are developing 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.M7-bin/spring-2.0.0.M7/
    $ sdk default springboot dev
    $ spring --version
    Spring CLI v2.0.0.M7

    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.M7
    ================================================================================
    + - local version
    * - installed
    > - currently in use
    ================================================================================

    If you are on a Mac and use Homebrew , 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] Note

    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.

    If you are on a Mac and use MacPorts , 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 and zsh 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 using SDKMAN!, use the following commands:

    $ . ~/.sdkman/candidates/springboot/current/shell-completion/bash/spring
    $ spring <HIT TAB HERE>
      grab  help  jar  run  test  version
    [Note] Note

    If you install the Spring Boot CLI by using Homebrew or MacPorts, the command-line completion scripts are automatically registered with your shell.

    If you are upgrading from an earlier release of Spring Boot check the “release notes” hosted on the project wiki . You’ll find upgrade instructions along with 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 remembering to update your PATH environment variable to remove any older references.

    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] Tip

    The spring.io web site contains many “Getting Started” 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 and choosing the "Web" starter from the dependencies searcher. Doing so generates a new project structure so that you can start coding right away . Check the Spring Initializr documentation 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] Note

    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”.

    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:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<groupId>com.example</groupId>
    	<artifactId>myproject</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.0.0.M7</version>
    	</parent>
    	<!-- Additional lines to be added here... -->
    	<!-- (you don't need this if you are using a .RELEASE version) -->
    	<repositories>
    		<repository>
    			<id>spring-snapshots</id>
    			<url>http://repo.spring.io/snapshot</url>
    			<snapshots><enabled>true</enabled></snapshots>
    		</repository>
    		<repository>
    			<id>spring-milestones</id>
    			<url>http://repo.spring.io/milestone</url>
    		</repository>
    	</repositories>
    	<pluginRepositories>
    		<pluginRepository>
    			<id>spring-snapshots</id>
    			<url>http://repo.spring.io/snapshot</url>
    		</pluginRepository>
    		<pluginRepository>
    			<id>spring-milestones</id>
    			<url>http://repo.spring.io/milestone</url>
    		</pluginRepository>
    	</pluginRepositories>
    </project>

    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] Note

    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.

    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 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:

    <dependencies>
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-web</artifactId>
    	</dependency>
    </dependencies>

    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.

    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.

    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.

    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:

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

    The spring-boot-starter-parent POM includes <executions> 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 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.M7: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.M7)
    ....... . . .
    ....... . . . (log output here)
    ....... . . .
    ........ Started Example in 2.536 seconds (JVM running for 2.864)

    As before, to exit the application, press ctrl-c .

    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 and check out some of the getting started guides that solve specific “How do I do that with Spring?” problems. We also have Spring Boot-specific “ How-to ” reference documentation.

    The Spring Boot repository also has a bunch of 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 .

    It is strongly recommended that you choose a build system that supports 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.

    Maven users can inherit from the spring-boot-starter-parent project to obtain sensible defaults. The parent project provides the following features:

    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 .)

    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:

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

    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 :

    <dependencyManagement>
    	<dependencies>
    		<!-- Override Spring Data release train provided by Spring Boot -->
    		<dependency>
    			<groupId>org.springframework.data</groupId>
    			<artifactId>spring-data-releasetrain</artifactId>
    			<version>Fowler-SR2</version>
    			<scope>import</scope>
    			<type>pom</type>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-dependencies</artifactId>
    			<version>2.0.0.M7</version>
    			<type>pom</type>
    			<scope>import</scope>
    		</dependency>
    	</dependencies>
    </dependencyManagement>
    [Note] Note

    In the preceding example, we specify a BOM , but any dependency type can be overridden in the same way.

    Spring Boot includes a Maven plugin that can package the project as an executable jar. Add the plugin to your <plugins> section if you want to use it, as shown in the following example:

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

    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.

    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:

    <ivy-module version="2.0">
    	<info organisation="org.springframework.boot" module="spring-boot-sample-ant" />
    	<configurations>
    		<conf name="compile" description="everything needed to compile this module" />
    		<conf name="runtime" extends="compile" description="everything needed to run this module" />
    	</configurations>
    	<dependencies>
    		<dependency org="org.springframework.boot" name="spring-boot-starter"
    			rev="${spring-boot.version}" conf="compile" />
    	</dependencies>
    </ivy-module>

    A typical build.xml looks like the following example:

    <project
    	xmlns:ivy="antlib:org.apache.ivy.ant"
    	xmlns:spring-boot="antlib:org.springframework.boot.ant"
    	name="myapp" default="build">
    	<property name="spring-boot.version" value="2.0.0.M7" />
    	<target name="resolve" description="--> retrieve dependencies with ivy">
    		<ivy:retrieve pattern="lib/[conf]/[artifact]-[type]-[revision].[ext]" />
    	</target>
    	<target name="classpaths" depends="resolve">
    		<path id="compile.classpath">
    			<fileset dir="lib/compile" includes="*.jar" />
    		</path>
    	</target>
    	<target name="init" depends="classpaths">
    		<mkdir dir="build/classes" />
    	</target>
    	<target name="compile" depends="init" description="compile">
    		<javac srcdir="src/main/java" destdir="build/classes" classpathref="compile.classpath" />
    	</target>
    	<target name="build" depends="compile">
    		<spring-boot:exejar destfile="build/myapp.jar" classes="build/classes">
    			<spring-boot:lib>
    				<fileset dir="lib/runtime" />
    			</spring-boot:lib>
    		</spring-boot:exejar>
    	</target>
    </project>
    [Tip] Tip

    If you do not want to use the spring-boot-antlib module, see the Section 85.9, “Build an Executable Archive from Ant without Using spring-boot-antlib “How-to” .

    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 technology 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.

    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

    spring-boot-starter-activemq

    Starter for JMS messaging using Apache ActiveMQ

    Pom

    spring-boot-starter-amqp

    Starter for using Spring AMQP and Rabbit MQ

    Pom

    spring-boot-starter-aop

    Starter for aspect-oriented programming with Spring AOP and AspectJ

    Pom

    spring-boot-starter-artemis

    Starter for JMS messaging using Apache Artemis

    Pom

    spring-boot-starter-batch

    Starter for using Spring Batch

    Pom

    spring-boot-starter-cache

    Starter for using Spring Framework’s caching support

    Pom

    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

    spring-boot-starter-data-cassandra

    Starter for using Cassandra distributed database and Spring Data Cassandra

    Pom

    spring-boot-starter-data-cassandra-reactive

    Starter for using Cassandra distributed database and Spring Data Cassandra Reactive

    Pom

    spring-boot-starter-data-couchbase

    Starter for using Couchbase document-oriented database and Spring Data Couchbase

    Pom

    spring-boot-starter-data-couchbase-reactive

    Starter for using Couchbase document-oriented database and Spring Data Couchbase Reactive

    Pom

    spring-boot-starter-data-elasticsearch

    Starter for using Elasticsearch search and analytics engine and Spring Data Elasticsearch

    Pom

    spring-boot-starter-data-jpa

    Starter for using Spring Data JPA with Hibernate

    Pom

    spring-boot-starter-data-ldap

    Starter for using Spring Data LDAP

    Pom

    spring-boot-starter-data-mongodb

    Starter for using MongoDB document-oriented database and Spring Data MongoDB

    Pom

    spring-boot-starter-data-mongodb-reactive

    Starter for using MongoDB document-oriented database and Spring Data MongoDB Reactive

    Pom

    spring-boot-starter-data-neo4j

    Starter for using Neo4j graph database and Spring Data Neo4j

    Pom

    spring-boot-starter-data-redis

    Starter for using Redis key-value data store with Spring Data Redis and the Lettuce client

    Pom

    spring-boot-starter-data-redis-reactive

    Starter for using Redis key-value data store with Spring Data Redis reactive and the Lettuce client

    Pom

    spring-boot-starter-data-rest

    Starter for exposing Spring Data repositories over REST using Spring Data REST

    Pom

    spring-boot-starter-data-solr

    Starter for using the Apache Solr search platform with Spring Data Solr

    Pom

    spring-boot-starter-freemarker

    Starter for building MVC web applications using FreeMarker views

    Pom

    spring-boot-starter-groovy-templates

    Starter for building MVC web applications using Groovy Templates views

    Pom

    spring-boot-starter-hateoas

    Starter for building hypermedia-based RESTful web application with Spring MVC and Spring HATEOAS

    Pom

    spring-boot-starter-integration

    Starter for using Spring Integration

    Pom

    spring-boot-starter-jdbc

    Starter for using JDBC with the Tomcat JDBC connection pool

    Pom

    spring-boot-starter-jersey

    Starter for building RESTful web applications using JAX-RS and Jersey. An alternative to spring-boot-starter-web

    Pom

    spring-boot-starter-jooq

    Starter for using jOOQ to access SQL databases. An alternative to spring-boot-starter-data-jpa or spring-boot-starter-jdbc

    Pom

    spring-boot-starter-json

    Starter for reading and writing json

    Pom

    spring-boot-starter-jta-atomikos

    Starter for JTA transactions using Atomikos

    Pom

    spring-boot-starter-jta-bitronix

    Starter for JTA transactions using Bitronix

    Pom

    spring-boot-starter-jta-narayana

    Spring Boot Narayana JTA Starter

    Pom

    spring-boot-starter-mail

    Starter for using Java Mail and Spring Framework’s email sending support

    Pom

    spring-boot-starter-mustache

    Starter for building web applications using Mustache views

    Pom

    spring-boot-starter-quartz

    Spring Boot Quartz Starter

    Pom

    spring-boot-starter-security

    Starter for using Spring Security

    Pom

    spring-boot-starter-test

    Starter for testing Spring Boot applications with libraries including JUnit, Hamcrest and Mockito

    Pom

    spring-boot-starter-thymeleaf

    Starter for building MVC web applications using Thymeleaf views

    Pom

    spring-boot-starter-validation

    Starter for using Java Bean Validation with Hibernate Validator

    Pom

    spring-boot-starter-web

    Starter for building web, including RESTful, applications using Spring MVC. Uses Tomcat as the default embedded container

    Pom

    spring-boot-starter-web-services

    Starter for using Spring Web Services

    Pom

    spring-boot-starter-webflux

    Starter for building WebFlux applications using Spring Framework’s Reactive Web support

    Pom

    spring-boot-starter-websocket

    Starter for building WebSocket applications using Spring Framework’s WebSocket support

    Pom


    In addition to the application starters, the following starters can be used to add production ready features:


    Finally, Spring Boot also includes the following starters that can be used if you want to exclude or swap specific technical facets:


    [Tip] Tip

    For a list of additional community contributed starters, see the README file in the spring-boot-starters module on GitHub.

    Spring Boot does not require any specific code layout to work. However, there are some best practices that help.

    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);
    }

    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] Tip

    You should only ever add one @EnableAutoConfiguration annotation. We generally recommend that you add it to your primary @Configuration class.

    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] Tip

    Notice how using constructor injection lets the riskAssessor field be marked as final , indicating that it cannot be subsequently changed.

    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 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] Note

    @SpringBootApplication also provides aliases to customize the attributes of @EnableAutoConfiguration and @ComponentScan .

    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] Note

    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.

    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.

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

    Gradle.

    dependencies {
    	compile("org.springframework.boot:spring-boot-devtools")
    

    [Note]Note

    Developer tools are automatically disabled when running a fully packaged application. If your application is launched using 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 using your project. Gradle does not support optional dependencies out-of-the-box, so you may want to have a look at the propdeps-plugin.

    [Tip]Tip

    Repackaged archives do not contain devtools by default. If you want to use a certain remote devtools feature, you need to disable the excludeDevtools build property to include it. The property is supported with both the Maven and Gradle plugins.

    Several of the libraries supported by Spring Boot use caches to improve performance. For example, 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]Tip

    For a complete list of the properties that are applied by the devtools, see DevToolsPropertyDefaultsPostProcessor.

    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.

    [Note]Note

    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]Tip

    Automatic restart works very well when used with LiveReload. See the LiveReload section 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]Note

    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]Note

    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]Note

    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.

    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. 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]Tip

    If you want to keep those defaults and add additional exclusions, use the spring.devtools.restart.additional-exclude property instead.

    As described in the Restart vs Reload section above, restart functionality is implemented by using two classloaders. For most applications, this approach works well. However, sometimes it can 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]Note

    All property keys must be unique. As long as a property starts with restart.include. or restart.exclude. it is considered.

    [Tip]Tip

    All META-INF/spring-devtools.properties from the classpath will be loaded. You can package files inside your project, or in the libraries that the project consumes.

    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.

    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]Note

    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.

    The Spring Boot developer tools are not just 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:

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

    Then you need to set a spring.devtools.remote.secret property, as shown in the following example:

    spring.devtools.remote.secret=mysecret
    [Warning]Warning

    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.

    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:

    A running remote client might resemble the following listing:

      .   ____          _                                              __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _          ___               _      \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` |        | _ \___ _ __  ___| |_ ___ \ \ \ \
     \\/  ___)| |_)| | | | | || (_| []::::::[]   / -_) '  \/ _ \  _/ -_) ) ) ) )
      '  |____| .__|_| |_|_| |_\__, |        |_|_\___|_|_|_\___/\__\___|/ / / /
     =========|_|==============|___/===================================/_/_/_/
     :: Spring Boot Remote :: 2.0.0.M7
    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]Note

    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]Tip

    It is always advisable to use https:// as the connection protocol, so that traffic is encrypted and passwords cannot be intercepted.

    [Tip]Tip

    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.

    The remote client monitors your application classpath for changes in the same way as the local 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]Note

    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.

    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.M7
    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.

    The banner that is printed on start up can be changed by adding a banner.txt file to your classpath or by setting the banner.location property to the location of such a file. If the file has an encoding other than UTF-8, you can set 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 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:


    [Tip] Tip

    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] Note

    YAML maps off to false , so be sure to add quotes if you want to disable the banner in your application.

    spring:
    	main:
    		banner-mode: "off"

    23.5 Application Events and Listeners

    In addition to the usual Spring Framework events, such as ContextRefreshedEvent , a SpringApplication sends some additional application events.

    [Note] Note

    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(…​) or SpringApplicationBuilder.listeners(…​) methods.

    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 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 ApplicationReadyEvent is sent after the refresh and any related callbacks have been processed, to indicate that the application is ready to service requests.
    5. An ApplicationFailedEvent is sent if there is an exception on startup.
    [Tip] Tip

    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 ancestors 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 .

    It is possible to enable admin-related features for the application by specifying the spring.application.admin.enabled property. This exposes the SpringApplicationAdminMXBean 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] Tip

    If you want to know on which HTTP port the application is running, get the property with a key of local.server.port .

    [Caution] Caution

    Take care when enabling this feature, as the MBean exposes a method to shutdown the application.

    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 bound to structured objects 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 on your home directory ( ~/.spring-boot-devtools.properties when devtools is active).
    2. @TestPropertySource annotations on your tests.
    3. @SpringBootTest#properties 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 only has properties in random.* .
    12. Profile-specific application properties outside of your packaged jar ( application-{profile}.properties and YAML variants).
    13. Profile-specific application 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 annotations on your @Configuration classes.
    17. Default properties (specified using 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] Tip

    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='{"foo":{"bar":"spam"}}' java -jar myapp.jar

    In the preceding example, you end up with foo.bar=spam 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='{"foo":"bar"}' -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='{"foo":"bar"}'

    You can also supply the JSON as a JNDI variable, as follows: java:comp/env/spring.application.json .

    SpringApplication loads properties from application.properties files in the following locations and adds them to the Spring Environment :

    The list is ordered by precedence (properties defined in locations higher in the list override those defined in lower locations).

    [Note] Note

    You can also use YAML ('.yml') files 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 (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] Warning

    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:

    When custom config locations are configured 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:

    Alternatively, when custom config locations are configured by using spring.config.addition-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:

    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 overriden at runtime with a different file located in one of the custom locations.

    [Note] Note

    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] Note

    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.

    YAML is a superset of JSON and, as such, is a very convenient format for specifying hierarchical configuration data. The SpringApplication class automatically supports YAML as an alternative to properties whenever you have the SnakeYAML library on your classpath.

    [Note] Note

    If you use ‘Starters’, SnakeYAML is automatically provided by spring-boot-starter .

    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.bar.com
    		name: Developer Setup
    	prod:
    		url: http://foo.bar.com
    		name: My Cool App

    The preceding example would be transformed into the following properties:

    environments.dev.url=http://dev.bar.com
    environments.dev.name=Developer Setup
    environments.prod.url=http://foo.bar.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.bar.com
    	- foo.bar.com

    The preceding example would be transformed into these properties:

    my.servers[0]=dev.bar.com
    my.servers[1]=foo.bar.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<String> servers = new ArrayList<String>();
    	public List<String> getServers() {
    		return this.servers;
    }
    [Note] Note

    When lists are configured in more than one place, overriding works by replacing the entire list. In the preceding example, when my.servers is redefined in several places, the entire list from the PropertySource with higher precedence will override any other configuration for that list. Both comma-separated lists and yaml lists can be used for completely overriding the contents of the list.

    As we have seen above , 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 from FooProperties :

    @ConfigurationProperties("foo")
    public class FooProperties {
    	private final List<MyPojo> list = new ArrayList<>();
    	public List<MyPojo> getList() {
    		return this.list;
    }

    Consider the following configuration:

    foo:
      list:
        - name: my name
          description: my description
    spring:
      profiles: dev
    foo:
      list:
           - name: my another name

    If the dev profile is not active, FooProperties.list contains one MyPojo entry as defined above. 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:

    foo:
      list:
    	- name: my name
    	  description: my description
    	- name: another name
    	  description: another description
    spring:
      profiles: dev
    foo:
      list:
    	 - name: my another name

    In the preceding example, if the dev profile is active, FooProperties.list contains one MyPojo entry (with a name of “my another name” and a description of null ).

    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("foo")
    public class FooProperties {
    	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<String> roles = new ArrayList<>(Collections.singleton("USER"));
    		public String getUsername() { ... }
    		public void setUsername(String username) { ... }
    		public String getPassword() { ... }
    		public void setPassword(String password) { ... }
    		public List<String> getRoles() { ... }
    		public void setRoles(List<String> roles) { ... }
    }

    The preceding POJO defines the following properties:

    [Note] Note

    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 type, as it is used automatically by the container to instantiate the object.

    You also need to list the properties classes to register in the @EnableConfigurationProperties annotation:

    @Configuration
    @EnableConfigurationProperties(FooProperties.class)
    public class MyConfiguration {
    }
    [Note] Note

    When the @ConfigurationProperties bean is registered that way, the bean has a conventional name: <prefix>-<fqn> , where <prefix> is the environment key prefix specified in the @ConfigurationProperties annotation and <fqn> 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 foo-com.example.FooProperties .

    Even if the preceding configuration creates a regular bean for FooProperties , 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 FooProperties is already a bean, as shown in the following example:

    @Component
    @ConfigurationProperties(prefix="foo")
    public class FooProperties {
    	// ... 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
    foo:
    	remote-address: 192.168.1.1
    	security:
    		username: foo
    		roles:
    		  - USER
    		  - ADMIN
    # additional configuration as required

    To work with @ConfigurationProperties beans, you can just inject them in the same way as any other bean, as shown in the following example:

    @Service
    public class MyService {
    	private final FooProperties properties;
    	@Autowired
    	public MyService(FooProperties properties) {
    	    this.properties = properties;
     	//...
    	@PostConstruct
    	public void openConnection() {
    		Server server = new Server(this.properties.getRemoteAddress());
    		// ...
    }
    [Tip] Tip

    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 appendix for details.

    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:


    [Note] Note

    The prefix value for the annotation must be in kebab case (lowercase and separated by - , i.e. acme.my-project.person ).


    [Tip] Tip

    We recommend that, when possible, properties are stored in lower-case kebab format, such as my.property-name=foo .

    Spring 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 bean named conversionService ) or custom property editors (through a CustomEditorConfigurer bean) or custom Converters (with bean definitions annotated as @ConfigurationPropertiesBinding ).

    [Note] Note

    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 .

    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="foo")
    @Validated
    public class FooProperties {
    	@NotNull
    	private InetAddress remoteAddress;
    	// ... getters and setters
    }

    In order to validate the values of nested properties, you must annotate the associated field as @Valid to trigger its validation. The following example builds on the preceding FooProperties example:

    @ConfigurationProperties(prefix="connection")
    @Validated
    public class FooProperties {
    	@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 that shows how to set things up.

    [Tip] Tip

    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 " section for details.

    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 {
    	// ...
    }

    In the normal Spring way, you can use a spring.profiles.active Environment property to specify which profiles are active. You can specify the property in any of the usual ways. For example, you could include it in your application.properties :

    spring.profiles.active=dev,hsqldb

    You could also specify it on the command line by using the following switch: --spring.profiles.active=dev,hsqldb .

    Spring Boot uses Commons Logging for all internal logging but leaves the underlying log implementation open. Default configurations are provided for Java Util Logging , Log4J2 , and Logback . 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] Tip

    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.

    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] Note

    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).

    If your terminal supports ANSI, color output is used to aid readability. You can set spring.output.ansi.enabled to a supported value 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 mapping of log level to a color is as follows:

    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

    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 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] Note

    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] Note

    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] Warning

    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.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:

    [Tip] Tip

    If you want to use a placeholder in a logging property, you should use Spring Boot’s syntax 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] Tip

    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

    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] Note

    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] Warning

    The extensions cannot be used with Logback’s configuration scanning . 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]]

    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.

    The Spring Web MVC framework (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 example @RestController to serve 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<Customer> 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 . There are also several guides that cover Spring MVC available at spring.io/guides .

    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 , 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 contains 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<SomeObject> {
    		// ...
    	public static class Deserializer extends JsonDeserializer<SomeObject> {
    		// ...
    }

    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 and JsonObjectDeserializer base classes that provide useful alternatives to the standard Jackson versions when serializing objects. See JsonObjectSerializer and JsonObjectDeserializer in the Javadoc for details.

    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 will 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 . Any resources with a path in /webjars/** are served from jar files if they are packaged in the Webjars format.

    [Tip] Tip

    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 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] Note

    If you are using JBoss, you need to declare the webjars-locator-jboss-vfs dependency instead of the webjars-locator . 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 <link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/> , in URLs:

    spring.resources.chain.strategy.content.enabled=true
    spring.resources.chain.strategy.content.paths=/**
    [Note] Note

    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 ResourceUrlProvider .

    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 ( <link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/> ).

    See ResourceProperties for more of the supported options.

    [Tip] Tip

    This feature has been thoroughly described in a dedicated post and in Spring Framework’s reference documentation .

    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:

    [Tip] Tip

    If possible, JSPs should be avoided. There are several known 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] Tip

    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/ .

    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] Tip

    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 = FooController.class)
    public class FooControllerAdvice 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 FooController , a JSON representation of the CustomErrorType POJO is used instead of the ErrorAttributes representation.

    Cross-origin resource sharing (CORS) is a W3C specification implemented by most browsers that allows you to specify in a flexible way what kind of cross-domain requests are authorized, instead of using some less secure and less powerful approaches such as IFRAME or JSONP.

    As of version 4.2, Spring MVC supports CORS . Using controller method CORS configuration with @CrossOrigin annotations in your Spring Boot application does not require any specific configuration. Global CORS configuration can be defined by registering a WebMvcConfigurer bean with a customized addCorsMappings(CorsRegistry) method, as shown in the following example:

    @Configuration
    public class MyConfiguration {
    	@Bean
    	public WebMvcConfigurer corsConfigurer() {
    		return new WebMvcConfigurer() {
    			@Override
    			public void addCorsMappings(CorsRegistry registry) {
    				registry.addMapping("/api/**");
    }

    Spring WebFlux is the new reactive web framework introduced in Spring Framework 5.0. Unlike Spring MVC, it does not require the Servlet API, is fully asynchronous and non-blocking, and implements the Reactive Streams specification through the Reactor project .

    Spring WebFlux comes in two flavors: functional and annotation-based. The annotation-based one is quite close to the Spring MVC model we know, as shown in the following example:

    @RestController
    @RequestMapping("/users")
    public class MyRestController {
    	@GetMapping("/{user}")
    	public Mono<User> getUser(@PathVariable Long user) {
    		// ...
    	@GetMapping("/{user}/customers")
    	Flux<Customer> getUserCustomers(@PathVariable Long user) {
    		// ...
    	@DeleteMapping("/{user}")
    	public Mono<User> deleteUser(@PathVariable Long user) {
    		// ...
    }

    ‘WebFlux.fn’, the functional variant, separates the routing configuration from the actual handling of the requests, as shown in the following example:

    @Configuration
    public class RoutingConfiguration {
    	@Bean
    	public RouterFunction<ServerResponse> monoRouterFunction(UserHandler userHandler) {
    		return route(GET("/{user}").and(accept(APPLICATION_JSON)), userHandler::getUser)
    				.andRoute(GET("/{user}/customers").and(accept(APPLICATION_JSON)), userHandler::getUserCustomers)
    				.andRoute(DELETE("/{user}").and(accept(APPLICATION_JSON)), userHandler::deleteUser);
    @Component
    public class UserHandler {
    	public Mono<ServerResponse> getUser(ServerRequest request) {
    		// ...
    	public Mono<ServerResponse> getUserCustomers(ServerRequest request) {
    		// ...
    	public Mono<ServerResponse> deleteUser(ServerRequest request) {
    		// ...
    }

    WebFlux is part of the Spring Framework. and detailed information is available in its reference documentation .

    To get started, add the spring-boot-starter-webflux module to your application.

    [Note] Note

    Adding both spring-boot-starter-web and spring-boot-starter-webflux modules in your application results in Spring Boot auto-configuring Spring MVC, not WebFlux. This behavior has been chosen because many Spring developers add spring-boot-starter-webflux to their Spring MVC application to use the reactive WebCLient . You can still enforce your choice by setting the chosen application type to SpringApplication.setWebApplicationType(WebApplicationType.REACTIVE) .

    Spring Boot provides a WebExceptionHandler that handles all errors in a sensible way. Its position in the processing order is immediately before the handlers provided by WebFlux, which are considered last. For machine clients it will produce a JSON response with details of the error, the HTTP status and the exception message. For browser clients there is a ‘whitelabel’ error handler that renders the same data in HTML format. You can also provide your own HTML templates to display errors (see the next section ).

    The first step to customizing this feature is often about using the existing mechanism but replacing or augmenting the error contents. For that, you can simply add a bean of type ErrorAttributes .

    To change the error handling behavior, you can implement ErrorWebExceptionHandler and register a bean definition of that type. Because a WebExceptionHandler is quite low-level, Spring Boot also provides a convenient AbstractErrorWebExceptionHandler to let you handle errors in a WebFlux functional way, as shown in the following example:

    public class CustomErrorWebExceptionHandler extends AbstractErrorWebExceptionHandler {
    	// Define constructor here
    	@Override
    	protected RouterFunction<ServerResponse> getRoutingFunction(ErrorAttributes errorAttributes) {
    		return RouterFunctions
    				.route(aPredicate, aHandler)
    				.andRoute(anotherPredicate, anotherHandler);
    }

    For a more complete picture, you can also subclass DefaultErrorWebExceptionHandler directly and override specific methods.

    If you prefer the JAX-RS programming model for REST endpoints, you can use one of the available implementations instead of Spring MVC. Jersey 1.x and Apache CXF work quite well out of the box if you register their Servlet or Filter as a @Bean in your application context. Jersey 2.x has some native Spring support, so we also provide auto-configuration support for it in Spring Boot, together with a starter.

    To get started with Jersey 2.x, include the spring-boot-starter-jersey as a dependency and then you need one @Bean of type ResourceConfig in which you register all the endpoints, as shown in the following example:

    @Component
    public class JerseyConfig extends ResourceConfig {
    	public JerseyConfig() {
    		register(Endpoint.class);
    }
    [Warning] Warning

    Jersey’s support for scanning executable archives is rather limited. For example, it cannot scan for endpoints in a package found in WEB-INF/classes when running an executable war file. To avoid this limitation, the packages method should not be used, and endpoints should be registered individually by using the register method, as shown in the preceding example.

    You can also register an arbitrary number of beans implementing ResourceConfigCustomizer for more advanced customizations.

    All the registered endpoints should be @Components with HTTP resource annotations ( @GET etc.), as shown in the following example:

    @Component
    @Path("/hello")
    public class Endpoint {
    	public String message() {
    		return "Hello";
    }

    Since the Endpoint is a Spring @Component , its lifecycle is managed by Spring and you can use the @Autowired annotation to inject dependencies and use the @Value annotation to inject external configuration. By default, the Jersey servlet is registered and mapped to /* . You can change the mapping by adding @ApplicationPath to your ResourceConfig .

    By default, Jersey is set up as a Servlet in a @Bean of type ServletRegistrationBean named jerseyServletRegistration . By default, the servlet is initialized lazily, but you can customize that behavior by setting spring.jersey.servlet.load-on-startup . You can disable or override that bean by creating one of your own with the same name. You can also use a filter instead of a servlet by setting spring.jersey.type=filter (in which case, the @Bean to replace or override is jerseyFilterRegistration ). The filter has an @Order , which you can set with spring.jersey.filter.order . Both the servlet and the filter registrations can be given init parameters by using spring.jersey.init.* to specify a map of properties.

    There is a Jersey sample so that you can see how to set things up. There is also a Jersey 1.x sample . Note that, in the Jersey 1.x sample, the spring-boot maven plugin has been configured to unpack some Jersey jars so that they can be scanned by the JAX-RS implementation (because the sample asks for them to be scanned in its Filter registration). If any of your JAX-RS resources are packaged as nested jars, you may need to do the same.

    Spring Boot includes support for embedded Tomcat, Jetty, and Undertow servers. Most developers use the appropriate ‘Starter’ to obtain a fully configured instance. By default, the embedded server listens for HTTP requests on port 8080 .

    [Warning] Warning

    If you choose to use Tomcat on CentOS, be aware that, by default, a temporary directory is used to store compiled JSPs, file uploads, and so on. This directory may be deleted by tmpwatch while your application is running, leading to failures. To avoid this behavior, you may want to customize your tmpwatch configuration, so that tomcat.* directories are not deleted or configure server.tomcat.basedir , so that embedded Tomcat uses a different location.

    Common servlet container settings can be configured by using Spring Environment properties. Usually, you would define the properties in your application.properties file.

    Common server settings include:

    Spring Boot tries as much as possible to expose common settings, but this is not always possible. For those cases, dedicated namespaces offer server-specific customizations (see server.tomcat and server.undertow ). For instance, access logs can be configured with specific features of the embedded servlet container.

    [Tip] Tip

    See the ServerProperties class for a complete list.

    If Spring Security is on the classpath, then web applications are secure by default. Spring Boot relies on Spring Security’s content-negotiation strategy to determine whether to use httpBasic or formLogin . To add method-level security to a web application, you can also add @EnableGlobalMethodSecurity with your desired settings. Additional information can be found in the Spring Security Reference .

    The default AuthenticationManager has a single user (the user name is ‘user’, and the password is random and is printed at INFO level when the application starts), as shown in the following example:

    Using default security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35
    [Note] Note

    If you fine-tune your logging configuration, ensure that the org.springframework.boot.autoconfigure.security category is set to log INFO -level messages. Otherwise, the default password is not printed.

    The default security configuration is implemented in SecurityAutoConfiguration and in the classes imported from there ( SpringBootWebSecurityConfiguration for web security and AuthenticationManagerConfiguration for authentication configuration, which is also relevant in non-web applications). To switch off the default web application security configuration completely, you can add a bean of type WebSecurityConfigurerAdapter (this does not disable the authentication manager configuration or Actuator’s security).

    To also switch off the authentication manager configuration, you can add a bean of type UserDetailsService , AuthenticationProvider or AuthenticationManager . There are several secure applications in the Spring Boot samples to get you started with common use cases.

    The basic features you get by default in a web application are:

    • A UserDetailsService bean with in-memory store and a single user with a generated password.
    • Form-based login or HTTP Basic security (depending on Content-Type) for the entire application (including actuator endpoints if actuator is on the classpath).

    Access rules can be overriden by adding a custom WebSecurityConfigurerAdapter . Spring Boot provides convenience methods that can be used to override access rules for actuator endpoints and static resources. EndpointRequest can be used to create a RequestMatcher that is based on the management.endpoints.web.base-path property. StaticResourceRequest can be used to create a RequestMatcher for static resources in commonly used locations.

    OAuth2 is a widely used authorization framework that is supported by Spring.

    If you have spring-security-oauth2-client on your classpath, you can take advantage of some auto-configuration to make it easy to set up an OAuth2 Client. This configuration makes use of the properties under OAuth2ClientProperties .

    You can register multiple OAuth2 clients and providers under the spring.security.oauth2.client prefix, as shown in the following example:

    spring.security.oauth2.client.registration.my-client-1.client-id=abcd
    spring.security.oauth2.client.registration.my-client-1.client-secret=password
    spring.security.oauth2.client.registration.my-client-1.client-name=Client for user scope
    spring.security.oauth2.client.registration.my-client-1.provider=my-oauth-provider
    spring.security.oauth2.client.registration.my-client-1.scope=user
    spring.security.oauth2.client.registration.my-client-1.redirect-uri-template=http://my-redirect-uri.com
    spring.security.oauth2.client.registration.my-client-1.client-authentication-method=basic
    spring.security.oauth2.client.registration.my-client-1.authorization-grant-type=authorization_code
    spring.security.oauth2.client.registration.my-client-2.client-id=abcd
    spring.security.oauth2.client.registration.my-client-2.client-secret=password
    spring.security.oauth2.client.registration.my-client-2.client-name=Client for email scope
    spring.security.oauth2.client.registration.my-client-2.provider=my-oauth-provider
    spring.security.oauth2.client.registration.my-client-2.scope=email
    spring.security.oauth2.client.registration.my-client-2.redirect-uri-template=http://my-redirect-uri.com
    spring.security.oauth2.client.registration.my-client-2.client-authentication-method=basic
    spring.security.oauth2.client.registration.my-client-2.authorization-grant-type=authorization_code
    spring.security.oauth2.client.provider.my-oauth-provider.authorization-uri=http://my-auth-server/oauth/authorize
    spring.security.oauth2.client.provider.my-oauth-provider.token-uri=http://my-auth-server/oauth/token
    spring.security.oauth2.client.provider.my-oauth-provider.user-info-uri=http://my-auth-server/userinfo
    spring.security.oauth2.client.provider.my-oauth-provider.jwk-set-uri=http://my-auth-server/token_keys
    spring.security.oauth2.client.provider.my-oauth-provider.user-name-attribute=name

    By default, Spring Security’s OAuth2LoginAuthenticationFilter will only process URLs matching /login/oauth2/code/* . If you want to customize the redirect-uri-template to use a different pattern, you will need to provide configuration to process that custom pattern. For example, you can add your own WebSecurityConfigurerAdapter that looks like this:

    public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {
    	@Override
    	protected void configure(HttpSecurity http) throws Exception {
    			.authorizeRequests()
    				.anyRequest().authenticated()
    				.and()
    			.oauth2Login()
    				.redirectionEndpoint()
    					.baseUri("/custom-callback");
    }

    For common OAuth2 and OpenID providers such as Google, Github, Facebook, and Okta, we provide a set of provider defaults ( google , github , facebook , and okta respectively).

    If you do not need to customize these providers, you can set the provider attribute to the one for which you need to infer defaults. Also if the ID of your client matches the default supported provider, Spring Boot infers that as well.

    In other words, the two configurations in the following example use the Google provider:

    spring.security.oauth2.client.registration.my-client.client-id=abcd
    spring.security.oauth2.client.registration.my-client.client-secret=password
    spring.security.oauth2.client.registration.my-client.provider=google
    spring.security.oauth2.client.registration.google.client-id=abcd
    spring.security.oauth2.client.registration.google.client-secret=password

    The Spring Framework provides extensive support for working with SQL databases, from direct JDBC access using JdbcTemplate to complete ‘object relational mapping’ technologies such as Hibernate. Spring Data provides an additional level of functionality: creating Repository implementations directly from interfaces and using conventions to generate queries from your method names.

    Java’s javax.sql.DataSource interface provides a standard method of working with database connections. Traditionally, a DataSource uses a URL along with some credentials to establish a database connection.

    [Tip] Tip

    See the ‘How-to’ section for more advanced examples, typically to take full control over the configuration of the DataSource.

    It is often convenient to develop applications using an in-memory embedded database. Obviously, in-memory databases do not provide persistent storage. You need to populate your database when your application starts and be prepared to throw away data when your application ends.

    [Tip] Tip

    The ‘How-to’ section includes a section on how to initialize a database .

    Spring Boot can auto-configure embedded H2 , HSQL , and Derby databases. You need not provide any connection URLs. You need only include a build dependency to the embedded database that you want to use.

    [Note] Note

    If you are using this feature in your tests, you may notice that the same database is reused by your whole test suite regardless of the number of application contexts that you use. If you want to make sure that each context has a separate embedded database, you should set spring.datasource.generate-unique-name to true .

    For example, typical POM dependencies would be as follows:

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
    	<groupId>org.hsqldb</groupId>
    	<artifactId>hsqldb</artifactId>
    	<scope>runtime</scope>
    </dependency>
    [Note] Note

    You need a dependency on spring-jdbc for an embedded database to be auto-configured. In this example, it is pulled in transitively via spring-boot-starter-data-jpa .

    [Tip] Tip

    If, for whatever reason, you do configure the connection URL for an embedded database, take care to ensure that the database’s automatic shutdown is disabled. If you use H2, you should use DB_CLOSE_ON_EXIT=FALSE to do so. If you use HSQLDB, you should ensure that shutdown=true is not used. Disabling the database’s automatic shutdown lets Spring Boot control when the database is closed, thereby ensuring that it happens once access to the database is no longer needed.

    Production database connections can also be auto-configured by using a pooling DataSource . Spring Boot uses the following algorithm for choosing a specific implementation:

    If you use the spring-boot-starter-jdbc or spring-boot-starter-data-jpa ‘starters’, you automatically get a dependency to HikariCP .

    [Note] Note

    You can bypass that algorithm completely and specify the connection pool to use by setting the spring.datasource.type property. This is especially important if you are running your application in a Tomcat container, as tomcat-jdbc is provided by default.

    [Tip] Tip

    Additional connection pools can always be configured manually. If you define your own DataSource bean, auto-configuration does not occur.

    DataSource configuration is controlled by external configuration properties in spring.datasource.* . For example, you might declare the following section in application.properties :

    spring.datasource.url=jdbc:mysql://localhost/test
    spring.datasource.username=dbuser
    spring.datasource.password=dbpass
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    [Note] Note

    You should at least specify the URL by setting the spring.datasource.url property. Otherwise, Spring Boot tries to auto-configure an embedded database.

    [Tip] Tip

    You often do not need to specify the driver-class-name , since Spring Boot can deduce it for most databases from the url .

    [Note] Note

    For a pooling DataSource to be created, we need to be able to verify that a valid Driver class is available, so we check for that before doing anything. In other words, if you set spring.datasource.driver-class-name=com.mysql.jdbc.Driver then that class has to be loadable.

    See DataSourceProperties for more of the supported options. These are the standard options that work regardless of the actual implementation. It is also possible to fine-tune implementation-specific settings using their respective prefix ( spring.datasource.hikari.* , spring.datasource.tomcat.* , and spring.datasource.dbcp2.* ). Refer to the documentation of the connection pool implementation you are using for more details.

    For instance, if you use the Tomcat connection pool , you could customize many additional settings:

    # Number of ms to wait before throwing an exception if no connection is available.
    spring.datasource.tomcat.max-wait=10000
    # Maximum number of active connections that can be allocated from this pool at the same time.
    spring.datasource.tomcat.max-active=50
    # Validate the connection before borrowing it from the pool.
    spring.datasource.tomcat.test-on-borrow=true

    The Java Persistence API is a standard technology that lets you ‘map’ objects to relational databases. The spring-boot-starter-data-jpa POM provides a quick way to get started. It provides the following key dependencies:

    [Tip] Tip

    We do not go into too many details of JPA or Spring Data here. You can follow the ‘Accessing Data with JPA’ guide from spring.io and read the Spring Data JPA and Hibernate reference documentation.

    Spring Data JPA repositories are interfaces that you can define to access data. JPA queries are created automatically from your method names. For example, a CityRepository interface might declare a findAllByState(String state) method to find all the cities in a given state.

    For more complex queries, you can annotate your method with Spring Data’s Query annotation.

    Spring Data repositories usually extend from the Repository or CrudRepository interfaces. If you use auto-configuration, repositories are searched from the package containing your main configuration class (the one annotated with @EnableAutoConfiguration or @SpringBootApplication ) down.

    The following example shows a typical Spring Data repository interface definition:

    package com.example.myapp.domain;
    import org.springframework.data.domain.*;
    import org.springframework.data.repository.*;
    public interface CityRepository extends Repository<City, Long> {
    	Page<City> findAll(Pageable pageable);
    	City findByNameAndCountryAllIgnoringCase(String name, String country);
    }
    [Tip] Tip

    We have barely scratched the surface of Spring Data JPA. For complete details, see the Spring Data JPA reference documentation .

    If you are running a web application, Spring Boot by default registers OpenEntityManagerInViewInterceptor to apply the "Open EntityManager in View" pattern, to allow for lazy loading in web views. If you do not want this behavior, you should set spring.jpa.open-in-view to false in your application.properties .

    The H2 database provides a browser-based console that Spring Boot can auto-configure for you. The console is auto-configured when the following conditions are met:

    [Tip] Tip

    If you are not using Spring Boot’s developer tools but would still like to make use of H2’s console, you can configure the spring.h2.console.enabled property with a value of true . The H2 console is only intended for use during development, so you should take care to ensure that spring.h2.console.enabled is not set to true in production.

    Java Object Oriented Querying ( jOOQ ) is a popular product from Data Geekery which generates Java code from your database and lets you build type-safe SQL queries through its fluent API. Both the commercial and open source editions can be used with Spring Boot.

    In order to use jOOQ type-safe queries, you need to generate Java classes from your database schema. You can follow the instructions in the jOOQ user manual . If you use the jooq-codegen-maven plugin and you also use the spring-boot-starter-parent “parent POM”, you can safely omit the plugin’s <version> tag. You can also use Spring Boot-defined version variables (such as h2.version ) to declare the plugin’s database dependency. The following listing shows an example:

    <plugin>
    	<groupId>org.jooq</groupId>
    	<artifactId>jooq-codegen-maven</artifactId>
    	<executions>
    	</executions>
    	<dependencies>
    		<dependency>
    			<groupId>com.h2database</groupId>
    			<artifactId>h2</artifactId>
    			<version>${h2.version}</version>
    		</dependency>
    	</dependencies>
    	<configuration>
    			<driver>org.h2.Driver</driver>
    			<url>jdbc:h2:~/yourdatabase</url>
    		</jdbc>
    		<generator>
    		</generator>
    	</configuration>
    </plugin>

    Spring Data provides additional projects that help you access a variety of NoSQL technologies, including: MongoDB , Neo4J , Elasticsearch , Solr , Redis , Gemfire , Cassandra , Couchbase and LDAP . Spring Boot provides auto-configuration for Redis, MongoDB, Neo4j, Elasticsearch, Solr Cassandra, Couchbase, and LDAP. You can make use of the other projects, but you must configure them yourself. Refer to the appropriate reference documentation at projects.spring.io/spring-data .

    30.1 Redis

    Redis is a cache, message broker, and richly-featured key-value store. Spring Boot offers basic auto-configuration for the Lettuce and Jedis client libraries and the abstractions on top of them provided by Spring Data Redis .

    There is a spring-boot-starter-data-redis ‘Starter’ for collecting the dependencies in a convenient way. By default, it uses Lettuce . That starter handles both traditional and reactive applications.

    [Tip] Tip

    we also provide a spring-boot-starter-data-redis-reactive ‘Starter’ for consistency with the other stores with reactive support.

    MongoDB is an open-source NoSQL document database that uses a JSON-like schema instead of traditional table-based relational data. Spring Boot offers several conveniences for working with MongoDB, including the spring-boot-starter-data-mongodb and spring-boot-starter-data-mongodb-reactive ‘Starters’.

    To access Mongo databases, you can inject an auto-configured org.springframework.data.mongodb.MongoDbFactory . By default, the instance tries to connect to a MongoDB server at mongodb://localhost/test The following example shows how to connect to a MongoDB database:

    import org.springframework.data.mongodb.MongoDbFactory;
    import com.mongodb.DB;
    @Component
    public class MyBean {
    	private final MongoDbFactory mongo;
    	@Autowired
    	public MyBean(MongoDbFactory mongo) {
    		this.mongo = mongo;
    	// ...
    	public void example() {
    		DB db = mongo.getDb();
    		// ...
    }

    You can set the spring.data.mongodb.uri property to change the URL and configure additional settings such as the replica set , as shown in the following example:

    spring.data.mongodb.uri=mongodb://user:[email protected]:12345,mongo2.example.com:23456/test

    Alternatively, as long as you use Mongo 2.x, you can specify a host / port . For example, you might declare the following settings in your application.properties :

    spring.data.mongodb.host=mongoserver
    spring.data.mongodb.port=27017
    [Note] Note

    If you use the Mongo 3.0 Java driver, spring.data.mongodb.host and spring.data.mongodb.port are not supported. In such cases, spring.data.mongodb.uri should be used to provide all of the configuration.

    [Tip] Tip

    If spring.data.mongodb.port is not specified, the default of 27017 is used. You could delete this line from the example shown earlier.

    [Tip] Tip

    If you do not use Spring Data Mongo, you can inject com.mongodb.Mongo beans instead of using MongoDbFactory . You can also declare your own MongoDbFactory or Mongo bean if you want to take complete control of establishing the MongoDB connection.

    Spring Data Mongo provides a MongoTemplate class that is very similar in its design to Spring’s JdbcTemplate . As with JdbcTemplate , Spring Boot auto-configures a bean for you to inject the template, as follows:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.mongodb.core.MongoTemplate;
    import org.springframework.stereotype.Component;
    @Component
    public class MyBean {
    	private final MongoTemplate mongoTemplate;
    	@Autowired
    	public MyBean(MongoTemplate mongoTemplate) {
    		this.mongoTemplate = mongoTemplate;
    	// ...
    }

    See the MongoOperations Javadoc for complete details.

    Spring Boot offers auto-configuration for Embedded Mongo . To use it in your Spring Boot application, add a dependency on de.flapdoodle.embed:de.flapdoodle.embed.mongo .

    The port that Mongo listens on can be configured by setting the spring.data.mongodb.port property. To use a randomly allocated free port, use a value of 0. The MongoClient created by MongoAutoConfiguration is automatically configured to use the randomly allocated port.

    [Note] Note

    If you do not configure a custom port, the embedded support uses a random port (rather than 27017) by default.

    If you have SLF4J on the classpath, the output produced by Mongo is automatically routed to a logger named org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongo .

    You can declare your own IMongodConfig and IRuntimeConfig beans to take control of the Mongo instance’s configuration and logging routing.

    Neo4j is an open-source NoSQL graph database that uses a rich data model of nodes related by first class relationships, which is better suited for connected big data than traditional rdbms approaches. Spring Boot offers several conveniences for working with Neo4j, including the spring-boot-starter-data-neo4j ‘Starter’.

    Spring Data Gemfire provides convenient Spring-friendly tools for accessing the Pivotal Gemfire data management platform. There is a spring-boot-starter-data-gemfire ‘Starter’ for collecting the dependencies in a convenient way. There is currently no auto-configuration support for Gemfire, but you can enable Spring Data Repositories with a single annotation: @EnableGemfireRepositories .

    30.5 Solr

    Apache Solr is a search engine. Spring Boot offers basic auto-configuration for the Solr 5 client library and the abstractions on top of it provided by Spring Data Solr . There is a spring-boot-starter-data-solr ‘Starter’ for collecting the dependencies in a convenient way.

    You can inject an auto-configured SolrClient instance as you would any other Spring bean. By default, the instance tries to connect to a server at localhost:8983/solr . The following example shows how to inject a Solr bean:

    @Component
    public class MyBean {
    	private SolrClient solr;
    	@Autowired
    	public MyBean(SolrClient solr) {
    		this.solr = solr;
    	// ...
    }

    If you add your own @Bean of type SolrClient , it replaces the default.

    Elasticsearch is an open source, distributed, real-time search and analytics engine. Spring Boot offers basic auto-configuration for Elasticsearch and the abstractions on top of it provided by Spring Data Elasticsearch . There is a spring-boot-starter-data-elasticsearch ‘Starter’ for collecting the dependencies in a convenient way. Spring Boot also supports Jest .

    If you have Jest on the classpath, you can inject an auto-configured JestClient targeting localhost:9200 by default. You can further tune how the client is configured, as shown in the following example:

    spring.elasticsearch.jest.uris=http://search.example.com:9200
    spring.elasticsearch.jest.read-timeout=10000
    spring.elasticsearch.jest.username=user
    spring.elasticsearch.jest.password=secret

    You can also register an arbitrary number of beans that implement HttpClientConfigBuilderCustomizer for more advanced customizations. The following example tunes additional HTTP settings:

    static class HttpSettingsCustomizer implements HttpClientConfigBuilderCustomizer {
    	@Override
    	public void customize(HttpClientConfig.Builder builder) {
    		builder.maxTotalConnection(100).defaultMaxTotalConnectionPerRoute(5);
    }

    To take full control over the registration, define a JestClient bean.

    Cassandra is an open source, distributed database management system designed to handle large amounts of data across many commodity servers. Spring Boot offers auto-configuration for Cassandra and the abstractions on top of it provided by Spring Data Cassandra . There is a spring-boot-starter-data-cassandra ‘Starter’ for collecting the dependencies in a convenient way.

    Couchbase is an open-source, distributed multi-model NoSQL document-oriented database that is optimized for interactive applications. Spring Boot offers auto-configuration for Couchbase and the abstractions on top of it provided by Spring Data Couchbase . There are a spring-boot-starter-data-couchbase and spring-boot-starter-data-couchbase-reactive ‘Starters’ for collecting the dependencies in a convenient way.

    Spring Data includes repository support for Couchbase. For complete details of Spring Data Couchbase, refer to the reference documentation .

    You can inject an auto-configured CouchbaseTemplate instance as you would with any other Spring Bean, provided a default CouchbaseConfigurer is available (which happens when you enable Couchbase support, as explained earlier).

    The following examples shows how to inject a Couchbase bean:

    @Component
    public class MyBean {
    	private final CouchbaseTemplate template;
    	@Autowired
    	public MyBean(CouchbaseTemplate template) {
    		this.template = template;
    	// ...
    }

    There are a few beans that you can define in your own configuration to override those provided by the auto-configuration:

    • A CouchbaseTemplate @Bean with a name of couchbaseTemplate .
    • An IndexManager @Bean with a name of couchbaseIndexManager .
    • A CustomConversions @Bean with a name of couchbaseCustomConversions .

    To avoid hard-coding those names in your own config, you can reuse BeanNames provided by Spring Data Couchbase. For instance, you can customize the converters to use as follows:

    @Configuration
    public class SomeConfiguration {
    	@Bean(BeanNames.COUCHBASE_CUSTOM_CONVERSIONS)
    	public CustomConversions myCustomConversions() {
    		return new CustomConversions(...);
    	// ...
    }
    [Tip] Tip

    If you want to fully bypass the auto-configuration for Spring Data Couchbase, provide your own implementation of org.springframework.data.couchbase.config.AbstractCouchbaseDataConfiguration .

    LDAP (Lightweight Directory Access Protocol) is an open, vendor-neutral, industry standard application protocol for accessing and maintaining distributed directory information services over an IP network. Spring Boot offers auto-configuration for any compliant LDAP server as well as support for the embedded in-memory LDAP server from UnboundID .

    LDAP abstractions are provided by Spring Data LDAP . There is a spring-boot-starter-data-ldap ‘Starter’ for collecting the dependencies in a convenient way.

    Spring Data includes repository support for LDAP. For complete details of Spring Data LDAP, refer to the reference documentation .

    You can also inject an auto-configured LdapTemplate instance as you would with any other Spring Bean, as shown in the following example:

    @Component
    public class MyBean {
    	private final LdapTemplate template;
    	@Autowired
    	public MyBean(LdapTemplate template) {
    		this.template = template;
    	// ...
    }

    For testing purposes Spring Boot supports auto-configuration of an in-memory LDAP server from UnboundID . To configure the server add a dependency to com.unboundid:unboundid-ldapsdk and declare a base-dn property:

    spring.ldap.embedded.base-dn=dc=spring,dc=io

    By default, the server starts on a random port and triggers the regular LDAP support. There is no need to specify a spring.ldap.urls property.

    If there is a schema.ldif file on your classpath, it is used to initialize the server. If you want to load the initialization script from a different resource, you can also use the spring.ldap.embedded.ldif property.

    By default, a standard schema is used to validate LDIF files, you can turn off validation altogether using the spring.ldap.embedded.validation.enabled property. If you have custom attributes, you can use spring.ldap.embedded.validation.schema to define your custom attribute types or object classes.

    The Spring Framework provides support for transparently adding caching to an application. At its core, the abstraction applies caching to methods, thus reducing the number of executions based on the information available in the cache. The caching logic is applied transparently, without any interference to the invoker. Spring Boot auto-configures the cache infrastructure as long as caching support is enabled via the @EnableCaching annotation.

    [Note] Note

    Check the relevant section of the Spring Framework reference for more details.

    In a nutshell, adding caching to an operation of your service is as easy as adding the relevant annotation to its method, as shown in the following example:

       import org.springframework.cache.annotation.Cacheable
    import org.springframework.stereotype.Component;
    @Component
    public class MathService {
    	@Cacheable("piDecimals")
    	public int computePiDecimal(int i) {
    		// ...
    }

    This example demonstrates the use of caching on a potentially costly operation. Before invoking computePiDecimal , the abstraction looks for an entry in the piDecimals cache that matches the i argument. If an entry is found, the content in the cache is immediately returned to the caller, and the method is not invoked. Otherwise, the method is invoked, and the cache is updated before returning the value.

    [Caution] Caution

    You can also use the standard JSR-107 (JCache) annotations (such as @CacheResult ) transparently. However, we strongly advise you to not mix and match the Spring Cache and JCache annotations.

    If you do not add any specific cache library, Spring Boot auto-configures a simple provider that uses concurrent maps in memory. When a cache is required (such as piDecimals in the preceding example), this provider creates it for you. The simple provider is not really recommended for production usage, but it is great for getting started and making sure that you understand the features. When you have made up your mind about the cache provider to use, please make sure to read its documentation to figure out how to configure the caches that your application uses. Nearly all providers require you to explicitly configure every cache that you use in the application. Some offer a way to customize the default caches defined by the spring.cache.cache-names property.

    [Tip] Tip

    It is also possible to transparently update or evict data from the cache.

    [Note] Note

    If you use the cache infrastructure with beans that are not interface-based, make sure to enable the proxyTargetClass attribute of @EnableCaching .

    The cache abstraction does not provide an actual store and relies on abstraction materialized by the org.springframework.cache.Cache and org.springframework.cache.CacheManager interfaces.

    If you have not defined a bean of type CacheManager or a CacheResolver named cacheResolver (see CachingConfigurer ), Spring Boot tries to detect the following providers (in the indicated order):

    [Tip] Tip

    It is also possible to force a particular cache provider by setting the spring.cache.type property. Use this property if you need to disable caching altogether in certain environment (such as tests).

    [Tip] Tip

    Use the spring-boot-starter-cache ‘Starter’ to quickly add basic caching dependencies. The starter brings in spring-context-support . If you add dependencies manually, you must include spring-context-support in order to use the JCache, EhCache 2.x, or Guava support.

    If the CacheManager is auto-configured by Spring Boot, you can further tune its configuration before it is fully initialized by exposing a bean that implements the CacheManagerCustomizer interface. The following example sets a flag to say that null values should be passed down to the underlying map:

    @Bean
    public CacheManagerCustomizer<ConcurrentMapCacheManager> cacheManagerCustomizer() {
    	return new CacheManagerCustomizer<ConcurrentMapCacheManager>() {
    		@Override
    		public void customize(ConcurrentMapCacheManager cacheManager) {
    			cacheManager.setAllowNullValues(false);
    }
    [Note] Note

    In the example above, an auto-configured ConcurrentMapCacheManager is expected. If that is not the case (either you provided your own config or a different cache provider was auto-configured), the customizer is not invoked at all. You can have as many customizers as you want, and you can also order them as usual by using @Order or Ordered .

    JCache is bootstrapped via the presence of a javax.cache.spi.CachingProvider on the classpath (that is, a JSR-107 compliant caching library exists on the classpath) and the JCacheCacheManager provided by the spring-boot-starter-cache ‘Starter’. Various compliant libraries are available, and Spring Boot provides dependency management for Ehcache 3, Hazelcast, and Infinispan. Any other compliant library can be added as well.

    It might happen that more than one provider is present, in which case the provider must be explicitly specified. Even if the JSR-107 standard does not enforce a standardized way to define the location of the configuration file, Spring Boot does its best to accommodate setting a cache with implementation details, as shown in the following example:

       # Only necessary if more than one provider is present
    spring.cache.jcache.provider=com.acme.MyCachingProvider
    spring.cache.jcache.config=classpath:acme.xml
    [Note] Note

    When a cache library offers both a native implementation and JSR-107 support, Spring Boot prefers the JSR-107 support, so that the same features are available if you switch to a different JSR-107 implementation.

    [Tip] Tip

    Spring Boot has general support for Hazelcast . If a single HazelcastInstance is available, it is automatically reused for the CacheManager as well, unless the spring.cache.jcache.config property is specified.

    There are two ways to customize the underlying javax.cache.cacheManager :

    [Tip] Tip

    If a standard javax.cache.CacheManager bean is defined, it is wrapped automatically in an org.springframework.cache.CacheManager implementation that the abstraction expects. No further customization is applied to it.

    Spring Boot has general support for Hazelcast . If a HazelcastInstance has been auto-configured, it is automatically wrapped in a CacheManager .

    If the Couchbase Java client and the couchbase-spring-cache implementation are available and Couchbase is configured , a CouchbaseCacheManager is auto-configured. It is also possible to create additional caches on startup by setting the spring.cache.cache-names property. These caches operate on the Bucket that was auto-configured. You can also create additional caches on another Bucket by using the customizer. Assume you need two caches ( cache1 and cache2 ) on the "main" Bucket and one cache3 cache with a custom time to live of 2 seconds on the "another" Bucket . You can create the first two caches through configuration, as follows:

    spring.cache.cache-names=cache1,cache2

    Then you can define a @Configuration class to configure the extra Bucket and the cache3 cache, as follows:

    @Configuration
    public class CouchbaseCacheConfiguration {
    	private final Cluster cluster;
    	public CouchbaseCacheConfiguration(Cluster cluster) {
    		this.cluster = cluster;
    	@Bean
    	public Bucket anotherBucket() {
    		return this.cluster.openBucket("another", "secret");
    	@Bean
    	public CacheManagerCustomizer<CouchbaseCacheManager> cacheManagerCustomizer() {
    		return c -> {
    			c.prepareCache("cache3", CacheBuilder.newInstance(anotherBucket())
    					.withExpiration(2));
    }

    This sample configuration reuses the Cluster that was created via auto-configuration.

    The Spring Framework provides extensive support for integrating with messaging systems, from simplified use of the JMS API using JmsTemplate to a complete infrastructure to receive messages asynchronously. Spring AMQP provides a similar feature set for the ‘Advanced Message Queuing Protocol’. Spring Boot also provides auto-configuration options for RabbitTemplate and RabbitMQ. Spring WebSocket natively includes support for STOMP messaging, and Spring Boot has support for that through starters and a small amount of auto-configuration. Spring Boot also has support for Apache Kafka.

    The javax.jms.ConnectionFactory interface provides a standard method of creating a javax.jms.Connection for interacting with a JMS broker. Although Spring needs a ConnectionFactory to work with JMS, you generally need not use it directly yourself and can instead rely on higher level messaging abstractions. (See the relevant section of the Spring Framework reference documentation for details.) Spring Boot also auto-configures the necessary infrastructure to send and receive messages.

    Spring Boot can auto-configure a ConnectionFactory when it detects that Artemis is available on the classpath. If the broker is present, an embedded broker is automatically started and configured (unless the mode property has been explicitly set). The supported modes are embedded (to make explicit that an embedded broker is required and that an error should occur if the broker is not available on the classpath) and native (to connect to a broker using the netty transport protocol). When the latter is configured, Spring Boot configures a ConnectionFactory that connects to a broker running on the local machine with the default settings.

    [Note] Note

    If you are using spring-boot-starter-artemis , the necessary dependencies to connect to an existing Artemis instance are provided, as well as the Spring infrastructure to integrate with JMS. Adding org.apache.activemq:artemis-jms-server to your application lets you use embedded mode.

    Artemis configuration is controlled by external configuration properties in spring.artemis.* . For example, you might declare the following section in application.properties :

    spring.artemis.mode=native
    spring.artemis.host=192.168.1.210
    spring.artemis.port=9876
    spring.artemis.user=admin
    spring.artemis.password=secret

    When embedding the broker, you can choose if you want to enable persistence and list the destinations that should be made available. These can be specified as a comma-separated list to create them with the default options, or you can define bean(s) of type org.apache.activemq.artemis.jms.server.config.JMSQueueConfiguration or org.apache.activemq.artemis.jms.server.config.TopicConfiguration , for advanced queue and topic configurations, respectively.

    See ArtemisProperties for more supported options.

    No JNDI lookup is involved, and destinations are resolved against their names, using either the ‘name’ attribute in the Artemis configuration or the names provided through configuration.

    When the JMS infrastructure is present, any bean can be annotated with @JmsListener to create a listener endpoint. If no JmsListenerContainerFactory has been defined, a default one is configured automatically. If a DestinationResolver or a MessageConverter beans is defined, it is associated automatically to the default factory.

    By default, the default factory is transactional. If you run in an infrastructure where a JtaTransactionManager is present, it is associated to the listener container by default. If not, the sessionTransacted flag is enabled. In that latter scenario, you can associate your local data store transaction to the processing of an incoming message by adding @Transactional on your listener method (or a delegate thereof). This ensures that the incoming message is acknowledged, once the local transaction has completed. This also includes sending response messages that have been performed on the same JMS session.

    The following component creates a listener endpoint on the someQueue destination:

    @Component
    public class MyBean {
    	@JmsListener(destination = "someQueue")
    	public void processMessage(String content) {
    		// ...
    }
    [Tip] Tip

    See the Javadoc of @EnableJms for more details.

    If you need to create more JmsListenerContainerFactory instances or if you want to override the default, Spring Boot provides a DefaultJmsListenerContainerFactoryConfigurer that you can use to initialize a DefaultJmsListenerContainerFactory with the same settings as the one that is auto-configured.

    For instance, the following example exposes another factory that uses a specific MessageConverter :

    @Configuration
    static class JmsConfiguration {
    	@Bean
    	public DefaultJmsListenerContainerFactory myFactory(
    			DefaultJmsListenerContainerFactoryConfigurer configurer) {
    		DefaultJmsListenerContainerFactory factory =
    				new DefaultJmsListenerContainerFactory();
    		configurer.configure(factory, connectionFactory());
    		factory.setMessageConverter(myMessageConverter());
    		return factory;
    }

    Then you can use the factory in any @JmsListener -annotated method as follows:

    @Component
    public class MyBean {
    	@JmsListener(destination = "someQueue", containerFactory="myFactory")
    	public void processMessage(String content) {
    		// ...
    }

    The Advanced Message Queuing Protocol (AMQP) is a platform-neutral, wire-level protocol for message-oriented middleware. The Spring AMQP project applies core Spring concepts to the development of AMQP-based messaging solutions. Spring Boot offers several conveniences for working with AMQP through RabbitMQ, including the spring-boot-starter-amqp ‘Starter’.

    When the Rabbit infrastructure is present, any bean can be annotated with @RabbitListener to create a listener endpoint. If no RabbitListenerContainerFactory has been defined, a default SimpleRabbitListenerContainerFactory is automatically configured and you can switch to a direct container using the spring.rabbitmq.listener.type property. If a MessageConverter or a MessageRecoverer bean is defined, it is automatically associated with the default factory.

    The following sample component creates a listener endpoint on the someQueue queue:

    @Component
    public class MyBean {
    	@RabbitListener(queues = "someQueue")
    	public void processMessage(String content) {
    		// ...
    }
    [Tip] Tip

    See the Javadoc of @EnableRabbit for more details.

    If you need to create more RabbitListenerContainerFactory instances or if you want to override the default, Spring Boot provides a SimpleRabbitListenerContainerFactoryConfigurer and a DirectRabbitListenerContainerFactoryConfigurer that you can use to initialize a SimpleRabbitListenerContainerFactory and a DirectRabbitListenerContainerFactory with the same settings as the factories used by the auto-configuration.

    [Tip] Tip

    It does not matter which container type you chose. Those two beans are exposed by the auto-configuration.

    For instance, the following configuration class exposes another factory that uses a specific MessageConverter :

    @Configuration
    static class RabbitConfiguration {
    	@Bean
    	public SimpleRabbitListenerContainerFactory myFactory(
    			SimpleRabbitListenerContainerFactoryConfigurer configurer) {
    		SimpleRabbitListenerContainerFactory factory =
    				new SimpleRabbitListenerContainerFactory();
    		configurer.configure(factory, connectionFactory);
    		factory.setMessageConverter(myMessageConverter());
    		return factory;
    }

    Then you can use the factory in any @RabbitListener -annotated method as follows:

    @Component
    public class MyBean {
    	@RabbitListener(queues = "someQueue", containerFactory="myFactory")
    	public void processMessage(String content) {
    		// ...
    }

    You can enable retries to handle situations where your listener throws an exception. By default, RejectAndDontRequeueRecoverer is used, but you can define a MessageRecoverer of your own. When retries are exhausted, the message is rejected and either dropped or routed to a dead-letter exchange if the broker is configured to do so. By default, retries are disabled.

    [Important] Important

    By default, if retries are disabled and the listener throws an exception, the delivery is retried indefinitely. You can modify this behavior in two ways: Set the defaultRequeueRejected property to false so that zero re-deliveries are attempted or throw an AmqpRejectAndDontRequeueException to signal the message should be rejected. The latter is the mechanism used when retries are enabled and the maximum delivery attempts are reached.

    Apache Kafka is supported by providing auto-configuration of the spring-kafka project.

    Kafka configuration is controlled by external configuration properties in spring.kafka.* . For example, you might declare the following section in application.properties :

    spring.kafka.bootstrap-servers=localhost:9092
    spring.kafka.consumer.group-id=myGroup
    [Tip] Tip

    To create a topic on startup, add a bean of type NewTopic . If the topic already exists, the bean is ignored.

    See KafkaProperties for more supported options.

    The properties supported by auto configuration are shown in Appendix A, Common application properties . Note that, for the most part, these properties (hyphenated or camelCase) map directly to the Apache Kafka dotted properties. Refer to the Apache Kafka documentation for details.

    The first few of these properties apply to both producers and consumers but can be specified at the producer or consumer level if you wish to use different values for each. Apache Kafka designates properties with an importance of HIGH, MEDIUM, or LOW. Spring Boot auto-configuration supports all HIGH importance properties, some selected MEDIUM and LOW properties, and any properties that do not have a default value.

    Only a subset of the properties supported by Kafka are available through the KafkaProperties class. If you wish to configure the producer or consumer with additional properties that are not directly supported, use the following properties:

    spring.kafka.properties.foo.bar=baz
    spring.kafka.consumer.properties.fiz.buz=qux
    spring,kafka.producer.properties.baz.qux=fiz

    This sets the common foo.bar Kafka property to baz (applies to both producers and consumers), the consumer fiz.buz property to qux and the baz.qux producer property to fiz .

    [Important] Important

    Properties set in this way override any configuration item that Spring Boot explicitly supports.

    If you need to call remote REST services from your application, you can use the Spring Framework’s RestTemplate class. Since RestTemplate instances often need to be customized before being used, Spring Boot does not provide any single auto-configured RestTemplate bean. It does, however, auto-configure a RestTemplateBuilder , which can be used to create RestTemplate instances when needed. The auto-configured RestTemplateBuilder ensures that sensible HttpMessageConverters are applied to RestTemplate instances.

    The following code shows a typical example:

    @Service
    public class MyService {
    	private final RestTemplate restTemplate;
    	public MyBean(RestTemplateBuilder restTemplateBuilder) {
    		this.restTemplate = restTemplateBuilder.build();
    	public Details someRestCall(String name) {
    		return this.restTemplate.getForObject("/{name}/details", Details.class, name);
    }
    [Tip] Tip

    RestTemplateBuilder includes a number of useful methods that can be used to quickly configure a RestTemplate . For example, to add BASIC auth support you can use builder.basicAuthorization("user", "password").build() .

    There are three main approaches to RestTemplate customization, depending on how broadly you want the customizations to apply.

    To make the scope of any customizations as narrow as possible, inject the auto-configured RestTemplateBuilder and then call its methods as required. Each method call returns a new RestTemplateBuilder instance, so the customizations only affect this use of the builder.

    To make an application-wide, additive customization, use a RestTemplateCustomizer bean. All such beans are automatically registered with the auto-configured RestTemplateBuilder and are applied to any templates that are built with it.

    The following example shows a customizer that configures the use of a proxy for all hosts except 192.168.0.5 :

    static class ProxyCustomizer implements RestTemplateCustomizer {
    	@Override
    	public void customize(RestTemplate restTemplate) {
    		HttpHost proxy = new HttpHost("proxy.example.com");
    		HttpClient httpClient = HttpClientBuilder.create()
    				.setRoutePlanner(new DefaultProxyRoutePlanner(proxy) {
    					@Override
    					public HttpHost determineProxy(HttpHost target,
    							HttpRequest request, HttpContext context)
    									throws HttpException {
    						if (target.getHostName().equals("192.168.0.5")) {
    							return null;
    						return super.determineProxy(target, request, context);
    				}).build();
    		restTemplate.setRequestFactory(
    				new HttpComponentsClientHttpRequestFactory(httpClient));
    }

    Finally, the most extreme (and rarely used) option is to create your own RestTemplateBuilder bean. Doing so switches off the auto-configuration of a RestTemplateBuilder and prevents any RestTemplateCustomizer beans from being used.

    If you have Spring WebFlux on your classpath, you can also choose to use WebClient to call remote REST services, Compared to RestTemplate , this client has a more functional feel and is fully reactive. You can create your own client instance with the builder, WebClient.create() . See the relevant section on WebClient .

    Spring Boot creates and pre-configures such a builder for you. For example, client HTTP codecs are configured in the same fashion as the server ones (see WebFlux HTTP codecs auto-configuration ).

    The following code shows a typical example:

    @Service
    public class MyService {
    	private final WebClient webClient;
    	public MyBean(WebClient.Builder webClientBuilder) {
    		this.webClient = webClientBuilder.baseUrl("http://example.org").build();
    	public Mono<Details> someRestCall(String name) {
    		return this.webClient.get().url("/{name}/details", name)
    						.retrieve().bodyToMono(Details.class);
    }

    The Spring Framework provides an easy abstraction for sending email by using the JavaMailSender interface, and Spring Boot provides auto-configuration for it as well as a starter module.

    [Tip] Tip

    See the reference documentation for a detailed explanation of how you can use JavaMailSender .

    If spring.mail.host and the relevant libraries (as defined by spring-boot-starter-mail ) are available, a default JavaMailSender is created if none exists. The sender can be further customized by configuration items from the spring.mail namespace, see MailProperties for more details.

    In particular, certain default timeout values are infinite, and you may want to change that to avoid having a thread blocked by an unresponsive mail server, as shown in the following example:

    spring.mail.properties.mail.smtp.connectiontimeout=5000
    spring.mail.properties.mail.smtp.timeout=3000
    spring.mail.properties.mail.smtp.writetimeout=5000

    Spring Boot supports distributed JTA transactions across multiple XA resources by using either an Atomikos or Bitronix embedded transaction manager. JTA transactions are also supported when deploying to a suitable Java EE Application Server.

    When a JTA environment is detected, Spring’s JtaTransactionManager is used to manage transactions. Auto-configured JMS, DataSource, and JPA beans are upgraded to support XA transactions. You can use standard Spring idioms, such as @Transactional , to participate in a distributed transaction. If you are within a JTA environment and still want to use local transactions, you can set the spring.jta.enabled property to false to disable the JTA auto-configuration.

    The XAConnectionFactoryWrapper and XADataSourceWrapper interfaces can be used to support alternative embedded transaction managers. The interfaces are responsible for wrapping XAConnectionFactory and XADataSource beans and exposing them as regular ConnectionFactory and DataSource beans, which transparently enroll in the distributed transaction. DataSource and JMS auto-configuration use JTA variants, provided you have a JtaTransactionManager bean and appropriate XA wrapper beans registered within your ApplicationContext .

    The BitronixXAConnectionFactoryWrapper and BitronixXADataSourceWrapper provide good examples of how to write XA wrappers.

    Spring Boot offers several conveniences for working with the Quartz scheduler, including the spring-boot-starter-quartz ‘Starter’. If Quartz is available, a Scheduler is auto-configured (via the SchedulerFactoryBean abstraction).

    Beans of the following types are automatically picked up and associated with the Scheduler :

    By default, an in-memory JobStore is used. However, it is possible to configure a JDBC-based store if a DataSource bean is available in your application and if the spring.quartz.job-store-type property is configured accordingly, as shown in the following example:

    spring.quartz.job-store-type=jdbc

    When the jdbc store is used, the schema can be initialized on startup, as shown in the following example:

    spring.quartz.jdbc.initialize-schema=true
    [Note] Note

    By default, the database is detected and initialized by using the standard scripts provided with the Quartz library. It is also possible to provide a custom script by setting the spring.quartz.jdbc.schema property.

    Quartz Scheduler configuration can be customized by using Quartz configuration properties () spring.quartz.properties.* ) and SchedulerFactoryBeanCustomizer beans, which allow programmatic SchedulerFactoryBean customization.

    Jobs can define setters to inject data map properties. Regular beans can also be injected in a similar manner, as shown in the following example:

    public class SampleJob extends QuartzJobBean {
    	private MyService myService;
    	private String name;
    	// Inject "MyService" bean
    	public void setMyService(MyService myService) { ... }
    	// Inject the "name" job data property
    	public void setName(String name) { ... }
    	@Override
    	protected void executeInternal(JobExecutionContext context)
    			throws JobExecutionException {
    }

    Spring Boot provides Spring Session auto-configuration for a wide range of data stores. When building a Servlet web application, the following stores can be auto-configured:

    When building a reactive web application, the following stores can be auto-configured:

    If Spring Session is available, you must choose the StoreType that you wish to use to store the sessions. For instance, to use JDBC as the back-end store, you can configure your application as follows:

    spring.session.store-type=jdbc
    [Tip] Tip

    You can disable Spring Session by setting the store-type to none .

    Each store has specific additional settings. For instance, it is possible to customize the name of the table for the JDBC store, as shown in the following example:

    spring.session.jdbc.table-name=SESSIONS

    Spring Boot provides a number of utilities and annotations to help when testing your application. Test support is provided by two modules; spring-boot-test contains core items, and spring-boot-test-autoconfigure supports auto-configuration for tests.

    Most developers use the spring-boot-starter-test ‘Starter’, which imports both Spring Boot test modules as well as JUnit, AssertJ, Hamcrest, and a number of other useful libraries.

    The spring-boot-starter-test ‘Starter’ (in the test scope )contains the following provided libraries:

    • JUnit : The de-facto standard for unit testing Java applications.
    • Spring Test & Spring Boot Test: Utilities and integration test support for Spring Boot applications.
    • AssertJ : A fluent assertion library.
    • Hamcrest : A library of matcher objects (also known as constraints or predicates).
    • Mockito : A Java mocking framework.
    • JSONassert : An assertion library for JSON.
    • JsonPath : XPath for JSON.

    We generally find these common libraries to be useful when writing tests. If these libraries do not suit your needs, you can add additional test dependencies of your own.

    A Spring Boot application is a Spring ApplicationContext , so nothing very special has to be done to test it beyond what you would normally do with a vanilla Spring context. One thing to watch out for, though, is that the external properties, logging, and other features of Spring Boot are installed in the context by default only if you use SpringApplication to create it.

    Spring Boot provides a @SpringBootTest annotation, which can be used as an alternative to the standard spring-test @ContextConfiguration annotation when you need Spring Boot features. The annotation works by creating the ApplicationContext used in your tests through SpringApplication .

    You can use the webEnvironment attribute of @SpringBootTest to further refine how your tests run:

    [Note] Note

    If your test is @Transactional , it rolls back the transaction at the end of each test method by default. However, as using this arrangement with either RANDOM_PORT or DEFINED_PORT implicitly provides a real servlet environment, the HTTP client and server run in separate threads and, thus, in separate transactions. Any transaction initiated on the server does not roll back in this case.

    [Note] Note

    In addition to @SpringBootTest , a number of other annotations are also provided for testing more specific slices of an application. You can find more detail later in this document.

    [Tip] Tip

    Do not forget to add @RunWith(SpringRunner.class) to your test. Otherwise, the annotations are ignored.

    If you are familiar with the Spring Test Framework, you may be used to using @ContextConfiguration(classes=…​) in order to specify which Spring @Configuration to load. Alternatively, you might have often used nested @Configuration classes within your test.

    When testing Spring Boot applications, this is often not required. Spring Boot’s @*Test annotations search for your primary configuration automatically whenever you do not explicitly define one.

    The search algorithm works up from the package that contains the test until it finds a class annotated with @SpringBootApplication or @SpringBootConfiguration . As long as you structured your code in a sensible way, your main configuration is usually found.

    [Note] Note

    If you use a annotation to test a more specific slice of your application, you should avoid adding configuration settings that are specific to a particular area on the method’s application class.

    If you want to customize the primary configuration, you can use a nested @TestConfiguration class. Unlike a nested @Configuration class, which would be used instead of your application’s primary configuration, a nested @TestConfiguration class is used in addition to your application’s primary configuration.

    [Note] Note

    Spring’s test framework caches application contexts between tests. Therefore, as long as your tests share the same configuration (no matter how it’s discovered), the potentially time-consuming process of loading the context happens only once.

    If your application uses component scanning, for example if you use @SpringBootApplication or @ComponentScan , you may find top-level configuration classes created only for specific tests accidentally get picked up everywhere.

    As we have seen earlier , @TestConfiguration can be used on an inner class of a test to customize the primary configuration. When placed on a top-level class, @TestConfiguration indicates that classes in src/test/java should not be picked up by scanning. You can then import that class explicitly where it is required, as shown in the following example:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    @Import(MyTestsConfiguration.class)
    public class MyTests {
    	@Test
    	public void exampleTest() {
    }
    [Note] Note

    If you directly use @ComponentScan (that is, not through @SpringBootApplication ) you need to register the TypeExcludeFilter with it. See the Javadoc for details.

    If you need to start a full running server for tests, we recommend that you use random ports. If you use @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT) , an available port is picked at random each time your test runs.

    The @LocalServerPort annotation can be used to inject the actual port used into your test. For convenience, tests that need to make REST calls to the started server can additionally @Autowire a TestRestTemplate , which resolves relative links to the running server, as shown in the following example:

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
    import org.springframework.boot.test.web.client.TestRestTemplate;
    import org.springframework.test.context.junit4.SpringRunner;
    import static org.assertj.core.api.Assertions.assertThat;
    @RunWith(SpringRunner.class)
    @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
    public class RandomPortExampleTests {
    	@Autowired
    	private TestRestTemplate restTemplate;
    	@Test
    	public void exampleTest() {
    		String body = this.restTemplate.getForObject("/", String.class);
    		assertThat(body).isEqualTo("Hello World");
    }

    When running tests, it is sometimes necessary to mock certain components within your application context. For example, you may have a facade over some remote service that is unavailable during development. Mocking can also be useful when you want to simulate failures that might be hard to trigger in a real environment.

    Spring Boot includes a @MockBean annotation that can be used to define a Mockito mock for a bean inside your ApplicationContext . You can use the annotation to add new beans or replace a single existing bean definition. The annotation can be used directly on test classes, on fields within your test, or on @Configuration classes and fields. When used on a field, the instance of the created mock is also injected. Mock beans are automatically reset after each test method.

    [Note] Note

    If your test uses one of Spring Boot’s test annotations (such as @SpringBootTest ), this feature is automatically enabled. To use this feature with a different arrangement, a listener need to be explicitly added, as shown in the following example:

    @TestExecutionListeners(MockitoTestExecutionListener.class)

    The following example replaces an existing RemoteService bean with a mock implementation:

    import org.junit.*;
    import org.junit.runner.*;
    import org.springframework.beans.factory.annotation.*;
    import org.springframework.boot.test.context.*;
    import org.springframework.boot.test.mock.mockito.*;
    import org.springframework.test.context.junit4.*;
    import static org.assertj.core.api.Assertions.*;
    import static org.mockito.BDDMockito.*;
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class MyTests {
    	@MockBean
    	private RemoteService remoteService;
    	@Autowired
    	private Reverser reverser;
    	@Test
    	public void exampleTest() {
    		// RemoteService has been injected into the reverser bean
    		given(this.remoteService.someCall()).willReturn("mock");
    		String reverse = reverser.reverseSomeCall();
    		assertThat(reverse).isEqualTo("kcom");
    }

    Additionally, you can use @SpyBean to wrap any existing bean with a Mockito spy . See the Javadoc for full details.

    To test that object JSON serialization and deserialization is working as expected you can use the @JsonTest annotation. @JsonTest auto-configures the available supported JSON mapper, which can be one of the following libraries:

    If you need to configure elements of the auto-configuration, you can use the @AutoConfigureJsonTesters annotation.

    Spring Boot includes AssertJ-based helpers that work with the JSONassert and JsonPath libraries to check that JSON is as expected. The JacksonTester , GsonTester , JsonbTester , and BasicJsonTester classes can be used for Jackson, Gson, Jsonb, and Strings respectively. Any helper fields on the test class can be @Autowired when using @JsonTest . The following example shows a test class for Jackson:

    import org.junit.*;
    import org.junit.runner.*;
    import org.springframework.beans.factory.annotation.*;
    import org.springframework.boot.test.autoconfigure.json.*;
    import org.springframework.boot.test.context.*;
    import org.springframework.boot.test.json.*;
    import org.springframework.test.context.junit4.*;
    import static org.assertj.core.api.Assertions.*;
    @RunWith(SpringRunner.class)
    @JsonTest
    public class MyJsonTests {
    	@Autowired
    	private JacksonTester<VehicleDetails> json;
    	@Test
    	public void testSerialize() throws Exception {
    		VehicleDetails details = new VehicleDetails("Honda", "Civic");
    		// Assert against a `.json` file in the same package as the test
    		assertThat(this.json.write(details)).isEqualToJson("expected.json");
    		// Or use JSON path based assertions
    		assertThat(this.json.write(details)).hasJsonPathStringValue("@.make");
    		assertThat(this.json.write(details)).extractingJsonPathStringValue("@.make")
    				.isEqualTo("Honda");
    	@Test
    	public void testDeserialize() throws Exception {
    		String content = "{\"make\":\"Ford\",\"model\":\"Focus\"}";
    		assertThat(this.json.parse(content))
    				.isEqualTo(new VehicleDetails("Ford", "Focus"));
    		assertThat(this.json.parseObject(content).getMake()).isEqualTo("Ford");
    }
    [Note] Note

    JSON helper classes can also be used directly in standard unit tests. Simply call the initFields method of the helper in your @Before method if you do not use @JsonTest .

    A list of the auto-configuration that is enabled by @JsonTest can be found in the appendix .

    To test Spring MVC controllers are working as expected, you can use the @WebMvcTest annotation. @WebMvcTest auto-configures the Spring MVC infrastructure and limits scanned beans to @Controller , @ControllerAdvice , @JsonComponent , Converter , GenericConverter , Filter , WebMvcConfigurer , and HandlerMethodArgumentResolver . Regular @Component beans are not scanned when using this annotation.

    [Tip] Tip

    If you need to register extra components such as Jackson Module , you can import additional configuration classes using @Import on your test.

    Often, @WebMvcTest is limited to a single controller and is used in combination with @MockBean to provide mock implementations for required collaborators.

    @WebMvcTest also auto-configures MockMvc . Mock MVC offers a powerful way to quickly test MVC controllers without needing to start a full HTTP server.

    [Tip] Tip

    You can also auto-configure MockMvc in a non- @WebMvcTest (such as @SpringBootTest ) by annotating it with @AutoConfigureMockMvc . The following example uses MockMvc :

    import org.junit.*;
    import org.junit.runner.*;
    import org.springframework.beans.factory.annotation.*;
    import org.springframework.boot.test.autoconfigure.web.servlet.*;
    import org.springframework.boot.test.mock.mockito.*;
    import static org.assertj.core.api.Assertions.*;
    import static org.mockito.BDDMockito.*;
    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
    @RunWith(SpringRunner.class)
    @WebMvcTest(UserVehicleController.class)
    public class MyControllerTests {
    	@Autowired
    	private MockMvc mvc;
    	@MockBean
    	private UserVehicleService userVehicleService;
    	@Test
    	public void testExample() throws Exception {
    		given(this.userVehicleService.getVehicleDetails("sboot"))
    				.willReturn(new VehicleDetails("Honda", "Civic"));
    		this.mvc.perform(get("/sboot/vehicle").accept(MediaType.TEXT_PLAIN))
    				.andExpect(status().isOk()).andExpect(content().string("Honda Civic"));
    }
    [Tip] Tip

    If you need to configure elements of the auto-configuration (for example, when servlet filters should be applied) you can use attributes in the @AutoConfigureMockMvc annotation.

    If you use HtmlUnit or Selenium, auto-configuration also provides an HTMLUnit WebClient bean and/or a WebDriver bean. The following example uses HtmlUnit:

    import com.gargoylesoftware.htmlunit.*;
    import org.junit.*;
    import org.junit.runner.*;
    import org.springframework.beans.factory.annotation.*;
    import org.springframework.boot.test.autoconfigure.web.servlet.*;
    import org.springframework.boot.test.mock.mockito.*;
    import static org.assertj.core.api.Assertions.*;
    import static org.mockito.BDDMockito.*;
    @RunWith(SpringRunner.class)
    @WebMvcTest(UserVehicleController.class)
    public class MyHtmlUnitTests {
    	@Autowired
    	private WebClient webClient;
    	@MockBean
    	private UserVehicleService userVehicleService;
    	@Test
    	public void testExample() throws Exception {
    		given(this.userVehicleService.getVehicleDetails("sboot"))
    				.willReturn(new VehicleDetails("Honda", "Civic"));
    		HtmlPage page = this.webClient.getPage("/sboot/vehicle.html");
    		assertThat(page.getBody().getTextContent()).isEqualTo("Honda Civic");
    }
    [Note] Note

    By default, Spring Boot puts WebDriver beans in a special “scope” to ensure that the driver is quit after each test and that a new instance is injected. If you do not want this behavior, you can add @Scope("singleton") to your WebDriver @Bean definition.

    A list of the auto-configuration settings that are enabled by @WebMvcTest can be found in the appendix .

    To test that Spring WebFlux controllers are working as expected, you can use the @WebFluxTest annotation. @WebFluxTest auto-configures the Spring WebFlux infrastructure and limits scanned beans to @Controller , @ControllerAdvice , @JsonComponent , Converter , GenericConverter , and WebFluxConfigurer . Regular @Component beans are not scanned when the @WebFluxTest annotation is used.

    [Tip] Tip

    If you need to register extra components such as Jackson Module , you can import additional configuration classes using @Import on your test.

    Often, @WebFluxTest is limited to a single controller and used in combination with the @MockBean annotation to provide mock implementations for required collaborators.

    @WebFluxTest also auto-configures WebTestClient , which offers a powerful way to quickly test WebFlux controllers without needing to start a full HTTP server.

    [Tip] Tip

    You can also auto-configure WebTestClient in a non- @WebFluxTest (such as @SpringBootTest ) by annotating it with @AutoConfigureWebTestClient . The following example shows a class that uses both @WebFluxTest and a WebTestClient :

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
    import org.springframework.http.MediaType;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.test.web.reactive.server.WebTestClient;
    @RunWith(SpringRunner.class)
    @WebFluxTest(UserVehicleController.class)
    public class MyControllerTests {
    	@Autowired
    	private WebTestClient webClient;
    	@MockBean
    	private UserVehicleService userVehicleService;
    	@Test
    	public void testExample() throws Exception {
    		given(this.userVehicleService.getVehicleDetails("sboot"))
    				.willReturn(new VehicleDetails("Honda", "Civic"));
    		this.webClient.get().uri("/sboot/vehicle").accept(MediaType.TEXT_PLAIN)
    				.exchange()
    				.expectStatus().isOk()
    				.expectBody(String.class).isEqualTo("Honda Civic");
    }

    A list of the auto-configuration that is enabled by @WebFluxTest can be found in the appendix .

    You can use the @DataJpaTest annotation to test JPA applications. By default, it configures an in-memory embedded database, scans for @Entity classes, and configures Spring Data JPA repositories. Regular @Component beans are not loaded into the ApplicationContext .

    By default, data JPA tests are transactional and roll back at the end of each test. See the relevant section in the Spring Framework Reference Documentation for more details. If that is not what you want, you can disable transaction management for a test or for the whole class as follows:

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.transaction.annotation.Propagation;
    import org.springframework.transaction.annotation.Transactional;
    @RunWith(SpringRunner.class)
    @DataJpaTest
    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public class ExampleNonTransactionalTests {
    }

    Data JPA tests may also inject a TestEntityManager bean, which provides an alternative to the standard JPA EntityManager that is specifically designed for tests. If you want to use TestEntityManager outside of @DataJpaTest instances, you can also use the @AutoConfigureTestEntityManager annotation. A JdbcTemplate is also available if you need that. The following example shows the @DataJpaTest annotation in use:

    import org.junit.*;
    import org.junit.runner.*;
    import org.springframework.boot.test.autoconfigure.orm.jpa.*;
    import static org.assertj.core.api.Assertions.*;
    @RunWith(SpringRunner.class)
    @DataJpaTest
    public class ExampleRepositoryTests {
    	@Autowired
    	private TestEntityManager entityManager;
    	@Autowired
    	private UserRepository repository;
    	@Test
    	public void testExample() throws Exception {
    		this.entityManager.persist(new User("sboot", "1234"));
    		User user = this.repository.findByUsername("sboot");
    		assertThat(user.getUsername()).isEqualTo("sboot");
    		assertThat(user.getVin()).isEqualTo("1234");
    }

    In-memory embedded databases generally work well for tests, since they are fast and do not require any installation. If, however, you prefer to run tests against a real database you can use the @AutoConfigureTestDatabase annotation, as shown in the following example:

    @RunWith(SpringRunner.class)
    @DataJpaTest
    @AutoConfigureTestDatabase(replace=Replace.NONE)
    public class ExampleRepositoryTests {
    	// ...
    }

    A list of the auto-configuration settings that are enabled by @DataJpaTest can be found in the appendix .

    @JdbcTest is similar to @DataJpaTest but for pure JDBC-related tests. By default, it also configures an in-memory embedded database and a JdbcTemplate . Regular @Component beans are not loaded into the ApplicationContext .

    By default, JDBC tests are transactional and roll back at the end of each test. See the relevant section in the Spring Framework Reference Documentation for more details. If that is not what you want, you can disable transaction management for a test or for the whole class as follows:

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.transaction.annotation.Propagation;
    import org.springframework.transaction.annotation.Transactional;
    @RunWith(SpringRunner.class)
    @JdbcTest
    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public class ExampleNonTransactionalTests {
    }

    If you prefer your test to run against a real database, you can use the @AutoConfigureTestDatabase annotation in the same way as for DataJpaTest . (See Section 43.3.9, “Auto-configured Data JPA Tests” .)

    A list of the auto-configuration that is enabled by @JdbcTest can be found in the appendix .

    You can use @DataMongoTest to test MongoDB applications. By default, it configures an in-memory embedded MongoDB (if available), configures a MongoTemplate , scans for @Document classes, and configures Spring Data MongoDB repositories. Regular @Component beans are not loaded into the ApplicationContext . The following class shows the @DataMongoTest annotation in use:

    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
    import org.springframework.data.mongodb.core.MongoTemplate;
    import org.springframework.test.context.junit4.SpringRunner;
    @RunWith(SpringRunner.class)
    @DataMongoTest
    public class ExampleDataMongoTests {
    	@Autowired
    	private MongoTemplate mongoTemplate;
    }

    In-memory embedded MongoDB generally works well for tests, since it is fast and does not require any developer installation. If, however, you prefer to run tests against a real MongoDB server, you should exclude the embedded MongoDB auto-configuration, as shown in the following example:

    import org.junit.runner.RunWith;
     import org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration;
    import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
    import org.springframework.test.context.junit4.SpringRunner;
    @RunWith(SpringRunner.class)
    @DataMongoTest(excludeAutoConfiguration = EmbeddedMongoAutoConfiguration.class)
    public class ExampleDataMongoNonEmbeddedTests {
    }

    A list of the auto-configuration settings that are enabled by @DataMongoTest can be found in the appendix .

    You can use @DataNeo4jTest to test Neo4j applications. By default, it uses an in-memory embedded Neo4j (if the embedded driver is available), scans for @NodeEntity classes, and configures Spring Data Neo4j repositories. Regular @Component beans are not loaded into the ApplicationContext :

    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.data.neo4j.DataNeo4jTest;
    import org.springframework.test.context.junit4.SpringRunner;
    @RunWith(SpringRunner.class)
    @DataNeo4jTest
    public class ExampleDataNeo4jTests {
    	@Autowired
    	private YourRepository repository;
    }

    By default, Data Neo4j tests are transactional and roll back at the end of each test. See the relevant section in the Spring Framework Reference Documentation for more details. If that is not what you want, you can disable transaction management for a test or for the whole class as follows:

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.autoconfigure.data.neo4j.DataNeo4jTest;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.transaction.annotation.Propagation;
    import org.springframework.transaction.annotation.Transactional;
    @RunWith(SpringRunner.class)
    @DataNeo4jTest
    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public class ExampleNonTransactionalTests {
    }

    A list of the auto-configuration settings that are enabled by @DataNeo4jTest can be found in the appendix .

    You can use @DataLdapTest to test LDAP applications. By default, it configures an in-memory embedded LDAP (if available), configures an LdapTemplate , scans for @Entry classes, and configures Spring Data LDAP repositories. Regular @Component beans are not loaded into the ApplicationContext . The following example shows the @DataLdapTest annotation in use:

    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.data.ldap.DataLdapTest;
    import org.springframework.ldap.core.LdapTemplate;
    import org.springframework.test.context.junit4.SpringRunner;
    @RunWith(SpringRunner.class)
    @DataLdapTest
    public class ExampleDataLdapTests {
    	@Autowired
    	private LdapTemplate ldapTemplate;
    }

    In-memory embedded LDAP generally works well for tests, since it is fast and does not require any developer installation. If, however, you prefer to run tests against a real LDAP server, you should exclude the embedded LDAP auto-configuration, as shown in the following example:

    import org.junit.runner.RunWith;
    import org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration;
    import org.springframework.boot.test.autoconfigure.data.ldap.DataLdapTest;
    import org.springframework.test.context.junit4.SpringRunner;
    @RunWith(SpringRunner.class)
    @DataLdapTest(excludeAutoConfiguration = EmbeddedLdapAutoConfiguration.class)
    public class ExampleDataLdapNonEmbeddedTests {
    }

    A list of the auto-configuration settings that are enabled by @DataLdapTest can be found in the appendix .

    You can use the @AutoConfigureRestDocs annotation to use Spring REST Docs in your tests with Mock MVC or REST Assured. It removes the need for the JUnit rule in Spring REST Docs.

    @AutoConfigureRestDocs can be used to override the default output directory ( target/generated-snippets if you are using Maven or build/generated-snippets if you are using Gradle). It can also be used to configure the host, scheme, and port that appears in any documented URIs.

    @AutoConfigureRestDocs customizes the MockMvc bean to use Spring REST Docs. You can inject it by using @Autowired and use it in your tests as you normally would when using Mock MVC and Spring REST Docs, as shown in the following example:

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
    import org.springframework.http.MediaType;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.test.web.servlet.MockMvc;
    import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
    import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
    @RunWith(SpringRunner.class)
    @WebMvcTest(UserController.class)
    @AutoConfigureRestDocs
    public class UserDocumentationTests {
    	@Autowired
    	private MockMvc mvc;
    	@Test
    	public void listUsers() throws Exception {
    		this.mvc.perform(get("/users").accept(MediaType.TEXT_PLAIN))
    				.andExpect(status().isOk())
    				.andDo(document("list-users"));
    }

    If you require more control over Spring REST Docs configuration than offered by the attributes of @AutoConfigureRestDocs , a RestDocsMockMvcConfigurationCustomizer bean can be used, as shown in the following example:

    @TestConfiguration
    static class CustomizationConfiguration
    		implements RestDocsMockMvcConfigurationCustomizer {
    	@Override
    	public void customize(MockMvcRestDocumentationConfigurer configurer) {
    		configurer.snippets().withTemplateFormat(TemplateFormats.markdown());
    }

    If you want to make use of Spring REST Docs support for a parameterized output directory, you can create a RestDocumentationResultHandler bean. The auto-configuration calls alwaysDo with this result handler, thereby causing each MockMvc call to automatically generate the default snippets. The following example shows a RestDocumentationResultHandler being defined:

    @TestConfiguration
    static class ResultHandlerConfiguration {
    	@Bean
    	public RestDocumentationResultHandler restDocumentation() {
    		return MockMvcRestDocumentation.document("{method-name}");
    }

    @AutoConfigureRestDocs makes a RequestSpecification bean, preconfigured to use Spring REST Docs, available to your tests. You can inject it by using @Autowired and use it in your tests as you normally would when using REST Assured and Spring REST Docs, as shown in the following example:

    import io.restassured.specification.RequestSpecification;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
    import org.springframework.boot.web.server.LocalServerPort;
    import org.springframework.test.context.junit4.SpringRunner;
    import static io.restassured.RestAssured.given;
    import static org.hamcrest.CoreMatchers.is;
    import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.document;
    @RunWith(SpringRunner.class)
    @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
    @AutoConfigureRestDocs
    public class UserDocumentationTests {
    	@LocalServerPort
    	private int port;
    	@Autowired
    	private RequestSpecification documentationSpec;
    	@Test
    	public void listUsers() throws Exception {
    		given(this.documentationSpec).filter(document("list-users")).when()
    				.port(this.port).get("/").then().assertThat().statusCode(is(200));
    }

    If you require more control over Spring REST Docs configuration than offered by the attributes of @AutoConfigureRestDocs , a RestDocsRestAssuredConfigurationCustomizer bean can be used, as shown in the following example:

    @TestConfiguration
    public static class CustomizationConfiguration
    		implements RestDocsRestAssuredConfigurationCustomizer {
    	@Override
    	public void customize(RestAssuredRestDocumentationConfigurer configurer) {
    		configurer.snippets().withTemplateFormat(TemplateFormats.markdown());
    }

    If you structure your code in a sensible way, your @SpringBootApplication class is used by default as the configuration of your tests.

    It then becomes important not to litter the application’s main class with configuration settings that are specific to a particular area of its functionality.

    Assume that you are using Spring Batch and you rely on the auto-configuration for it. You could define your @SpringBootApplication as follows:

    @SpringBootApplication
    @EnableBatchProcessing
    public class SampleApplication { ... }

    Because this class is the source configuration for the test, any slice test actually tries to start Spring Batch, which is definitely not what you want to do. A recommended approach is to move that area-specific configuration to a separate @Configuration class at the same level as your application, as shown in the following example:

    @Configuration
    @EnableBatchProcessing
    public class BatchConfiguration { ... }
    [Note] Note

    Depending on the complexity of your application, you may either have a single @Configuration class for your customizations or one class per domain area when it makes sense. The latter approach lets you enable it in one of your tests, if necessary, with the @Import annotation.

    Another source of confusion is classpath scanning. Assume that, while you structured your code in a sensible way, you need to scan an additional package. Your application may resemble the following code:

    @SpringBootApplication
    @ComponentScan({ "com.example.app", "org.acme.another" })
    public class SampleApplication { ... }

    This effectively overrides the default component scan directive with the side effect of scanning those two packages regardless of the slice that you chose. For instance, a @DataJpaTest seems to suddenly scan components and user configurations of your application. Again, moving the custom directive to a separate class is a good way to fix this issue.

    [Tip] Tip

    If this is not an option for you, you can create a @SpringBootConfiguration somewhere in the hierarchy of your test so that it is used instead. Alternatively, you can specify a source for your test, which disables the behavior of finding a default one.

    A few test utility classes that are generally useful when testing your application are packaged as part of spring-boot .

    ConfigFileApplicationContextInitializer is an ApplicationContextInitializer that you can apply to your tests to load Spring Boot application.properties files. You can use it when you do not need the full set of features provided by @SpringBootTest .

    @ContextConfiguration(classes = Config.class,
    	initializers = ConfigFileApplicationContextInitializer.class)
    [Note] Note

    Using ConfigFileApplicationContextInitializer alone does not provide support for @Value("${…​}") injection. Its only job is to ensure that application.properties files are loaded into Spring’s Environment . For @Value support, you need to either additionally configure a PropertySourcesPlaceholderConfigurer or use @SpringBootTest , where one will be auto-configured for you.

    TestRestTemplate is a convenience alternative to Spring’s RestTemplate that is useful in integration tests. You can get a vanilla template or one that sends Basic HTTP authentication (with a username and password). In either case, the template behaves in a test-friendly way by not throwing exceptions on server-side errors. It is recommended, but not mandatory, to use the Apache HTTP Client (version 4.3.2 or better). If you have that on your classpath, the TestRestTemplate responds by configuring the client appropriately. If you do use Apache’s HTTP client, some additional test-friendly features are enabled:

    TestRestTemplate can be instantiated directly in your integration tests, as shown in the following example:

    public class MyTest {
    	private TestRestTemplate template = new TestRestTemplate();
    	@Test
    	public void testRequest() throws Exception {
    		HttpHeaders headers = template.getForEntity("http://myhost.com/example", String.class).getHeaders();
    		assertThat(headers.getLocation().toString(), containsString("myotherhost"));
    }

    Alternatively, if you use the @SpringBootTest annotation with WebEnvironment.RANDOM_PORT or WebEnvironment.DEFINED_PORT , you can just inject a fully configured TestRestTemplate and start using it. If necessary, additional customizations can be applied through the RestTemplateBuilder bean. Any URLs that do not specify a host and port automatically connect to the embedded server, as shown in the following example:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class MyTest {
    	@Autowired
    	private TestRestTemplate template;
    	@Test
    	public void testRequest() throws Exception {
    		HttpHeaders headers = template.getForEntity("/example", String.class).getHeaders();
    		assertThat(headers.getLocation().toString(), containsString("myotherhost"));
    	@TestConfiguration
    	static class Config {
    		@Bean
    		public RestTemplateBuilder restTemplateBuilder() {
    			return new RestTemplateBuilder()
    				.additionalMessageConverters(...)
    				.customizers(...);
    }

    Spring Boot provides Web Services auto-configuration so that all you must do is define your Endpoints .

    The Spring Web Services features can be easily accessed with the spring-boot-starter-webservices module.

    SimpleWsdl11Definition and SimpleXsdSchema beans can be automatically created for your WSDLs and XSDs respectively. To do so, configure their location, as shown in the following example:

    spring.webservices.wsdl-locations=classpath:/wsdl

    If you work in a company that develops shared libraries, or if you work on an open-source or commercial library, you might want to develop your own auto-configuration. Auto-configuration classes can be bundled in external jars and still be picked-up by Spring Boot.

    Auto-configuration can be associated to a "starter" that provides the auto-configuration code as well as the typical libraries that you would use with it. We first cover what you need to know to build your own auto-configuration and then we move on to the typical steps required to create a custom starter .

    [Tip] Tip

    A demo project is available to showcase how you can create a starter step-by-step.

    Spring Boot checks for the presence of a META-INF/spring.factories file within your published jar. The file should list your configuration classes under the EnableAutoConfiguration key, as shown in the following example:

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.mycorp.libx.autoconfigure.LibXAutoConfiguration,\
    com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration

    You can use the @AutoConfigureAfter or @AutoConfigureBefore annotations if your configuration needs to be applied in a specific order. For example, if you provide web-specific configuration, your class may need to be applied after WebMvcAutoConfiguration .

    If you want to order certain auto-configurations that should not have any direct knowledge of each other, you can also use @AutoConfigureOrder . That annotation has the same semantic as the regular @Order annotation but provides a dedicated order for auto-configuration classes.

    [Note] Note

    Auto-configurations must be loaded that way only . Make sure that they are defined in a specific package space and that, in particular, they are never the target of component scanning.

    You almost always want to include one or more @Conditional annotations on your auto-configuration class. The @ConditionalOnMissingBean annotation is one common example that is used to allow developers to ‘override’ auto-configuration if they are not happy with your defaults.

    Spring Boot includes a number of @Conditional annotations that you can reuse in your own code by annotating @Configuration classes or individual @Bean methods. These annotations include:

    The @ConditionalOnClass and @ConditionalOnMissingClass annotations let configuration be included based on the presence or absence of specific classes. Due to the fact that annotation metadata is parsed by using ASM , you can use the value attribute to refer to the real class, even though that class might not actually appear on the running application classpath. You can also use the name attribute if you prefer to specify the class name by using a String value.

    [Tip] Tip

    If you use @ConditionalOnClass or @ConditionalOnMissingClass as a part of a meta-annotation to compose your own composed annotations, you must use name as referring to the class in such a case is not handled.

    The @ConditionalOnBean and @ConditionalOnMissingBean annotations let a bean be included based on the presence or absence of specific beans. You can use the value attribute to specify beans by type or name to specify beans by name. The search attribute lets you limit the ApplicationContext hierarchy that should be considered when searching for beans.

    When placed on a @Bean method, the target type defaults to the return type of the method, as shown in the following example:

    @Configuration
    public class MyAutoConfiguration {
    	@Bean
    	@ConditionalOnMissingBean
    	public MyService myService() { ... }
    }

    In the preceding example, the myService bean is going to be created if no bean of type MyService is already contained in the ApplicationContext .

    [Tip] Tip

    You need to be very careful about the order that bean definitions are added as these conditions are evaluated based on what has been processed so far. For this reason, we recommend only using @ConditionalOnBean and @ConditionalOnMissingBean annotations on auto-configuration classes (since these are guaranteed to load after any user-defined bean definitions have been added).

    [Note] Note

    @ConditionalOnBean and @ConditionalOnMissingBean do not prevent @Configuration classes from being created. Using these conditions at the class level is equivalent to marking each contained @Bean method with the annotation.

    A full Spring Boot starter for a library may contain the following components:

    [Tip] Tip

    You may combine the auto-configuration code and the dependency management in a single module if you do not need to separate those two concerns.

    The autoconfigure module contains everything that is necessary to get started with the library. It may also contain configuration key definitions (such as @ConfigurationProperties ) and any callback interface that can be used to further customize how the components are initialized.

    [Tip] Tip

    You should mark the dependencies to the library as optional so that you can include the autoconfigure module in your projects more easily. If you do it that way, the library is not provided and, by default, Spring Boot backs off.

    If you want to learn more about any of the classes discussed in this section, you can check out the Spring Boot API documentation or you can browse the source code directly . If you have specific questions, take a look at the how-to section.

    If you are comfortable with Spring Boot’s core features, you can continue on and read about production-ready features .

    The spring-boot-actuator module provides all of Spring Boot’s production-ready features. The simplest way to enable the features is to add a dependency to the spring-boot-starter-actuator ‘Starter’.

    To add the actuator to a Maven based project, add the following ‘Starter’ dependency:

    <dependencies>
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-actuator</artifactId>
    	</dependency>
    </dependencies>

    For Gradle, use the following declaration:

    dependencies {
    	compile("org.springframework.boot:spring-boot-starter-actuator")
    }

    Actuator endpoints let you monitor and interact with your application. Spring Boot includes a number of built-in endpoints and lets you add your own. For example, the health endpoint provides basic application health information.

    The way that endpoints are exposed depends on the type of technology that you choose. Most applications choose HTTP monitoring, where the ID of the endpoint along with a prefix of /actuator is mapped to a URL. For example, by default, the health endpoint is mapped to /actuator/health .

    The following technology-agnostic endpoints are available:

    ID Description

    auditevents

    Exposes audit events information for the current application.

    conditions

    Showing the conditions that were evaluated on configuration and auto-configuration classes and the reasons why they did or did not match.

    beans

    Displays a complete list of all the Spring beans in your application.

    configprops

    Displays a collated list of all @ConfigurationProperties .

    env

    Exposes properties from Spring’s ConfigurableEnvironment .

    flyway

    Shows any Flyway database migrations that have been applied.

    health

    Shows application health information.

    info

    Displays arbitrary application info.

    loggers

    Shows and modifies the configuration of loggers in the application.

    liquibase

    Shows any Liquibase database migrations that have been applied.

    metrics

    Shows ‘metrics’ information for the current application.

    mappings

    Displays a collated list of all @RequestMapping paths.

    scheduledtasks

    Displays the scheduled tasks in your application.

    sessions

    Allows retrieval and deletion of user sessions from a Spring Session-backed session store. Not available when using Spring Session’s support for reactive web applications.

    shutdown

    Lets the application be gracefully shutdown (not enabled by default).

    threaddump

    Performs a thread dump.

    trace

    Displays trace information (by default, the last 100 HTTP requests).

    If your application is a web application (Spring MVC, Spring WebFlux, or Jersey), you can use the following additional endpoints:

    ID Description

    heapdump

    Returns a GZip compressed hprof heap dump file.

    logfile

    Returns the contents of the logfile (if logging.file or logging.path properties have been set). Supports the use of the HTTP Range header to retrieve part of the log file’s content.

    prometheus

    Exposes metrics in a format that can be scraped by a Prometheus server.

    To learn more about the Actuator’s endpoints and their request and response formats, please refer to the separate API documentation that is available in the following formats:

    Cross-origin resource sharing (CORS) is a W3C specification that allows you to specify in a flexible way what kind of cross domain requests are authorized. If you use Spring MVC or Spring WebFlux, Actuator’s web endpoints can be configured to support such scenarios.

    CORS support is disabled by default and is only enabled once the management.endpoints.web.cors.allowed-origins property has been set. The following configuration permits GET and POST calls from the example.com domain:

    management.endpoints.web.cors.allowed-origins=http://example.com
    management.endpoints.web.cors.allowed-methods=GET,POST
    [Tip] Tip

    See CorsEndpointProperties for a complete list of options.

    You can use health information to check the status of your running application. It is often used by monitoring software to alert someone when a production system goes down. The information exposed by the health endpoint depends on the management.endpoint.health.show-details property. By default, the property’s value is false and a simple ‘status’ message is returned. When the property’s value is set to true , additional details from the individual health indicators are also displayed.

    Health information is collected from all HealthIndicator beans defined in your ApplicationContext . Spring Boot includes a number of auto-configured HealthIndicators , and you can also write your own. By default, the final system state is derived by the HealthAggregator , which sorts the statuses from each HealthIndicator based on an ordered list of statuses. The first status in the sorted list is used as the overall health status. If no HealthIndicator returns a status that is known to the HealthAggregator , an UNKNOWN status is used.

    The following HealthIndicators are auto-configured by Spring Boot when appropriate:

    Name Description

    CassandraHealthIndicator

    Checks that a Cassandra database is up.

    DiskSpaceHealthIndicator

    Checks for low disk space.

    DataSourceHealthIndicator

    Checks that a connection to DataSource can be obtained.

    ElasticsearchHealthIndicator

    Checks that an Elasticsearch cluster is up.

    JmsHealthIndicator

    Checks that a JMS broker is up.

    MailHealthIndicator

    Checks that a mail server is up.

    MongoHealthIndicator

    Checks that a Mongo database is up.

    Neo4jHealthIndicator

    Checks that a Neo4j server is up.

    RabbitHealthIndicator

    Checks that a Rabbit server is up.

    RedisHealthIndicator

    Checks that a Redis server is up.

    SolrHealthIndicator

    Checks that a Solr server is up.

    [Tip] Tip

    It is possible to disable them all using the management.health.defaults.enabled property.

    To provide custom health information, you can register Spring beans that implement the HealthIndicator interface. You need to provide an implementation of the health() method and return a Health response. The Health response should include a status and can optionally include additional details to be displayed. The following code shows a sample HealthIndicator implementation:

    import org.springframework.boot.actuate.health.Health;
    import org.springframework.boot.actuate.health.HealthIndicator;
    import org.springframework.stereotype.Component;
    @Component
    public class MyHealthIndicator implements HealthIndicator {
    	@Override
    	public Health health() {
    		int errorCode = check(); // perform some specific health check
    		if (errorCode != 0) {
    			return Health.down().withDetail("Error Code", errorCode).build();
    		return Health.up().build();
    }
    [Note] Note

    The identifier for a given HealthIndicator is the name of the bean without the HealthIndicator suffix, if it exists. In the preceding example, the health information is available in an entry named my .

    In addition to Spring Boot’s predefined Status types, it is also possible for Health to return a custom Status that represents a new system state. In such cases, a custom implementation of the HealthAggregator interface also needs to be provided, or the default implementation has to be configured by using the management.health.status.order configuration property.

    For example, assume a new Status with code FATAL is being used in one of your HealthIndicator implementations. To configure the severity order, add the following to your application properties:

    management.health.status.order=FATAL, DOWN, OUT_OF_SERVICE, UNKNOWN, UP

    The HTTP status code in the response reflects the overall health status (for example, UP maps to 200, while OUT_OF_SERVICE and DOWN map to 503). You might also want to register custom status mappings if you access the health endpoint over HTTP. For example, the following property maps FATAL to 503 (service unavailable):

    management.health.status.http-mapping.FATAL=503
    [Tip] Tip

    If you need more control, you can define your own HealthStatusHttpMapper bean.

    The following table shows the default status mappings for the built-in statuses:

    Status Mapping

    DOWN

    SERVICE_UNAVAILABLE (503)

    OUT_OF_SERVICE

    SERVICE_UNAVAILABLE (503)

    UP

    No mapping by default, so http status is 200

    UNKNOWN

    No mapping by default, so http status is 200

    For reactive applications, such as those using Spring WebFlux, ReactiveHealthIndicators provide a non-blocking contract for getting application health. Similar to a traditional HealthIndicator , health information is collected from all ReactiveHealthIndicator beans defined in your ApplicationContext . Regular HealthIndicators that do not check against a reactive API are included and executed on the elastic scheduler.

    To provide custom health information from a reactive API, you can register Spring beans that implement the ReactiveHealthIndicator interface. The following code shows a sample ReactiveHealthIndicator implementation:

    @Component
    public class MyReactiveHealthIndicator implements ReactiveHealthIndicator {
    	@Override
    	public Mono<Health> health() {
    		return doHealthCheck() //perform some specific health check that returns a Mono<Health>
    			.onErrorResume(ex -> Mono.just(new Health.Builder().down(ex).build())));
    }
    [Tip] Tip

    To handle the error automatically, consider extending from AbstractReactiveHealthIndicator .

    49.8.4 Auto-configured ReactiveHealthIndicators

    The following ReactiveHealthIndicators are auto-configured by Spring Boot when appropriate:

    Name Description

    RedisReactiveHealthIndicator

    Checks that a Redis server is up.

    [Tip] Tip

    Those reactive indicators replace the regular ones if necessary. Also, any HealthIndicator that is not handled explicitly is wrapped automatically.

    Application information exposes various information collected from all InfoContributor beans defined in your ApplicationContext . Spring Boot includes a number of auto-configured InfoContributors , and you can write your own.

    The following InfoContributors are auto-configured by Spring Boot, when appropriate:

    Name Description

    EnvironmentInfoContributor

    Expose any key from the Environment under the info key.

    GitInfoContributor

    Expose git information if a git.properties file is available.

    BuildInfoContributor

    Expose build information if a META-INF/build-info.properties file is available.

    [Tip] Tip

    It is possible to disable them all using the management.info.defaults.enabled property.

    To provide custom application information, you can register Spring beans that implement the InfoContributor interface.

    The following example contributes an example entry with a single value:

    import java.util.Collections;
    import org.springframework.boot.actuate.info.Info;
    import org.springframework.boot.actuate.info.InfoContributor;
    import org.springframework.stereotype.Component;
    @Component
    public class ExampleInfoContributor implements InfoContributor {
    	@Override
    	public void contribute(Info.Builder builder) {
    		builder.withDetail("example",
    				Collections.singletonMap("key", "value"));
    }

    If you reach the info endpoint, you should see a response that contains the following additional entry:

    {
    	"example": {
    		"key" : "value"
    }

    If you are developing a web application, Spring Boot Actuator auto-configures all enabled endpoints to be exposed over HTTP. The default convention is to use the id of the endpoint with a prefix of /actuator as the URL path. For example, health is exposed as /actuator/health .

    [Tip] Tip

    Actuator is supported natively with Spring MVC, Spring WebFlux and Jersey.

    Java Management Extensions (JMX) provide a standard mechanism to monitor and manage applications. By default, Spring Boot exposes management endpoints as JMX MBeans under the org.springframework.boot domain.

    Spring Boot Actuator provides dependency management and auto-configuration for Micrometer , an application metrics facade that supports numerous monitoring systems:

    Micrometer provides a separate module for each supported monitoring system. Depending on one (or more) of these modules is sufficient to get started with Micrometer in your Spring Boot application. To learn more about Micrometer’s capabilities, please refer to its reference documentation .

    Tracing is automatically enabled for all HTTP requests. You can view the trace endpoint and obtain basic information about the last 100 requests. The following listing shows sample output:

    [{
    	"timestamp": 1394343677415,
    	"info": {
    		"method": "GET",
    		"path": "/trace",
    		"headers": {
    			"request": {
    				"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    				"Connection": "keep-alive",
    				"Accept-Encoding": "gzip, deflate",
    				"User-Agent": "Mozilla/5.0 Gecko/Firefox",
    				"Accept-Language": "en-US,en;q=0.5",
    				"Cookie": "_ga=GA1.1.827067509.1390890128; ..."
    				"Authorization": "Basic ...",
    				"Host": "localhost:8080"
    			"response": {
    				"Strict-Transport-Security": "max-age=31536000 ; includeSubDomains",
    				"X-Application-Context": "application:8080",
    				"Content-Type": "application/json;charset=UTF-8",
    				"status": "200"
    	"timestamp": 1394343684465,
    }]

    By default, the trace includes the following information:

    Name Description

    Request Headers

    Headers from the request.

    Response Headers

    Headers from the response.

    Cookies

    Cookie from request headers and Set-Cookie from response headers.

    Errors

    The error attributes (if any).

    Time Taken

    The time taken to service the request in milliseconds.

    If you need to trace additional events, you can inject a TraceRepository into your Spring beans. The add method accepts a single Map structure that is converted to JSON and logged.

    By default, an InMemoryTraceRepository that stores the last 100 events is used. If you need to expand the capacity, you can define your own instance of the InMemoryTraceRepository bean. You can also create your own alternative TraceRepository implementation.

    Spring Boot’s actuator module includes additional support that is activated when you deploy to a compatible Cloud Foundry instance. The /cloudfoundryapplication path provides an alternative secured route to all @Endpoint beans.

    The extended support lets Cloud Foundry management UIs (such as the web application that you can use to view deployed applications) be augmented with Spring Boot actuator information. For example, an application status page may include full health information instead of the typical “running” or “stopped” status.

    [Note] Note

    The /cloudfoundryapplication path is not directly accessible to regular users. In order to use the endpoint, a valid UAA token must be passed with the request.

    If you want to explore some of the concepts discussed in this chapter, you can take a look at the actuator sample applications . You also might want to read about graphing tools such as Graphite .

    Otherwise, you can continue on, to read about ‘deployment options’ or jump ahead for some in-depth information about Spring Boot’s build tool plugins .

    Spring Boot’s executable jars are ready-made for most popular cloud PaaS (Platform-as-a-Service) providers. These providers tend to require that you “bring your own container”. They manage application processes (not Java applications specifically), so they need some intermediary layer that adapts your application to the cloud’s notion of a running process.

    Two popular cloud providers, Heroku and Cloud Foundry, employ a “buildpack” approach. The buildpack wraps your deployed code in whatever is needed to start your application: it might be a JDK and a call to java , it might be an embedded web server, or it might be a full-fledged application server. A buildpack is pluggable, but ideally you should be able to get by with as few customizations to it as possible. This reduces the footprint of functionality that is not under your control. It minimizes divergence between development and production environments.

    Ideally, your application, like a Spring Boot executable jar, has everything that it needs to run packaged within it.

    In this section, we look at what it takes to get the simple application that we developed in the “Getting Started” section up and running in the Cloud.

    Cloud Foundry provides default buildpacks that come into play if no other buildpack is specified. The Cloud Foundry Java buildpack has excellent support for Spring applications, including Spring Boot. You can deploy stand-alone executable jar applications as well as traditional .war packaged applications.

    Once you have built your application (by using, for example, mvn clean package ) and have installed the cf command line tool , deploy your application by using the cf push command, substituting the path to your compiled .jar . Be sure to have logged in with your cf command line client before pushing an application. The following line shows using the cf push command to deploy an application:

    $ cf push acloudyspringtime -p target/demo-0.0.1-SNAPSHOT.jar
    [Note] Note

    In the preceding example, we substitute acloudyspringtime for whatever value you give cf as the name of your application.

    See the cf push documentation for more options. If there is a Cloud Foundry manifest.yml file present in the same directory, it is considered.

    At this point, cf starts uploading your application, producing output similar to the following example:

    Uploading acloudyspringtime... OK
    Preparing to start acloudyspringtime... OK
    -----> Downloaded app package (8.9M)
    -----> Java Buildpack Version: v3.12 (offline) | https://github.com/cloudfoundry/java-buildpack.git#6f25b7e
    -----> Downloading Open Jdk JRE 1.8.0_121 from https://java-buildpack.cloudfoundry.org/openjdk/trusty/x86_64/openjdk-1.8.0_121.tar.gz (found in cache)
           Expanding Open Jdk JRE to .java-buildpack/open_jdk_jre (1.6s)
    -----> Downloading Open JDK Like Memory Calculator 2.0.2_RELEASE from https://java-buildpack.cloudfoundry.org/memory-calculator/trusty/x86_64/memory-calculator-2.0.2_RELEASE.tar.gz (found in cache)
           Memory Settings: -Xss349K -Xmx681574K -XX:MaxMetaspaceSize=104857K -Xms681574K -XX:MetaspaceSize=104857K
    -----> Downloading Container Certificate Trust Store 1.0.0_RELEASE from https://java-buildpack.cloudfoundry.org/container-certificate-trust-store/container-certificate-trust-store-1.0.0_RELEASE.jar (found in cache)
           Adding certificates to .java-buildpack/container_certificate_trust_store/truststore.jks (0.6s)
    -----> Downloading Spring Auto Reconfiguration 1.10.0_RELEASE from https://java-buildpack.cloudfoundry.org/auto-reconfiguration/auto-reconfiguration-1.10.0_RELEASE.jar (found in cache)
    Checking status of app 'acloudyspringtime'...
      0 of 1 instances running (1 starting)
      0 of 1 instances running (1 starting)
      0 of 1 instances running (1 starting)
      1 of 1 instances running (1 running)
    App started

    Congratulations! The application is now live!

    Once your application is live, you can verify the status of the deployed application by using the cf apps command, as shown in the following example:

    $ cf apps
    Getting applications in ...
    name                 requested state   instances   memory   disk   urls
    acloudyspringtime    started           1/1         512M     1G     acloudyspringtime.cfapps.io
    ...

    Once Cloud Foundry acknowledges that your application has been deployed, you should be able to find the application at the URI given. In the preceding example, you could find it at http://acloudyspringtime.cfapps.io/ .

    Heroku is another popular PaaS platform. To customize Heroku builds, you provide a Procfile , which provides the incantation required to deploy an application. Heroku assigns a port for the Java application to use and then ensures that routing to the external URI works.

    You must configure your application to listen on the correct port. The following example shows the Procfile for our starter REST application:

    web: java -Dserver.port=$PORT -jar target/demo-0.0.1-SNAPSHOT.jar

    Spring Boot makes -D arguments available as properties accessible from a Spring Environment instance. The server.port configuration property is fed to the embedded Tomcat, Jetty, or Undertow instance which, then uses the port when it starts up. The $PORT environment variable is assigned to us by the Heroku PaaS.

    This should be everything you need. The most common deployment workflow for Heroku deployments is to git push the code to production, as shown in the following example:

    $ git push heroku master
    Initializing repository, done.
    Counting objects: 95, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (78/78), done.
    Writing objects: 100% (95/95), 8.66 MiB | 606.00 KiB/s, done.
    Total 95 (delta 31), reused 0 (delta 0)
    -----> Java app detected
    -----> Installing OpenJDK 1.8... done
    -----> Installing Maven 3.3.1... done
    -----> Installing settings.xml... done
    -----> Executing: mvn -B -DskipTests=true clean install
           [INFO] Scanning for projects...
           Downloading: http://repo.spring.io/...
           Downloaded: http://repo.spring.io/... (818 B at 1.8 KB/sec)
           Downloaded: http://s3pository.heroku.com/jvm/... (152 KB at 595.3 KB/sec)
           [INFO] Installing /tmp/build_0c35a5d2-a067-4abc-a232-14b1fb7a8229/target/...
           [INFO] Installing /tmp/build_0c35a5d2-a067-4abc-a232-14b1fb7a8229/pom.xml ...
           [INFO] ------------------------------------------------------------------------
           [INFO] BUILD SUCCESS
           [INFO] ------------------------------------------------------------------------
           [INFO] Total time: 59.358s
           [INFO] Finished at: Fri Mar 07 07:28:25 UTC 2014
           [INFO] Final Memory: 20M/493M
           [INFO] ------------------------------------------------------------------------
    -----> Discovering process types
           Procfile declares types -> web
    -----> Compressing... done, 70.4MB
    -----> Launching... done, v6
           http://agile-sierra-1405.herokuapp.com/ deployed to Heroku
    To [email protected]:agile-sierra-1405.git
     * [new branch]      master -> master

    Your application should now be up and running on Heroku.

    OpenShift is the Red Hat public (and enterprise) extension of the Kubernetes container orchestration platform. Similarly to Kubernetes, OpenShift has many options for installing Spring Boot based applications.

    OpenShift has many resources describing how to deploy Spring Boot applications, which include:

    Amazon Web Services offers multiple ways to install Spring Boot-based applications, either as traditional web applications (war) or as executable jar files with an embedded web server. The options include:

    Each has different features and pricing model. In this document, we describe only the simplest option: AWS Elastic Beanstalk.

    As described in the official Elastic Beanstalk Java guide , there are two main options to deploy a Java application. You can either use the “Tomcat Platform” or the “Java SE platform”.

    This option applies to Spring Boot projects that produce a jar file and run an embedded web container. Elastic Beanstalk environments run an nginx instance on port 80 to proxy the actual application, running on port 5000. To configure it, add the following line to your application.properties file:

    server.port=5000
    [Tip] Upload binaries instead of sources

    By default, Elastic Beanstalk uploads sources and compiles them in AWS. However, it is best to upload the binaries instead. To do so, add the following lines to your .elasticbeanstalk/config.yml file:

    deploy:
    	artifact: target/demo-0.0.1-SNAPSHOT.jar
    [Tip] Reduce costs by setting the environment type

    By default an Elastic Beanstalk environment is load balanced. The load balancer has a significant cost. To avoid that cost, set the environment type to “Single instance”, as described in Amazon documentation. You can also create single instance environments by using the CLI and the following command:

    eb create -s

    Boxfuse works by turning your Spring Boot executable jar or war into a minimal VM image that can be deployed unchanged either on VirtualBox or on AWS. Boxfuse comes with deep integration for Spring Boot and uses the information from your Spring Boot configuration file to automatically configure ports and health check URLs. Boxfuse leverages this information both for the images it produces as well as for all the resources it provisions (instances, security groups, elastic load balancers, and so on).

    Once you have created a Boxfuse account , connected it to your AWS account, installed the latest version of the Boxfuse Client, and ensured that the application has been built by Maven or Gradle (by using, for example, mvn clean package ), you can deploy your Spring Boot application to AWS with a command similar to the following:

    $ boxfuse run myapp-1.0.jar -env=prod

    See the boxfuse run documentation for more options. If there is a boxfuse.com/docs/commandline/#configuration [ boxfuse.conf ] file present in the current directory, it is considered.

    [Tip] Tip

    By default, Boxfuse activates a Spring profile named boxfuse on startup. If your executable jar or war contains an boxfuse.com/docs/payloads/springboot.html#configuration [ application-boxfuse.properties ] file, Boxfuse bases its configuration based on the properties it contains.

    At this point, boxfuse creates an image for your application, uploads it, and configures and starts the necessary resources on AWS resulting in output similar to the following example:

    Fusing Image for myapp-1.0.jar ...
    Image fused in 00:06.838s (53937 K) -> axelfontaine/myapp:1.0
    Creating axelfontaine/myapp ...
    Pushing axelfontaine/myapp:1.0 ...
    Verifying axelfontaine/myapp:1.0 ...
    Creating Elastic IP ...
    Mapping myapp-axelfontaine.boxfuse.io to 52.28.233.167 ...
    Waiting for AWS to create an AMI for axelfontaine/myapp:1.0 in eu-central-1 (this may take up to 50 seconds) ...
    AMI created in 00:23.557s -> ami-d23f38cf
    Creating security group boxfuse-sg_axelfontaine/myapp:1.0 ...
    Launching t2.micro instance of axelfontaine/myapp:1.0 (ami-d23f38cf) in eu-central-1 ...
    Instance launched in 00:30.306s -> i-92ef9f53
    Waiting for AWS to boot Instance i-92ef9f53 and Payload to start at http://52.28.235.61/ ...
    Payload started in 00:29.266s -> http://52.28.235.61/
    Remapping Elastic IP 52.28.233.167 to i-92ef9f53 ...
    Waiting 15s for AWS to complete Elastic IP Zero Downtime transition ...
    Deployment completed successfully. axelfontaine/myapp:1.0 is up and running at http://myapp-axelfontaine.boxfuse.io/

    Your application should now be up and running on AWS.

    See the blog post on deploying Spring Boot apps on EC2 as well as the documentation for the Boxfuse Spring Boot integration to get started with a Maven build to run the app.

    Google Cloud has several options that can be used to launch Spring Boot applications. The easiest to get started with is probably App Engine, but you could also find ways to run Spring Boot in a container with Container Engine or on a virtual machine with Compute Engine.

    To run in App Engine, you can create a project in the UI first, which sets up a unique identifier for you and also sets up HTTP routes. Add a Java app to the project and leave it empty and then use the Google Cloud SDK to push your Spring Boot app into that slot from the command line or CI build.

    App Engine needs you to create an app.yaml file to describe the resources your app requires. Normally you put this file in src/main/appengine , and it should resemble the following file:

    service: default
    runtime: java
    env: flex
    runtime_config:
      jdk: openjdk8
    handlers:
    - url: /.*
      script: this field is required, but ignored
    manual_scaling:
      instances: 1
    health_check:
      enable_health_check: False
    env_variables:
      ENCRYPT_KEY: your_encryption_key_here

    You can deploy the app (for example, with a Maven plugin) by adding the project ID to the build configuration, as shown in the following example:

    <plugin>
    	<groupId>com.google.cloud.tools</groupId>
    	<artifactId>appengine-maven-plugin</artifactId>
    	<version>1.3.0</version>
    	<configuration>
    		<project>myproject</project>
    	</configuration>
    </plugin>

    Then deploy with mvn appengine:deploy (if you need to authenticate first, the build fails).

    [Note] Note

    Google App Engine Classic is tied to the Servlet 2.5 API, so you cannot deploy a Spring Application there without some modifications. See the Servlet 2.5 section of this guide.

    In additional to running Spring Boot applications by using java -jar , it is also possible to make fully executable applications for Unix systems. A fully executable jar can be executed like any other executable binary or it can be registered with init.d or systemd . This makes it very easy to install and manage Spring Boot applications in common production environments.

    [Warning] Warning

    Fully executable jars work by embedding an extra script at the front of the file. Currently, some tools do not accept this format, so you may not always be able to use this technique. For example, jar -xf may silently fail to extract a jar or war that has been made fully executable. It is recommended that you only make your jar or war fully executable if you intend to execute it directly, rather than running it with java -jar or deploying it to a servlet container.

    To create a ‘fully executable’ jar with Maven, use the following plugin configuration:

    <plugin>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-maven-plugin</artifactId>
    	<configuration>
    		<executable>true</executable>
    	</configuration>
    </plugin>

    The following example shows the equivalent Gradle configuration:

    bootJar {
    	launchScript()
    }

    You can then run your application by typing ./my-application.jar (where my-application is the name of your artifact). The directory containing the jar is used as your application’s working directory.

    Spring Boot application can be easily started as Unix/Linux services by using either init.d or systemd .

    If you configured Spring Boot’s Maven or Gradle plugin to generate a fully executable jar , and you do not use a custom embeddedLaunchScript , your application can be used as an init.d service. To do so, symlink the jar to init.d to support the standard start , stop , restart and status commands.

    The script supports the following features:

    • Starts the services as the user that owns the jar file
    • Tracks the application’s PID by using /var/run/<appname>/<appname>.pid
    • Writes console logs to /var/log/<appname>.log

    Assuming that you have a Spring Boot application installed in /var/myapp , to install a Spring Boot application as an init.d service, create a symlink, as follows:

    $ sudo ln -s /var/myapp/myapp.jar /etc/init.d/myapp

    Once installed, you can start and stop the service in the usual way. For example, on a Debian based system, you could start it with the following command:

    $ service myapp start
    [Tip] Tip

    If your application fails to start, check the log file written to /var/log/<appname>.log for errors.

    You can also flag the application to start automatically by using your standard operating system tools. For example, on Debian, you could use the following command:

    $ update-rc.d myapp defaults <priority>

    Securing an init.d Service

    [Note] Note

    The following is a set of guidelines on how to secure a Spring Boot application that runs as an init.d service. It is not intended to be an exhaustive list of everything that should be done to harden an application and the environment in which it runs.

    When executed as root, as is the case when root is being used to start an init.d service, the default executable script runs the application as the user who owns the jar file. You should never run a Spring Boot application as root , so your application’s jar file should never be owned by root. Instead, create a specific user to run your application and use chown to make it the owner of the jar file, as shown in the following example:

    $ chown bootapp:bootapp your-app.jar

    In this case, the default executable script runs the application as the bootapp user.

    [Tip] Tip

    To reduce the chances of the application’s user account being compromised, you should consider preventing it from using a login shell. For example, you can set the account’s shell to /usr/sbin/nologin .

    You should also take steps to prevent the modification of your application’s jar file. Firstly, configure its permissions so that it cannot be written and can only be read or executed by its owner, as shown in the following example:

    $ chmod 500 your-app.jar

    Second, you should also take steps to limit the damage if your application or the account that’s running it is compromised. If an attacker does gain access, they could make the jar file writable and change its contents. One way to protect against this is to make it immutable by using chattr , as shown in the following example:

    $ sudo chattr +i your-app.jar

    This will prevent any user, including root, from modifying the jar.

    If root is used to control the application’s service and you use a .conf file to customize its startup, the .conf file is read and evaluated by the root user. It should be secured accordingly. Use chmod so that the file can only be read by the owner and use chown to make root the owner, as shown in the following example:

    $ chmod 400 your-app.conf
    $ sudo chown root:root your-app.conf

    The default embedded startup script written by the Maven or Gradle plugin can be customized in a number of ways. For most people, using the default script along with a few customizations is usually enough. If you find you cannot customize something that you need to, you can always use the embeddedLaunchScript option to write your own file entirely.

    It often makes sense to customize elements of the start script as it is written into the jar file. For example, init.d scripts can provide a “description”. Since you know the description up front (and it need not change), you may as well provide it when the jar is generated.

    To customize written elements, use the embeddedLaunchScriptProperties option of the Spring Boot Maven or Gradle plugins.

    The following property substitutions are supported with the default script:

    Name Description

    mode

    The script mode. Defaults to auto .

    initInfoProvides

    The Provides section of “INIT INFO”. Defaults to spring-boot-application for Gradle and to ${project.artifactId} for Maven.

    initInfoRequiredStart

    The Required-Start section of “INIT INFO”. Defaults to $remote_fs $syslog $network .

    initInfoRequiredStop

    The Required-Stop section of “INIT INFO”. Defaults to $remote_fs $syslog $network .

    initInfoDefaultStart

    The Default-Start section of “INIT INFO”. Defaults to 2 3 4 5 .

    initInfoDefaultStop

    The Default-Stop section of “INIT INFO”. Defaults to 0 1 6 .

    initInfoShortDescription

    The Short-Description section of “INIT INFO”. Defaults to Spring Boot Application for Gradle and to ${project.name} for Maven.

    initInfoDescription

    The Description section of “INIT INFO”. Defaults to Spring Boot Application for Gradle and to ${project.description} (falling back to ${project.name} ) for Maven.

    initInfoChkconfig

    The chkconfig section of “INIT INFO”. Defaults to 2345 99 01 .

    confFolder

    The default value for CONF_FOLDER . Defaults to the folder containing the jar.

    inlinedConfScript

    Reference to a file script that should be inlined in the default launch script. This can be used to set environmental variables such as JAVA_OPTS before any external config files are loaded.

    logFolder

    The default value for LOG_FOLDER . Only valid for an init.d service.

    logFilename

    The default value for LOG_FILENAME . Only valid for an init.d service.

    pidFolder

    The default value for PID_FOLDER . Only valid for an init.d service.

    pidFilename

    The default value for the name of the PID file in PID_FOLDER . Only valid for an init.d service.

    useStartStopDaemon

    Whether the start-stop-daemon command, when it’s available, should be used to control the process. Defaults to true .

    stopWaitTime

    The default value for STOP_WAIT_TIME . Only valid for an init.d service. Defaults to 60 seconds.

    For items of the script that need to be customized after the jar has been written, you can use environment variables or a config file .

    The following environment properties are supported with the default script:

    Variable Description

    MODE

    The “mode” of operation. The default depends on the way the jar was built but is usually auto (meaning it tries to guess if it is an init script by checking if it is a symlink in a directory called init.d ). You can explicitly set it to service so that the stop|start|status|restart commands work or to run if you want to run the script in the foreground.

    USE_START_STOP_DAEMON

    Whether the start-stop-daemon command, when it’s available, should be used to control the process. Defaults to true .

    PID_FOLDER

    The root name of the pid folder ( /var/run by default).

    LOG_FOLDER

    The name of the folder in which to put log files ( /var/log by default).

    CONF_FOLDER

    The name of the folder from which to read .conf files (same folder as jar-file by default).

    LOG_FILENAME

    The name of the log file in the LOG_FOLDER ( <appname>.log by default).

    APP_NAME

    The name of the app. If the jar is run from a symlink, the script guesses the app name if it is not a symlink or you want to explicitly set the app name, this can be useful.

    RUN_ARGS

    The arguments to pass to the program (the Spring Boot app).

    JAVA_HOME

    The location of the java executable is discovered by using the PATH by default, but you can set it explicitly if there is an executable file at $JAVA_HOME/bin/java .

    JAVA_OPTS

    Options that are passed to the JVM when it is launched.

    JARFILE

    The explicit location of the jar file, in case the script is being used to launch a jar that it is not actually embedded.

    DEBUG

    If not empty, sets the -x flag on the shell process, making it easy to see the logic in the script.

    STOP_WAIT_TIME

    The time in seconds to wait when stopping the application before forcing a shutdown ( 60 by default).

    [Note] Note

    The PID_FOLDER , LOG_FOLDER , and LOG_FILENAME variables are only valid for an init.d service. For systemd , the equivalent customizations are made by using the ‘service’ script. See the service unit configuration man page for more details.

    With the exception of JARFILE and APP_NAME , the above settings can be configured by using a .conf file. The file is expected to be next to the jar file and have the same name but suffixed with .conf rather than .jar . For example, a jar named /var/myapp/myapp.jar uses the configuration file named /var/myapp/myapp.conf .

    myapp.conf.

    JAVA_OPTS=-Xmx1024M
    LOG_FOLDER=/custom/log/folder

    [Tip] Tip

    If you do not like having the config file next to the jar file, you can set a CONF_FOLDER environment variable to customize the location of the config file.

    To learn about securing this file appropriately, see the guidelines for securing an init.d service .

    A Spring Boot application can be started as a Windows service by using winsw .

    A sample ( maintained separately ) describes step-by-step how you can create a Windows service for your Spring Boot application.

    Check out the Cloud Foundry , Heroku , OpenShift , and Boxfuse web sites for more information about the kinds of features that a PaaS can offer. These are just four of the most popular Java PaaS providers. Since Spring Boot is so amenable to cloud-based deployment, you can freely consider other providers as well.

    The next section goes on to cover the Spring Boot CLI , or you can jump ahead to read about build tool plugins .

    Once you have installed the CLI, you can run it by typing spring and pressing Enter at the command line. If you run spring without any arguments, a simple help screen is displayed, as follows:

    $ spring
    usage: spring [--help] [--version]
           <command> [<args>]
    Available commands are:
      run [options] <files> [--] [args]
        Run a spring groovy script
      ... more command help is shown here

    You can type spring help to get more details about any of the supported commands, as shown in the following example:

    $ spring help run
    spring run - Run a spring groovy script
    usage: spring run [options] <files> [--] [args]
    Option                     Description
    ------                     -----------
    --autoconfigure [Boolean]  Add autoconfigure compiler
                                 transformations (default: true)
    --classpath, -cp           Additional classpath entries
    -e, --edit                 Open the file with the default system
                                 editor
    --no-guess-dependencies    Do not attempt to guess dependencies
    --no-guess-imports         Do not attempt to guess imports
    -q, --quiet                Quiet logging
    -v, --verbose              Verbose logging of dependency
                                 resolution
    --watch                    Watch the specified file for changes

    The version command provides a quick way to check which version of Spring Boot you are using, as follows:

    $ spring version
    Spring CLI v2.0.0.M7

    You can compile and run Groovy source code by using the run command. The Spring Boot CLI is completely self-contained, so you don’t need any external Groovy installation.

    The following example shows a “hello world” web application written in Groovy:

    hello.groovy.

    @RestController
    class WebApplication {
    	@RequestMapping("/")
    	String home() {
    		"Hello World!"
    

    To compile and run the application type the following command:

    $ spring run hello.groovy

    To pass command-line arguments to the application, use a -- to separate the commands from the “spring” command arguments, as shown in the following example:

    $ spring run hello.groovy -- --server.port=9000

    To set JVM command line arguments, you can use the JAVA_OPTS environment variable, as shown in the following example:

    $ JAVA_OPTS=-Xmx1024m spring run hello.groovy
    [Note]Note

    When setting JAVA_OPTS on Microsoft Windows, make sure to quote the entire instruction, such as set "JAVA_OPTS=-Xms256m -Xmx2048m". Doing so ensures the values are properly passed to the process.

    Standard Groovy includes a @Grab annotation, which lets you declare dependencies on third-party libraries. This useful technique lets Groovy download jars in the same way as Maven or Gradle would but without requiring you to use a build tool.

    Spring Boot extends this technique further and tries to deduce which libraries to “grab” based on your code. For example, since the WebApplication code shown previously uses @RestController annotations, Spring Boot grabs "Tomcat" and "Spring MVC".

    The following items are used as “grab hints”:

    ItemsGrabs

    JdbcTemplate, NamedParameterJdbcTemplate, DataSource

    JDBC Application.

    @EnableJms

    JMS Application.

    @EnableCaching

    Caching abstraction.

    @Test

    JUnit.

    @EnableRabbit

    RabbitMQ.

    @EnableReactor

    Project Reactor.

    extends Specification

    Spock test.

    @EnableBatchProcessing

    Spring Batch.

    @MessageEndpoint @EnableIntegrationPatterns

    Spring Integration.

    @Controller @RestController @EnableWebMvc

    Spring MVC + Embedded Tomcat.

    @EnableWebSecurity

    Spring Security.

    @EnableTransactionManagement

    Spring Transaction Management.

    [Tip]Tip

    See subclasses of CompilerAutoConfiguration in the Spring Boot CLI source code to understand exactly how customizations are applied.

    The init command lets you create a new project by using start.spring.io without leaving the shell, as shown in the following example:

    $ spring init --dependencies=web,data-jpa my-project
    Using service at https://start.spring.io
    Project extracted to '/Users/developer/example/my-project'

    The preceding example creates a my-project directory with a Maven-based project that uses spring-boot-starter-web and spring-boot-starter-data-jpa . You can list the capabilities of the service by using the --list flag, as shown in the following example:

    $ spring init --list
    =======================================
    Capabilities of https://start.spring.io
    =======================================
    Available dependencies:
    -----------------------
    actuator - Actuator: Production ready features to help you monitor and manage your application
    web - Web: Support for full-stack web development, including Tomcat and spring-webmvc
    websocket - Websocket: Support for WebSocket development
    ws - WS: Support for Spring Web Services
    Available project types:
    ------------------------
    gradle-build -  Gradle Config [format:build, build:gradle]
    gradle-project -  Gradle Project [format:project, build:gradle]
    maven-build -  Maven POM [format:build, build:maven]
    maven-project -  Maven Project [format:project, build:maven] (default)
    ...

    The init command supports many options. See the help output for more details. For instance, the following command creates a Gradle project that uses Java 8 and war packaging:

    $ spring init --build=gradle --java-version=1.8 --dependencies=websocket --packaging=war sample-app.zip
    Using service at https://start.spring.io
    Content saved to 'sample-app.zip'

    Spring Framework 4.0 has native support for a beans{} “DSL” (borrowed from Grails ), and you can embed bean definitions in your Groovy application scripts by using the same format. This is sometimes a good way to include external features like middleware declarations, as shown in the following example:

    @Configuration
    class Application implements CommandLineRunner {
    	@Autowired
    	SharedService service
    	@Override
    	void run(String... args) {
    		println service.message
    import my.company.SharedService
    beans {
    	service(SharedService) {
    		message = "Hello World"
    }

    You can mix class declarations with beans{} in the same file as long as they stay at the top level, or, if you prefer, you can put the beans DSL in a separate file.

    There are some sample groovy scripts available from the GitHub repository that you can use to try out the Spring Boot CLI. There is also extensive Javadoc throughout the source code .

    If you find that you reach the limit of the CLI tool, you probably want to look at converting your application to a full Gradle or Maven built “Groovy project”. The next section covers Spring Boot’s " Build tool plugins ", which you can use with Gradle or Maven.

    The Spring Boot Maven Plugin provides Spring Boot support in Maven, letting you package executable jar or war archives and run an application “in-place”. To use it, you must use Maven 3.2 (or later).

    [Note] Note

    See the Spring Boot Maven Plugin Site for complete plugin documentation.

    To use the Spring Boot Maven Plugin, include the appropriate XML in the plugins section of your pom.xml , as shown in the following example:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<!-- ... -->
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    				<version>2.0.0.M7</version>
    				<executions>
    					<execution>
    						<goals>
    							<goal>repackage</goal>
    						</goals>
    					</execution>
    				</executions>
    			</plugin>
    		</plugins>
    	</build>
    </project>

    The preceding configuration repackages a jar or war that is built during the package phase of the Maven lifecycle. The following example shows both the repackaged jar as well as the original jar in the target directory:

    $ mvn package
    $ ls target/*.jar
    target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original

    If you do not include the <execution/> configuration as shown in the prior example, you can run the plugin on its own (but only if the package goal is used as well). For example:

    $ mvn package spring-boot:repackage
    $ ls target/*.jar
    target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original

    If you use a milestone or snapshot release, you also need to add the appropriate pluginRepository elements as shown in the following listing:

    <pluginRepositories>
    	<pluginRepository>
    		<id>spring-snapshots</id>
    		<url>http://repo.spring.io/snapshot</url>
    	</pluginRepository>
    	<pluginRepository>
    		<id>spring-milestones</id>
    		<url>http://repo.spring.io/milestone</url>
    	</pluginRepository>
    </pluginRepositories>

    Once spring-boot-maven-plugin has been included in your pom.xml , it automatically tries to rewrite archives to make them executable by using the spring-boot:repackage goal. You should configure your project to build a jar or war (as appropriate) by using the usual packaging element, as shown in the following example:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<!-- ... -->
    	<packaging>jar</packaging>
    	<!-- ... -->
    </project>

    Your existing archive is enhanced by Spring Boot during the package phase. The main class that you want to launch can either be specified by using a configuration option or by adding a Main-Class attribute to the manifest in the usual way. If you do not specify a main class, the plugin searches for a class with a public static void main(String[] args) method.

    To build and run a project artifact, you can type the following:

    $ mvn package
    $ java -jar target/mymodule-0.0.1-SNAPSHOT.jar

    To build a war file that is both executable and deployable into an external container, you need to mark the embedded container dependencies as “provided”, as shown in the following example:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<!-- ... -->
    	<packaging>war</packaging>
    	<!-- ... -->
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-tomcat</artifactId>
    			<scope>provided</scope>
    		</dependency>
    		<!-- ... -->
    	</dependencies>
    </project>
    [Tip] Tip

    See the “ Section 86.1, “Create a Deployable War File” ” section for more details on how to create a deployable war file.

    Advanced configuration options and examples are available in the plugin info page .

    The Spring Boot AntLib module provides basic Spring Boot support for Apache Ant. You can use the module to create executable jars. To use the module, you need to declare an additional spring-boot namespace in your build.xml , as shown in the following example:

    <project xmlns:ivy="antlib:org.apache.ivy.ant"
    	xmlns:spring-boot="antlib:org.springframework.boot.ant"
    	name="myapp" default="build">
    </project>

    You need to remember to start Ant using the -lib option, as shown in the following example:

    $ ant -lib <folder containing spring-boot-antlib-2.0.0.M7.jar>
    [Tip] Tip

    The “Using Spring Boot” section includes a more complete example of using Apache Ant with spring-boot-antlib .

    If you want to use a build tool other than Maven, Gradle, or Ant, you likely need to develop your own plugin. Executable jars need to follow a specific format and certain entries need to be written in an uncompressed form (see the “ executable jar format ” section in the appendix for details).

    The Spring Boot Maven and Gradle plugins both make use of spring-boot-loader-tools to actually generate jars. If you need to, you may use this library directly.

    If you do not use Repackager.setMainClass() to specify a main class, the repackager uses ASM to read class files and tries to find a suitable class with a public static void main(String[] args) method. An exception is thrown if more than one candidate is found.

    If you are interested in how the build tool plugins work, you can look at the spring-boot-tools module on GitHub. More technical details of the executable jar format are covered in the appendix .

    If you have specific build-related questions, you can check out the “ how-to ” guides.

    This section provides answers to some common ‘how do I do that…​’ questions that often arise when using Spring Boot. Its coverage is not exhaustive, but it does cover quite a lot.

    If you have a specific problem that we do not cover here, you might want to check out stackoverflow.com to see if someone has already provided an answer. This is also a great place to ask new questions (please use the spring-boot tag).

    We are also more than happy to extend this section. If you want to add a ‘how-to’, send us a pull request .

    FailureAnalyzer is a great way to intercept an exception on startup and turn it into a human-readable message, wrapped in a FailureAnalysis . Spring Boot provides such an analyzer for application-context-related exceptions, JSR-303 validations, and more. You can also create your own.

    AbstractFailureAnalyzer is a convenient extension of FailureAnalyzer that checks the presence of a specified exception type in the exception to handle. You can extend from that so that your implementation gets a chance to handle the exception only when it is actually present. If, for whatever reason, you cannot handle the exception, return null to give another implementation a chance to handle the exception.

    FailureAnalyzer implementations must be registered in META-INF/spring.factories . The following example registers ProjectConstraintViolationFailureAnalyzer :

    org.springframework.boot.diagnostics.FailureAnalyzer=\
    com.example.ProjectConstraintViolationFailureAnalyzer

    The Spring Boot auto-configuration tries its best to ‘do the right thing’, but sometimes things fail, and it can be hard to tell why.

    There is a really useful ConditionEvaluationReport available in any Spring Boot ApplicationContext . You can see it if you enable DEBUG logging output. If you use the spring-boot-actuator , there is also a conditions endpoint that renders the report in JSON. Use that endpoint to debug the application and see what features have been added (and which not) by Spring Boot at runtime.

    Many more questions can be answered by looking at the source code and the Javadoc. When reading the code, remember the following rules of thumb:

    A SpringApplication has ApplicationListeners and ApplicationContextInitializers that are used to apply customizations to the context or environment. Spring Boot loads a number of such customizations for use internally from META-INF/spring.factories . There is more than one way to register additional ones:

    The SpringApplication sends some special ApplicationEvents to the listeners (some even before the context is created) and then registers the listeners for events published by the ApplicationContext as well. See “ Section 23.5, “Application Events and Listeners” ” in the ‘Spring Boot features’ section for a complete list.

    It is also possible to customize the Environment before the application context is refreshed by using EnvironmentPostProcessor . Each implementation should be registered in META-INF/spring.factories , as shown in the following example:

    org.springframework.boot.env.EnvironmentPostProcessor=com.example.YourEnvironmentPostProcessor

    The implementation can load arbitrary files and add them to the Environment . For instance, the following example loads a YAML configuration file from the classpath:

    public class EnvironmentPostProcessorExample implements EnvironmentPostProcessor {
    	private final YamlPropertySourceLoader loader = new YamlPropertySourceLoader();
    	@Override
    	public void postProcessEnvironment(ConfigurableEnvironment environment,
    			SpringApplication application) {
    		Resource path = new ClassPathResource("com/example/myapp/config.yml");
    		PropertySource<?> propertySource = loadYaml(path);
    		environment.getPropertySources().addLast(propertySource);
    	private PropertySource<?> loadYaml(Resource path) {
    		if (!path.exists()) {
    			throw new IllegalArgumentException("Resource " + path + " does not exist");
    		try {
    			return this.loader.load("custom-resource", path, null);
    		catch (IOException ex) {
    			throw new IllegalStateException(
    					"Failed to load yaml configuration from " + path, ex);
    }
    [Tip] Tip

    The Environment has already been prepared with all the usual property sources that Spring Boot loads by default. It is therefore possible to get the location of the file from the environment. This example adds the custom-resource property source at the end of the list so that a key defined in any of the usual other locations takes precedence. A custom implementation may define another order.

    [Caution] Caution

    While using @PropertySource on your @SpringBootApplication may seem convenient and easy enough to load a custom resource in the Environment , we do not recommend it as Spring Boot prepares the Environment before the ApplicationContext is refreshed. Any key defined via @PropertySource is loaded too late to have any effect on auto-configuration.

    Rather than hardcoding some properties that are also specified in your project’s build configuration, you can automatically expand them by instead using the existing build configuration. This is possible in both Maven and Gradle.

    You can automatically expand properties from the Maven project by using resource filtering. If you use the spring-boot-starter-parent , you can then refer to your Maven ‘project properties’ with @..@ placeholders, as shown in the following example:

    app.encoding[email protected]@
    app.java.version[email protected]@
    [Note] Note

    Only production configuration is filtered that way (in other words, no filtering is applied on src/test/resources ).

    [Tip] Tip

    If you enable the addResources flag, the spring-boot:run goal can add src/main/resources directly to the classpath (for hot reloading purposes). Doing so circumvents the resource filtering and this feature. Instead, you can use the exec:java goal or customize the plugin’s configuration, see the plugin usage page for more details.

    If you do not use the starter parent, you need to include the following element inside the <build/> element of your pom.xml :

    <resources>
    	<resource>
    		<directory>src/main/resources</directory>
    		<filtering>true</filtering>
    	</resource>
    </resources>

    You also need to include the following element inside <plugins/> :

    <plugin>
    	<groupId>org.apache.maven.plugins</groupId>
    	<artifactId>maven-resources-plugin</artifactId>
    	<version>2.7</version>
    	<configuration>
    		<delimiters>
    			<delimiter>@</delimiter>
    		</delimiters>
    		<useDefaultDelimiters>false</useDefaultDelimiters>
    	</configuration>
    </plugin>
    [Note] Note

    The useDefaultDelimiters property is important if you use standard Spring placeholders (such as ${placeholder} ) in your configuration. If that property is not set to false , these may be expanded by the build.

    You can automatically expand properties from the Gradle project by configuring the Java plugin’s processResources task to do so, as shown in the following example:

    processResources {
    	expand(project.properties)
    }

    You can then refer to your Gradle project’s properties via placeholders, as shown in the following example:

    app.name=${name}
    app.description=${description}
    [Note] Note

    Gradle’s expand method uses Groovy’s SimpleTemplateEngine , which transforms ${..} tokens. The ${..} style conflicts with Spring’s own property placeholder mechanism. To use Spring property placeholders together with automatic expansion, escape the Spring property placeholders as follows: \${..} .

    By default, properties from different sources are added to the Spring Environment in a defined order (see “ Chapter 24, Externalized Configuration ” in the ‘Spring Boot features’ section for the exact order).

    A nice way to augment and modify this ordering is to add @PropertySource annotations to your application sources. Classes passed to the SpringApplication static convenience methods and those added using setSources() are inspected to see if they have @PropertySources . If they do, those properties are added to the Environment early enough to be used in all phases of the ApplicationContext lifecycle. Properties added in this way have lower priority than any added by using the default locations (such as application.properties ), system properties, environment variables, or the command line.

    You can also provide the following System properties (or environment variables) to change the behavior:

    • spring.config.name ( SPRING_CONFIG_NAME ): Defaults to application as the root of the file name.
    • spring.config.location ( SPRING_CONFIG_LOCATION ): The file to load (such as a classpath resource or a URL). A separate Environment property source is set up for this document and it can be overridden by system properties, environment variables, or the command line.

    No matter what you set in the environment, Spring Boot always loads application.properties as described above. By default, if YAML is used, then files with the ‘.yml’ extension are also added to the list.

    Spring Boot logs the configuration files that are loaded at the DEBUG level and the candidates it has not found at TRACE level.

    See ConfigFileApplicationListener for more detail.

    Some people like to use (for example) --port=9000 instead of --server.port=9000 to set configuration properties on the command line. You can enable this behavior by using placeholders in application.properties , as shown in the following example:

    server.port=${port:8080}
    [Tip] Tip

    If you inherit from the spring-boot-starter-parent POM, the default filter token of the maven-resources-plugins has been changed from ${*} to @ (that is, @maven.token@ instead of ${maven.token} ) to prevent conflicts with Spring-style placeholders. If you have enabled maven filtering for the application.properties directly, you may want to also change the default filter token to use other delimiters .

    [Note] Note

    In this specific case, the port binding works in a PaaS environment such as Heroku or Cloud Foundry In those two platforms, the PORT environment variable is set automatically and Spring can bind to capitalized synonyms for Environment properties.

    Each Spring Boot web application includes an embedded web server. This feature leads to a number of how-to questions, including how to change the embedded server and how to configure the embedded server. This section answers those questions.

    Many Spring Boot starters include default embedded containers. spring-boot-starter-web includes Tomcat by including spring-boot-starter-tomcat , but you can use spring-boot-starter-jetty and spring-boot-starter-undertow instead. spring-boot-starter-webflux includes Reactor Netty by including spring-boot-starter-reactor-netty , but you can use spring-boot-starter-tomcat , spring-boot-starter-jetty , and spring-boot-starter-undertow instead.

    [Note] Note

    Many starters support only Spring MVC, so they transitively bring spring-boot-starter-web into your application classpath.

    If you need to use a different HTTP server, you need to exclude the default dependencies and include the one you need. Spring Boot provides separate starters for HTTP servers to help make this process as easy as possible.

    The following Maven example shows how to exclude Tomcat and include Jetty for Spring MVC:

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-web</artifactId>
    	<exclusions>
    		<!-- Exclude the Tomcat dependency -->
    		<exclusion>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-tomcat</artifactId>
    		</exclusion>
    	</exclusions>
    </dependency>
    <!-- Use Jetty instead -->
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-jetty</artifactId>
    </dependency>

    The following Gradle example shows how to exclude Netty and include Undertow for Spring WebFlux:

    configurations {
    	// exclude Reactor Netty
    	compile.exclude module: 'spring-boot-starter-reactor-netty'
    dependencies {
    	compile 'org.springframework.boot:spring-boot-starter-webflux'
    	// Use Undertow instead
    	compile 'org.springframework.boot:spring-boot-starter-undertow'
    	// ...
    }
    [Note] Note

    spring-boot-starter-reactor-netty is required to use the WebClient class, so you may need to keep a dependency on Netty even when you need to include a different HTTP server.

    Generally, you can follow the advice from “ Section 73.8, “Discover Built-in Options for External Properties” ” about @ConfigurationProperties ( ServerProperties is the main one here). However, you should also look at ServletWebServerFactoryCustomizer . The Jetty APIs are quite rich, so, once you have access to the JettyServletWebServerFactory , you can modify it in a number of ways. Alternatively, if you need more control and customization, you can add your own JettyServletWebServerFactory .

    There are two ways to add Servlet , Filter , ServletContextListener , and the other listeners supported by the Servlet spec to your application. You can either provide Spring beans for them or enable scanning for Servlet components.

    To add a Servlet , Filter , or Servlet *Listener by using a Spring bean, you must provide a @Bean definition for it. Doing so can be very useful when you want to inject configuration or dependencies. However, you must be very careful that they do not cause eager initialization of too many other beans, because they have to be installed in the container very early in the application lifecycle (for example, it is not a good idea to have them depend on your DataSource or JPA configuration). You can work around restrictions like that by initializing the beans lazily when first used instead of on initialization.

    In the case of Filters and Servlets , you can also add mappings and init parameters by adding a FilterRegistrationBean or a ServletRegistrationBean instead of or in addition to the underlying component.

    [Note] Note

    If no dispatcherType is specified on a filter registration, REQUEST is used. This aligns with the Servlet Specification’s default dispatcher type.

    As described above , any Servlet or Filter beans are registered with the servlet container automatically. To disable registration of a particular Filter or Servlet bean, create a registration bean for it and mark it as disabled, as shown in the following example:

    @Bean
    public FilterRegistrationBean registration(MyFilter filter) {
    	FilterRegistrationBean registration = new FilterRegistrationBean(filter);
    	registration.setEnabled(false);
    	return registration;
    }

    SSL can be configured declaratively by setting the various server.ssl.* properties, typically in application.properties or application.yml . The following example shows setting SSL properties in application.properties :

    server.port=8443
    server.ssl.key-store=classpath:keystore.jks
    server.ssl.key-store-password=secret
    server.ssl.key-password=another-secret

    See Ssl for details of all of the supported properties.

    Using configuration such as the preceding example means the application no longer supports a plain HTTP connector at port 8080. Spring Boot does not support the configuration of both an HTTP connector and an HTTPS connector through application.properties . If you want to have both, you need to configure one of them programmatically. We recommend using application.properties to configure HTTPS, as the HTTP connector is the easier of the two to configure programmatically. See the spring-boot-sample-tomcat-multi-connectors sample project for an example.

    You can enable HTTP/2 support in your Spring Boot application with the server.http2.enabled configuration property. This support depends on the chosen web server and the application environment, since that protocol is not supported out-of-the-box by JDK8.

    [Note] Note

    Spring Boot does not support h2c , the cleartext version of the HTTP/2 protocol. So you must configure configure SSL first .

    Currently, only Undertow and Tomcat are supported with this configuration key.

    Spring Boot ships by default with Tomcat 8.5.x; with that version, HTTP/2 is only supported if the libtcnative library and its dependencies are installed on the host operating system.

    The library folder must be made available, if not already, to the JVM library path; this can be done with a JVM argument such as -Djava.library.path=/usr/local/opt/tomcat-native/lib . More on this in the official Tomcat documentation .

    Starting Tomcat 8.5.x without that native support will log the following error:

    ERROR 8787 --- [           main] o.a.coyote.http11.Http11NioProtocol      : The upgrade handler [org.apache.coyote.http2.Http2Protocol] for [h2] only supports upgrade via ALPN but has been configured for the ["https-jsse-nio-8443"] connector that does not support ALPN.

    This error is not fatal, and the application starts with HTTP/1.1 SSL support still.

    Running your application with Tomcat 9.0.x and JDK9 doesn’t require any native library installed. To use Tomcat 9, you can override the tomcat.version build property with the version of your choice.

    Access logs can be configured for Tomcat, Undertow, and Jetty through their respective namespaces.

    For instance, the following settings log access on Tomcat with a custom pattern .

    server.tomcat.basedir=my-tomcat
    server.tomcat.accesslog.enabled=true
    server.tomcat.accesslog.pattern=%t %a "%r" %s (%D ms)
    [Note] Note

    The default location for logs is a logs directory relative to the Tomcat base directory. By default, the logs directory is a temporary directory, so you may want to fix Tomcat’s base directory or use an absolute path for the logs. In the preceding example, the logs are available in my-tomcat/logs relative to the working directory of the application.

    Access logging for undertow can be configured in a similar fashion, as shown in the following example:

    server.undertow.accesslog.enabled=true
    server.undertow.accesslog.pattern=%t %a "%r" %s (%D ms)

    Logs are stored in a logs directory relative to the working directory of the application. You can customize this location by setting the server.undertow.accesslog.directory property.

    Finally, access logging for Jetty can also be configured as follows:

    server.jetty.accesslog.enabled=true
    server.jetty.accesslog.filename=/var/log/jetty-access.log

    By default, logs are redirected to System.err . For more details, see the documentation .

    Your application might need to send 302 redirects or render content with absolute links back to itself. When running behind a proxy, the caller wants a link to the proxy and not to the physical address of the machine hosting your app. Typically, such situations are handled through a contract with the proxy, which adds headers to tell the back end how to construct links to itself.

    If the proxy adds conventional X-Forwarded-For and X-Forwarded-Proto headers (most proxy server do so), the absolute links should be rendered correctly, provided server.use-forward-headers is set to true in your application.properties .

    [Note] Note

    If your application runs in Cloud Foundry or Heroku, the server.use-forward-headers property defaults to true . In all other instances, it defaults to false .

    Generally, you can follow the advice from “ Section 73.8, “Discover Built-in Options for External Properties” ” about @ConfigurationProperties ( ServerProperties is the main one here). However, you should also look at ServletWebServerFactoryCustomizer and various Tomcat-specific *Customizers that you can add. The Tomcat APIs are quite rich, so, once you have access to the TomcatServletWebServerFactory , you can modify it in a number of ways. Alternatively, if you need more control and customization, you can add your own TomcatServletWebServerFactory .

    Generally you can follow the advice from “ Section 73.8, “Discover Built-in Options for External Properties” ” about @ConfigurationProperties ( ServerProperties and ServerProperties.Undertow are the main ones here). However, you should also look at ServletWebServerFactoryCustomizer . Once you have access to the UndertowServletWebServerFactory , you can use an UndertowBuilderCustomizer to modify Undertow’s configuration to meet your needs. Alternatively, if you need more control and customization, you can add your own UndertowServletWebServerFactory .

    Spring Boot has a number of starters that include Spring MVC. Note that some starters include a dependency on Spring MVC rather than include it directly. This section answers common questions about Spring MVC and Spring Boot.

    Spring MVC (client and server side) uses HttpMessageConverters to negotiate content conversion in an HTTP exchange. If Jackson is on the classpath, you already get the default converter(s) provided by Jackson2ObjectMapperBuilder , an instance of which is auto-configured for you.

    The ObjectMapper (or XmlMapper for Jackson XML converter) instance (created by default) has the following customized properties:

    Spring Boot has also some features to make it easier to customize this behavior.

    You can configure the ObjectMapper and XmlMapper instances by using the environment. Jackson provides an extensive suite of simple on/off features that can be used to configure various aspects of its processing. These features are described in six enums (in Jackson) that map onto properties in the environment:

    Jackson enum Environment property

    com.fasterxml.jackson.databind.DeserializationFeature

    spring.jackson.deserialization.<feature_name>=true|false

    com.fasterxml.jackson.core.JsonGenerator.Feature

    spring.jackson.generator.<feature_name>=true|false

    com.fasterxml.jackson.databind.MapperFeature

    spring.jackson.mapper.<feature_name>=true|false

    com.fasterxml.jackson.core.JsonParser.Feature

    spring.jackson.parser.<feature_name>=true|false

    com.fasterxml.jackson.databind.SerializationFeature

    spring.jackson.serialization.<feature_name>=true|false

    com.fasterxml.jackson.annotation.JsonInclude.Include

    spring.jackson.default-property-inclusion=always|non_null|non_absent|non_default|non_empty

    For example, to enable pretty print, set spring.jackson.serialization.indent_output=true . Note that, thanks to the use of relaxed binding , the case of indent_output does not have to match the case of the corresponding enum constant, which is INDENT_OUTPUT .

    This environment-based configuration is applied to the auto-configured Jackson2ObjectMapperBuilder bean and applies to any mappers created by using the builder, including the auto-configured ObjectMapper bean.

    The context’s Jackson2ObjectMapperBuilder can be customized by one or more Jackson2ObjectMapperBuilderCustomizer beans. Such customizer beans can be ordered (Boot’s own customizer has an order of 0), letting additional customization be applied both before and after Boot’s customization.

    Any beans of type com.fasterxml.jackson.databind.Module are automatically registered with the auto-configured Jackson2ObjectMapperBuilder and are applied to any ObjectMapper instances that it creates. This provides a global mechanism for contributing custom modules when you add new features to your application.

    If you want to replace the default ObjectMapper completely, either define a @Bean of that type and mark it as @Primary or, if you prefer the builder-based approach, define a Jackson2ObjectMapperBuilder @Bean . Note that, in either case, doing so disables all auto-configuration of the ObjectMapper .

    If you provide any @Beans of type MappingJackson2HttpMessageConverter , they replace the default value in the MVC configuration. Also, a convenience bean of type HttpMessageConverters is provided (always available if you use the default MVC configuration). It has some useful methods to access the default and user-enhanced message converters.

    See the “ Section 75.4, “Customize the @ResponseBody Rendering” ” section and the WebMvcAutoConfiguration source code for more details.

    A ViewResolver is a core component of Spring MVC, translating view names in @Controller to actual View implementations. Note that ViewResolvers are mainly used in UI applications, rather than REST-style services (a View is not used to render a @ResponseBody ). There are many implementations of ViewResolver to choose from, and Spring on its own is not opinionated about which ones you should use. Spring Boot, on the other hand, installs one or two for you, depending on what it finds on the classpath and in the application context. The DispatcherServlet uses all the resolvers it finds in the application context, trying each one in turn until it gets a result, so, if you add your own, you have to be aware of the order and in which position your resolver is added.

    WebMvcAutoConfiguration adds the following ViewResolvers to your context:

    For more detail, see the following sections:

    Spring Boot offers a number of starters that work with HTTP clients. This section answers questions related to doing so.

    As described in Section 33.1, “RestTemplate Customization” , you can use a RestTemplateCustomizer with RestTemplateBuilder to build a customized RestTemplate . This is the recommended approach for creating a RestTemplate configured to use a proxy.

    The exact details of the proxy configuration depend on the underlying client request factory that is being used. The following example configures HttpComponentsClientRequestFactory with an HttpClient that uses a proxy for all hosts except 192.168.0.5 :

    static class ProxyCustomizer implements RestTemplateCustomizer {
    	@Override
    	public void customize(RestTemplate restTemplate) {
    		HttpHost proxy = new HttpHost("proxy.example.com");
    		HttpClient httpClient = HttpClientBuilder.create()
    				.setRoutePlanner(new DefaultProxyRoutePlanner(proxy) {
    					@Override
    					public HttpHost determineProxy(HttpHost target,
    							HttpRequest request, HttpContext context)
    									throws HttpException {
    						if (target.getHostName().equals("192.168.0.5")) {
    							return null;
    						return super.determineProxy(target, request, context);
    				}).build();
    		restTemplate.setRequestFactory(
    				new HttpComponentsClientHttpRequestFactory(httpClient));
    }

    Spring Boot has no mandatory logging dependency, except for the Commons Logging API, of which there are many implementations to choose from. To use Logback , you need to include it and jcl-over-slf4j (which implements the Commons Logging API) on the classpath. The simplest way to do that is through the starters, which all depend on spring-boot-starter-logging . For a web application, you need only spring-boot-starter-web , since it depends transitively on the logging starter. If you use Maven, the following dependency adds logging for you:

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    Spring Boot has a LoggingSystem abstraction that attempts to configure logging based on the content of the classpath. If Logback is available, it is the first choice.

    If the only change you need to make to logging is to set the levels of various loggers, you can do so in application.properties by using the "logging.level" prefix, as shown in the following example:

    logging.level.org.springframework.web=DEBUG
    logging.level.org.hibernate=ERROR

    You can also set the location of a file to which to write the log (in addition to the console) by using "logging.file".

    To configure the more fine-grained settings of a logging system, you need to use the native configuration format supported by the LoggingSystem in question. By default, Spring Boot picks up the native configuration from its default location for the system (such as classpath:logback.xml for Logback), but you can set the location of the config file by using the "logging.config" property.

    If you put a logback.xml in the root of your classpath, it is picked up from there (or from logback-spring.xml , to take advantage of the templating features provided by Boot). Spring Boot provides a default base configuration that you can include if you want to set levels, as shown in the following example:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    	<include resource="org/springframework/boot/logging/logback/base.xml"/>
    	<logger name="org.springframework.web" level="DEBUG"/>
    </configuration>

    If you look at base.xml in the spring-boot jar, you can see that it uses some useful System properties that the LoggingSystem takes care of creating for you:

    Spring Boot also provides some nice ANSI color terminal output on a console (but not in a log file) by using a custom Logback converter. See the default base.xml configuration for details.

    If Groovy is on the classpath, you should be able to configure Logback with logback.groovy as well. If present, this setting is given preference.

    Spring Boot supports Log4j 2 for logging configuration if it is on the classpath. If you use the starters for assembling dependencies, you have to exclude Logback and then include log4j 2 instead. If you do not use the starters, you need to provide (at least) jcl-over-slf4j in addition to Log4j 2.

    The simplest path is probably through the starters, even though it requires some jiggling with excludes. The following example shows how to set up the starters in Maven:

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter</artifactId>
    	<exclusions>
    		<exclusion>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-logging</artifactId>
    		</exclusion>
    	</exclusions>
    </dependency>
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    [Note] Note

    The Log4j starters gather together the dependencies for common logging requirements (such as having Tomcat use java.util.logging but configuring the output using Log4j 2). See the Actuator Log4j 2 samples for more detail and to see it in action.

    Spring Boot includes a number of starters for working with data sources. This section answers questions related to doing so.

    78.1 Configure a Custom DataSource

    To configure your own DataSource , define a @Bean of that type in your configuration. Spring Boot reuses your DataSource anywhere one is required, including database initialization. If you need to externalize some settings, you can bind your DataSource to the environment (see “ Section 24.7.1, “Third-party Configuration” ”).

    The following example shows how to define a data source in a bean:

    @Bean
    @ConfigurationProperties(prefix="app.datasource")
    public DataSource dataSource() {
    	return new FancyDataSource();
    }

    The following example shows how to define a data source by setting properties:

    app.datasource.url=jdbc:h2:mem:mydb
    app.datasource.username=sa
    app.datasource.pool-size=30

    Assuming that your FancyDataSource has regular JavaBean properties for the URL, the username, and the pool size, these settings are bound automatically before the DataSource is made available to other components. The regular database initialization also happens (so the relevant sub-set of spring.datasource.* can still be used with your custom configuration).

    You can apply the same principle if you configure a custom JNDI DataSource , as shown in the following example:

    @Bean(destroyMethod="")
    @ConfigurationProperties(prefix="app.datasource")
    public DataSource dataSource() throws Exception {
    	JndiDataSourceLookup dataSourceLookup = new JndiDataSourceLookup();
    	return dataSourceLookup.getDataSource("java:comp/env/jdbc/YourDS");
    }

    Spring Boot also provides a utility builder class, called DataSourceBuilder , that can be used to create one of the standard data sources (if it is on the classpath). The builder can detect the one to use based on what’s available on the classpath. It also auto-detects the driver based on the JDBC URL.

    The following example shows how to create a data source by using a DataSourceBuilder :

    @Bean
    @ConfigurationProperties("app.datasource")
    public DataSource dataSource() {
    	return DataSourceBuilder.create().build();
    }

    To run an app with that DataSource , all you need is the connection information. Pool-specific settings can also be provided. Check the implementation that is going to be used at runtime for more details.

    The following example shows how to define a JDBC data source by setting properties:

    app.datasource.url=jdbc:mysql://localhost/test
    app.datasource.username=dbuser
    app.datasource.password=dbpass
    app.datasource.pool-size=30

    However, there is a catch. Because the actual type of the connection pool is not exposed, no keys are generated in the metadata for your custom DataSource and no completion is available in your IDE (because the DataSource interface exposes no properties). Also, if you happen to have Hikari on the classpath, this basic setup does not work, because Hikari has no url property (but does have a jdbcUrl property). In that case, you must rewrite your configuration as follows:

    app.datasource.jdbc-url=jdbc:mysql://localhost/test
    app.datasource.username=dbuser
    app.datasource.password=dbpass
    app.datasource.maximum-pool-size=30

    You can fix that by forcing the connection pool to use and return a dedicated implementation rather than DataSource . You cannot change the implementation at runtime, but the list of options will be explicit.

    The following example shows how create a HikariDataSource with DataSourceBuilder :

    @Bean
    @ConfigurationProperties("app.datasource")
    public HikariDataSource dataSource() {
    	return DataSourceBuilder.create().type(HikariDataSource.class).build();
    }

    You can even go further by leveraging what DataSourceProperties does for you — that is, by providing a default embedded database with a sensible username and password if no URL is provided. You can easily initialize a DataSourceBuilder from the state of any DataSourceProperties object, so you could also inject the one Spring Boot creates automatically. However, that would split your configuration into two namespaces: url , username , password , type , and driver on spring.datasource and the rest on your custom namespace ( app.datasource ). To avoid that, you can redefine a custom DataSourceProperties on your custom namespace, as shown in the following example:

    @Bean
    @Primary
    @ConfigurationProperties("app.datasource")
    public DataSourceProperties dataSourceProperties() {
    	return new DataSourceProperties();
    @Bean
    @ConfigurationProperties("app.datasource")
    public HikariDataSource dataSource(DataSourceProperties properties) {
    	return properties.initializeDataSourceBuilder().type(HikariDataSource.class)
    			.build();
    }

    This setup puts you in sync with what Spring Boot does for you by default, except that a dedicated connection pool is chosen (in code) and its settings are exposed in the same namespace. Because DataSourceProperties is taking care of the url / jdbcUrl translation for you, you can configure it as follows:

    app.datasource.url=jdbc:mysql://localhost/test
    app.datasource.username=dbuser
    app.datasource.password=dbpass
    app.datasource.maximum-pool-size=30
    [Note] Note

    Because your custom configuration chooses to go with Hikari, app.datasource.type has no effect. In practice, the builder is initialized with whatever value you might set there and then overridden by the call to .type() .

    See “ Section 29.1, “Configure a DataSource” ” in the ‘Spring Boot features’ section and the DataSourceAutoConfiguration class for more details.

    If you need to configure multiple data sources, you can apply the same tricks that are described in the previous section. You must, however, mark one of the DataSource instances as @Primary , because various auto-configurations down the road expect to be able to get one by type.

    If you create your own DataSource , the auto-configuration backs off. In the following example, we provide the exact same feature set as the auto-configuration provides on the primary data source:

    @Bean
    @Primary
    @ConfigurationProperties("app.datasource.foo")
    public DataSourceProperties fooDataSourceProperties() {
    	return new DataSourceProperties();
    @Bean
    @Primary
    @ConfigurationProperties("app.datasource.foo")
    public DataSource fooDataSource() {
    	return fooDataSourceProperties().initializeDataSourceBuilder().build();
    @Bean
    @ConfigurationProperties("app.datasource.bar")
    public BasicDataSource barDataSource() {
    	return DataSourceBuilder.create().type(BasicDataSource.class).build();
    }
    [Tip] Tip

    fooDataSourceProperties has to be flagged as @Primary so that the database initializer feature uses your copy (if you use the initializer).

    Both data sources are also bound for advanced customizations. For instance, you could configure them as follows:

    app.datasource.foo.type=com.zaxxer.hikari.HikariDataSource
    app.datasource.foo.maximum-pool-size=30
    app.datasource.bar.url=jdbc:mysql://localhost/test
    app.datasource.bar.username=dbuser
    app.datasource.bar.password=dbpass
    app.datasource.bar.max-total=30

    You can apply the same concept to the secondary DataSource as well, as shown in the following example:

    @Bean
    @Primary
    @ConfigurationProperties("app.datasource.foo")
    public DataSourceProperties fooDataSourceProperties() {
    	return new DataSourceProperties();
    @Bean
    @Primary
    @ConfigurationProperties("app.datasource.foo")
    public DataSource fooDataSource() {
    	return fooDataSourceProperties().initializeDataSourceBuilder().build();
    @Bean
    @ConfigurationProperties("app.datasource.bar")
    public DataSourceProperties barDataSourceProperties() {
    	return new DataSourceProperties();
    @Bean
    @ConfigurationProperties("app.datasource.bar")
    public DataSource barDataSource() {
    	return barDataSourceProperties().initializeDataSourceBuilder().build();
    }

    The preceding example configures two data sources on custom namespaces with the same logic as Spring Boot would use in auto-configuration.

    Spring Data JPA already provides some vendor-independent configuration options (such as those for SQL logging), and Spring Boot exposes those options and a few more for Hibernate as external configuration properties. Some of them are automatically detected according to the context so you should not have to set them.

    The spring.jpa.hibernate.ddl-auto is a special case, because, depending on runtime conditions, it has different defaults. If an embedded database is used and no schema manager (such as Liquibase or Flyway) is handling the DataSource , it defaults to create-drop . In all other cases, it defaults to none .

    The dialect to use is also automatically detected based on the current DataSource , but you can set spring.jpa.database yourself if you want to be explicit and bypass that check on startup.

    [Note] Note

    Specifying a database leads to the configuration of a well-defined Hibernate dialect. Several databases have more than one Dialect , and this may not suit your need. In that case, you can either set spring.jpa.database to default to let Hibernate figure things out or set the dialect by setting the spring.jpa.database-platform property.

    The most common options to set are shown in the following example:

    spring.jpa.hibernate.naming.physical-strategy=com.example.MyPhysicalNamingStrategy
    spring.jpa.show-sql=true

    In addition, all properties in spring.jpa.properties.* are passed through as normal JPA properties (with the prefix stripped) when the local EntityManagerFactory is created.

    Hibernate uses two different naming strategies to map names from the object model to the corresponding database names. The fully qualified class name of the physical and the implicit strategy implementations can be configured by setting the spring.jpa.hibernate.naming.physical-strategy and spring.jpa.hibernate.naming.implicit-strategy properties, respectively. Alternatively, if ImplicitNamingStrategy or PhysicalNamingStrategy beans are available in the application context, Hibernate will be automatically configured to use them.

    By default, Spring Boot configures the physical naming strategy with SpringPhysicalNamingStrategy . This implementation provides the same table structure as Hibernate 4: all dots are replaced by underscores and camel casing is replaced by underscores as well. By default, all table names are generated in lower case, but it is possible to override that flag if your schema requires it.

    For example, a TelephoneNumber entity is mapped to the telephone_number table.

    If you prefer to use Hibernate 5’s default instead, set the following property:

    spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

    Alternatively, configure the following bean:

    @Bean
    public PhysicalNamingStrategy physicalNamingStrategy() {
    	return new PhysicalNamingStrategyStandardImpl();
    }

    See HibernateJpaAutoConfiguration and JpaBaseConfiguration for more details.

    Even if the default EntityManagerFactory works fine, you need to define a new one. Otherwise, the presence of the second bean of that type switches off the default. To make it easy to do, you can use the convenient EntityManagerBuilder provided by Spring Boot. Alternatively, you can just the LocalContainerEntityManagerFactoryBean directly from Spring ORM, as shown in the following example:

    // add two data sources configured as above
    @Bean
    public LocalContainerEntityManagerFactoryBean customerEntityManagerFactory(
    		EntityManagerFactoryBuilder builder) {
    	return builder
    			.dataSource(customerDataSource())
    			.packages(Customer.class)
    			.persistenceUnit("customers")
    			.build();
    @Bean
    public LocalContainerEntityManagerFactoryBean orderEntityManagerFactory(
    		EntityManagerFactoryBuilder builder) {
    	return builder
    			.dataSource(orderDataSource())
    			.packages(Order.class)
    			.persistenceUnit("orders")
    			.build();
    }

    The configuration above almost works on its own. To complete the picture, you need to configure TransactionManagers for the two EntityManagers as well. One of them could be picked up by the default JpaTransactionManager in Spring Boot if you mark it as @Primary . The other would have to be explicitly injected into a new instance. Alternatively, you might be able to use a JTA transaction manager that spans both.

    If you are using Spring Data, you need to configure @EnableJpaRepositories accordingly, as shown in the following example:

    @Configuration
    @EnableJpaRepositories(basePackageClasses = Customer.class,
    		entityManagerFactoryRef = "customerEntityManagerFactory")
    public class CustomerConfiguration {
    @Configuration
    @EnableJpaRepositories(basePackageClasses = Order.class,
    		entityManagerFactoryRef = "orderEntityManagerFactory")
    public class OrderConfiguration {
    }

    Spring Data REST can expose the Repository implementations as REST endpoints for you, provided Spring MVC has been enabled for the application.

    Spring Boot exposes a set of useful properties (from the spring.data.rest namespace) that customize the RepositoryRestConfiguration . If you need to provide additional customization, you should use a RepositoryRestConfigurer bean.

    [Note] Note

    If you do not specify any order on your custom RepositoryRestConfigurer , it runs after the one Spring Boot uses internally. If you need to specify an order, make sure it is higher than 0.

    An SQL database can be initialized in different ways depending on what your stack is. Of course, you can also do it manually, provided the database is a separate process.

    Spring Boot supports two higher-level migration tools: Flyway and Liquibase .

    To automatically run Flyway database migrations on startup, add the org.flywaydb:flyway-core to your classpath.

    The migrations are scripts in the form V<VERSION>__<NAME>.sql (with <VERSION> an underscore-separated version, such as ‘1’ or ‘2_1’). By default, they live in a folder called classpath:db/migration , but you can modify that location by setting spring.flyway.locations . You can also add a special {vendor} placeholder to use vendor-specific scripts. Assume the following:

    spring.flyway.locations=db/migration/{vendor}

    Rather than using db/migration , the preceding configuration sets the folder to use according to the type of the database (such as db/migration/mysql for MySQL). The list of supported database are available in DatabaseDriver .

    See the Flyway class from flyway-core for details of available settings such as schemas and others. In addition, Spring Boot provides a small set of properties (in FlywayProperties ) that can be used to disable the migrations or switch off the location checking. Spring Boot calls Flyway.migrate() to perform the database migration. If you would like more control, provide a @Bean that implements FlywayMigrationStrategy .

    Flyway supports SQL and Java callbacks . To use SQL-based callbacks, place the callback scripts in the classpath:db/migration folder. To use Java-based callbacks, create one or more beans that implement FlywayCallback or, preferably, extend BaseFlywayCallback . Any such beans are automatically registered with Flyway . They can be ordered by using @Order or by implementing Ordered .

    By default, Flyway autowires the ( @Primary ) DataSource in your context and uses that for migrations. If you like to use a different DataSource , you can create one and mark its @Bean as @FlywayDataSource . If you do so and want two data sources, remember to create another one and mark it as @Primary . Alternatively, you can use Flyway’s native DataSource by setting spring.flyway.[url,user,password] in external properties.

    There is a Flyway sample so that you can see how to set things up.

    You can also use Flyway to provide data for specific scenarios. For example, you can place test-specific migrations in src/test/resources and they are run only when your application starts for testing. If you want to be more sophisticated, you can use profile-specific configuration to customize spring.flyway.locations so that certain migrations run only when a particular profile is active. For example, in application-dev.properties , you might specify the following setting:

    spring.flyway.locations=classpath:/db/migration,classpath:/dev/db/migration

    With that setup, migrations in dev/db/migration run only when the dev profile is active.

    [Note] Note

    By default, batch applications require a DataSource to store job details. If you want to deviate from that, you need to implement BatchConfigurer . See Javadoc of @EnableBatchProcessing for more details.

    Spring Batch auto-configuration is enabled by adding @EnableBatchProcessing (from Spring Batch) somewhere in your context.

    By default, it executes all Jobs in the application context on startup (see JobLauncherCommandLineRunner for details). You can narrow down to a specific job or jobs by specifying spring.batch.job.names (comma-separated job name patterns).

    If the application context includes a JobRegistry , the jobs in spring.batch.job.names are looked up in the registry instead of being autowired from the context. This is a common pattern with more complex systems, where multiple jobs are defined in child contexts and registered centrally.

    See BatchAutoConfiguration @EnableBatchProcessing for more details.

    Spring Boot includes the Spring Boot Actuator. This section answers questions that often arise from its use.

    If you provide a @Bean of type AuthenticationManager , the default one is not created, so you have the full feature set of Spring Security available (such as various authentication options ).

    Spring Security also provides a convenient AuthenticationManagerBuilder , which can be used to build an AuthenticationManager with common options. The recommended way to use this in a webapp is to inject it into a void method in a WebSecurityConfigurerAdapter , as shown in the following example:

    @Configuration
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    	@Autowired
    	public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    			auth.inMemoryAuthentication()
    				.withUser("barry").password("password").roles("USER"); // ... etc.
    	// ... other stuff for application security
    }

    You get the best results if you put this in a nested class or a standalone class (that is, not mixed in with a lot of other @Beans that might be allowed to influence the order of instantiation). The secure web sample is a useful template to follow.

    If you experience instantiation issues (for example, when using JDBC or JPA for the user detail store), it might be worth extracting the AuthenticationManagerBuilder callback into a GlobalAuthenticationConfigurerAdapter (in the init() method so that it happens before the authentication manager is needed elsewhere), as shown in the following example:

    @Configuration
    public class AuthenticationManagerConfiguration extends
    		GlobalAuthenticationConfigurerAdapter {
    	@Override
    	public void init(AuthenticationManagerBuilder auth) {
    		auth.inMemoryAuthentication() // ... etc.
    }

    Spring Boot supports hot swapping. This section answers questions about how it works.

    There are several options for hot reloading. The recommended approach is to use spring-boot-devtools , as it provides additional development-time features, such as support for fast application restarts and LiveReload as well as sensible development-time configuration (such as template caching). Devtools works by monitoring the classpath for changes. This means that static resource changes must be "built" for the change to take affect. By default, this happens automatically in Eclipse when you save your changes. In IntelliJ IDEA, Make Project triggers the necessary build. Due to the default restart exclusions , changes to static resources do not trigger a restart of your application. They do, however, trigger a live reload.

    Alternatively, running in an IDE (especially with debugging on) is a good way to do development (all modern IDEs allow reloading of static resources and usually also hot-swapping of Java class changes).

    Finally, the Maven and Gradle plugins can be configured (see the addResources property) to support running from the command line with reloading of static files directly from source. You can use that with an external css/js compiler process if you are writing that code with higher-level tools.

    The spring-boot-devtools module includes support for automatic application restarts. While not as fast as technologies such as JRebel it is usually significantly faster than a “cold start”. You should probably give it a try before investigating some of the more complex reload options discussed later in this document.

    For more details, see the Chapter 20, Developer Tools section.

    Spring Boot includes build plugins for Maven and Gradle. This section answers common questions about these plugins.

    85.2 Generate Git Information

    Both Maven and Gradle allow generating a git.properties file containing information about the state of your git source code repository when the project was built.

    For Maven users, the spring-boot-starter-parent POM includes a pre-configured plugin to generate a git.properties file. To use it, add the following declaration to your POM:

    <build>
    	<plugins>
    		<plugin>
    			<groupId>pl.project13.maven</groupId>
    			<artifactId>git-commit-id-plugin</artifactId>
    		</plugin>
    	</plugins>
    </build>

    Gradle users can achieve the same result by using the gradle-git-properties plugin, as shown in the following example:

    plugins {
    	id "com.gorylenko.gradle-git-properties" version "1.4.17"
    }
    [Tip] Tip

    The commit time in git.properties is expected to match the following format: yyyy-MM-dd’T’HH:mm:ssZ . This is the default format for both plugins listed above. Using this format allows the time to be parsed into a Date and its format, when serialized to JSON, to be controlled by Jackson’s date serialization configuration settings.

    If you use a Maven build that inherits directly or indirectly from spring-boot-dependencies (for instance spring-boot-starter-parent ) but you want to override a specific third-party dependency, you can add appropriate <properties> elements. Browse the spring-boot-dependencies POM for a complete list of properties. For example, to pick a different slf4j version you would add the following property:

    <properties>
    	<slf4j.version>1.7.5<slf4j.version>
    </properties>
    [Note] Note

    Doing so only works if your Maven project inherits (directly or indirectly) from spring-boot-dependencies . If you have added spring-boot-dependencies in your own dependencyManagement section with <scope>import</scope> , you have to redefine the artifact yourself instead of overriding the property.

    [Warning] Warning

    Each Spring Boot release is designed and tested against a specific set of third-party dependencies. Overriding versions may cause compatibility issues.

    Like a war file, a Spring Boot application is not intended to be used as a dependency. If your application contains classes that you want to share with other projects, the recommended approach is to move that code into a separate module. The separate module can then be depended upon by your application and other projects.

    If you cannot rearrange your code as recommended above, Spring Boot’s Maven and Gradle plugins must be configured to produce a separate artifact that is suitable for use as a dependency. The executable archive cannot be used as a dependency as the executable jar format packages application classes in BOOT-INF/classes . This means that they cannot be found when the executable jar is used as a dependency.

    To produce the two artifacts, one that can be used as a dependency and one that is executable, a classifier must be specified. This classifier is applied to the name of the executable archive, leaving the default archive for use as a dependency.

    To configure a classifier of exec in Maven, the following configuration can be used:

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

    To build with Ant, you need to grab dependencies, compile, and then create a jar or war archive. To make it executable, you can either use the spring-boot-antlib module or you can follow these instructions:

    The following example shows how to build an executable archive with Ant:

    <target name="build" depends="compile">
    	<jar destfile="target/${ant.project.name}-${spring-boot.version}.jar" compress="false">
    		<mappedresources>
    			<fileset dir="target/classes" />
    			<globmapper from="*" to="BOOT-INF/classes/*"/>
    		</mappedresources>
    		<mappedresources>
    			<fileset dir="src/main/resources" erroronmissingdir="false"/>
    			<globmapper from="*" to="BOOT-INF/classes/*"/>
    		</mappedresources>
    		<mappedresources>
    			<fileset dir="${lib.dir}/runtime" />
    			<globmapper from="*" to="BOOT-INF/lib/*"/>
    		</mappedresources>
    		<zipfileset src="${lib.dir}/loader/spring-boot-loader-jar-${spring-boot.version}.jar" />
    		<manifest>
    			<attribute name="Main-Class" value="org.springframework.boot.loader.JarLauncher" />
    			<attribute name="Start-Class" value="${start-class}" />
    		</manifest>
    </target>

    The Ant Sample has a build.xml file with a manual task that should work if you run it with the following command:

    $ ant -lib <folder containing ivy-2.2.jar> clean manual

    Then you can run the application with the following command:

    $ java -jar target/*.jar

    Spring Boot supports traditional deployment as well as more modern forms of deployment. This section answers common questions about traditional deployment.

    The first step in producing a deployable war file is to provide a SpringBootServletInitializer subclass and override its configure method. Doing so makes use of Spring Framework’s Servlet 3.0 support and lets you configure your application when it is launched by the servlet container. Typically, you should update your application’s main class to extend SpringBootServletInitializer , as shown in the following example:

    @SpringBootApplication
    public class Application extends SpringBootServletInitializer {
    	@Override
    	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    		return application.sources(Application.class);
    	public static void main(String[] args) throws Exception {
    		SpringApplication.run(Application.class, args);
    }

    The next step is to update your build configuration such that your project produces a war file rather than a jar file. If you use Maven and spring-boot-starter-parent (which configures Maven’s war plugin for you) all you need to do is to modify pom.xml to change the packaging to war, as follows:

    <packaging>war</packaging>

    If you use Gradle, you need to modify build.gradle to apply the war plugin to the project, as follows:

    apply plugin: 'war'

    The final step in the process is to ensure that the embedded servlet container does not interfere with the servlet container to which the war file is deployed. To do so, you need to mark the embedded servlet container dependency as being provided.

    If you use Maven, the following example marks the servlet container (Tomcat, in this case) as being provided:

    <dependencies>
    	<!-- … -->
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-tomcat</artifactId>
    		<scope>provided</scope>
    	</dependency>
    	<!-- … -->
    </dependencies>

    If you use Gradle, the following example marks the servlet container (Tomcat, in this case) as being provided:

    dependencies {
    	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    }
    [Note] Note

    providedRuntime is preferred to Gradle’s compileOnly configuration. Among other limitations, compileOnly dependencies are not on the test classpath so any web-based integration tests fail.

    If you use the Spring Boot build tools , marking the embedded servlet container dependency as provided produces an executable war file with the provided dependencies packaged in a lib-provided directory. This means that, in addition to being deployable to a servlet container, you can also run your application by using java -jar on the command line.

    [Tip] Tip

    Take a look at Spring Boot’s sample applications for a Maven-based example of the previously described configuration.

    For a non-web application, it should be easy to convert an existing Spring application to a Spring Boot application. To do so, throw away the code that creates your ApplicationContext and replace it with calls to SpringApplication or SpringApplicationBuilder . Spring MVC web applications are generally amenable to first creating a deployable war application and then migrating it later to an executable war or jar. See the Getting Started Guide on Converting a jar to a war .

    To create a deployable war by extending SpringBootServletInitializer (for example, in a class called Application ) and add the Spring Boot @SpringBootApplication annotation, use code similar to that shown in the following example:

    @SpringBootApplication
    public class Application extends SpringBootServletInitializer {
    	@Override
    	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    		// Customize the application or call application.sources(...) to add sources
    		// Since our example is itself a @Configuration class (via @SpringBootApplication)
    		// we actually don't need to override this method.
    		return application;
    }

    Remember that, whatever you put in the sources is merely a Spring ApplicationContext . Normally, anything that already works should work here. There might be some beans you can remove later and let Spring Boot provide its own defaults for them, but it should be possible to get something working before you need to do that.

    Static resources can be moved to /public (or /static or /resources or /META-INF/resources ) in the classpath root. The same applies to messages.properties (which Spring Boot automatically detects in the root of the classpath).

    Vanilla usage of Spring DispatcherServlet and Spring Security should require no further changes. If you have other features in your application (for instance, using other servlets or filters), you may need to add some configuration to your Application context, by replacing those elements from the web.xml as follows:

    • A @Bean of type Servlet or ServletRegistrationBean installs that bean in the container as if it were a <servlet/> and <servlet-mapping/> in web.xml .
    • A @Bean of type Filter or FilterRegistrationBean behaves similarly (as a <filter/> and <filter-mapping/> ).
    • An ApplicationContext in an XML file can be added through an @ImportResource in your Application . Alternatively, simple cases where annotation configuration is heavily used already can be recreated in a few lines as @Bean definitions.

    Once the war file is working, you can make it executable by adding a main method to your Application , as shown in the following example:

    public static void main(String[] args) {
    	SpringApplication.run(Application.class, args);
    }
    [Note] Note

    If you intend to start your application as a war or as an executable application, you need to share the customizations of the builder in a method that is both available to the SpringBootServletInitializer callback and the main method, in a class similar to the following:

    @SpringBootApplication
    public class Application extends SpringBootServletInitializer {
    	@Override
    	protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
    		return configureApplication(builder);
    	public static void main(String[] args) {
    		configureApplication(new SpringApplicationBuilder()).run(args);
    	private static SpringApplicationBuilder configureApplication(SpringApplicationBuilder builder) {
    		return builder.sources(Application.class).bannerMode(Banner.Mode.OFF);
    }

    Applications can fall into more than one category:

    • Servlet 3.0+ applications with no web.xml .
    • Applications with a web.xml .
    • Applications with a context hierarchy.
    • Applications without a context hierarchy.

    All of these should be amenable to translation, but each might require slightly different techniques.

    Servlet 3.0+ applications might translate pretty easily if they already use the Spring Servlet 3.0+ initializer support classes. Normally, all the code from an existing WebApplicationInitializer can be moved into a SpringBootServletInitializer . If your existing application has more than one ApplicationContext (for example, if it uses AbstractDispatcherServletInitializer ) then you might be able to combine all your context sources into a single SpringApplication . The main complication you might encounter is if combining does not work and you need to maintain the context hierarchy. See the entry on building a hierarchy for examples. An existing parent context that contains web-specific features usually needs to be broken up so that all the ServletContextAware components are in the child context.

    Applications that are not already Spring applications might be convertible to Spring Boot applications, and the previously mentioned guidance may help. However, you may yet encounter problems. In that case, we suggest asking questions on Stack Overflow with a tag of spring-boot .

    To deploy a Spring Boot application to WebLogic, you must ensure that your servlet initializer directly implements WebApplicationInitializer (even if you extend from a base class that already implements it).

    A typical initializer for WebLogic should resemble the following example:

    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.context.web.SpringBootServletInitializer;
    import org.springframework.web.WebApplicationInitializer;
    @SpringBootApplication
    public class MyApplication extends SpringBootServletInitializer implements WebApplicationInitializer {
    }

    If you use Logback, you also need to tell WebLogic to prefer the packaged version rather than the version that was pre-installed with the server. You can do so by adding a WEB-INF/weblogic.xml file with the following contents:

    <?xml version="1.0" encoding="UTF-8"?>
    <wls:weblogic-web-app
    	xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    		http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd
    		http://xmlns.oracle.com/weblogic/weblogic-web-app
    		http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd">
    	<wls:container-descriptor>
    		<wls:prefer-application-packages>
    			<wls:package-name>org.slf4j</wls:package-name>
    		</wls:prefer-application-packages>
    	</wls:container-descriptor>
    </wls:weblogic-web-app>

    Spring Boot uses Servlet 3.0 APIs to initialize the ServletContext (register Servlets and so on), so you cannot use the same application in a Servlet 2.5 container. It is , however, possible to run a Spring Boot application on an older container with some special tools. If you include org.springframework.boot:spring-boot-legacy as a dependency ( maintained separately to the core of Spring Boot and currently available at 1.0.2.RELEASE), all you should need to do is create a web.xml and declare a context listener to create the application context and your filters and servlets. The context listener is a special purpose one for Spring Boot, but the rest of it is normal for a Spring application in Servlet 2.5. The following Maven example shows how to set up a Spring Boot project to run in a Servlet 2.5 container:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    	<context-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>demo.Application</param-value>
    	</context-param>
    	<listener>
    		<listener-class>org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener</listener-class>
    	</listener>
    	<filter>
    		<filter-name>metricsFilter</filter-name>
    		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    	</filter>
    	<filter-mapping>
    		<filter-name>metricsFilter</filter-name>
    		<url-pattern>/*</url-pattern>
    	</filter-mapping>
    	<servlet>
    		<servlet-name>appServlet</servlet-name>
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    		<init-param>
    			<param-name>contextAttribute</param-name>
    			<param-value>org.springframework.web.context.WebApplicationContext.ROOT</param-value>
    		</init-param>
    		<load-on-startup>1</load-on-startup>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>appServlet</servlet-name>
    		<url-pattern>/</url-pattern>
    	</servlet-mapping>
    </web-app>

    In the preceding example, we use a single application context (the one created by the context listener) and attach it to the DispatcherServlet by using an init parameter. This is normal in a Spring Boot application (you normally only have one application context).

    By default, the Spring Boot starter ( spring-boot-starter-data-redis ) uses Lettuce . You need to exclude that dependency and include the Jedis one instead. Spring Boot manages these dependencies to help make this process as easy as possible.

    The following example shows how to do so in Maven:

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-data-redis</artifactId>
    	<exclusions>
    		<exclusion>
    			<groupId>io.lettuce</groupId>
    			<artifactId>lettuce-core</artifactId>
    		</exclusion>
    	</exclusions>
    </dependency>
    <dependency>
    	<groupId>redis.clients</groupId>
    	<artifactId>jedis</artifactId>
    </dependency>

    The following example shows how to do so in Gradle:

    configurations {
    	compile.exclude module: "lettuce"
    dependencies {
    	compile("redis.clients:jedis")
    	// ...
    }

    Various properties can be specified inside your application.properties file, inside your application.yml file, or as command line switches. This appendix provides a list of common Spring Boot properties and references to the underlying classes that consume them.

    [Note] Note

    Property contributions can come from additional jar files on your classpath, so you should not consider this an exhaustive list. Also, you can define your own properties.

    [Warning] Warning

    This sample file is meant as a guide only. Do not copy and paste the entire content into your application. Rather, pick only the properties that you need.

    # ===================================================================
    # COMMON SPRING BOOT PROPERTIES
    # This sample file is provided as a guideline. Do NOT copy it in its
    # entirety to your own application.			   ^^^
    # ===================================================================
    # ----------------------------------------
    # CORE PROPERTIES
    # ----------------------------------------
    # BANNER
    banner.charset=UTF-8 # Banner file encoding.
    banner.location=classpath:banner.txt # Banner file location.
    banner.image.location=classpath:banner.gif # Banner image file location (jpg or png can also be used).
    banner.image.width= # Width of the banner image in chars (default 76)
    banner.image.height= # Height of the banner image in chars (default based on image height)
    banner.image.margin= # Left hand image margin in chars (default 2)
    banner.image.invert= # Whether images should be inverted for dark terminal themes (default false)
    # LOGGING
    logging.config= # Location of the logging configuration file. For instance, `classpath:logback.xml` for Logback
    logging.exception-conversion-word=%wEx # Conversion word used when logging exceptions.
    logging.file= # Log file name. For instance, `myapp.log`
    logging.file.max-history= # Maximum of archive log files to keep. Only supported with the default logback setup.
    logging.file.max-size= # Maximum log file size. Only supported with the default logback setup.
    logging.level.*= # Log levels severity mapping. For instance, `logging.level.org.springframework=DEBUG`
    logging.path= # Location of the log file. For instance, `/var/log`
    logging.pattern.console= # Appender pattern for output to the console. Supported only with the default Logback setup.
    logging.pattern.file= # Appender pattern for output to a file. Supported only with the default Logback setup.
    logging.pattern.level= # Appender pattern for log level (default: %5p). Supported only with the default Logback setup.
    logging.pattern.dateformat= # Appender pattern for log dateformat (default yyyy-MM-dd HH:mm:ss.SSS). Only supported with the default logback setup.
    logging.register-shutdown-hook=false # Register a shutdown hook for the logging system when it is initialized.
    # AOP
    spring.aop.auto=true # Add @EnableAspectJAutoProxy.
    spring.aop.proxy-target-class=true # Whether subclass-based (CGLIB) proxies are to be created (true), as opposed to standard Java interface-based proxies (false).
    # IDENTITY (ContextIdApplicationContextInitializer)
    spring.application.index= # Application index.
    spring.application.name= # Application name.
    # ADMIN (SpringApplicationAdminJmxAutoConfiguration)
    spring.application.admin.enabled=false # Whether to enable admin features for the application.
    spring.application.admin.jmx-name=org.springframework.boot:type=Admin,name=SpringApplication # JMX name of the application admin MBean.
    # AUTO-CONFIGURATION
    spring.autoconfigure.exclude= # Auto-configuration classes to exclude.
    # SPRING CORE
    spring.beaninfo.ignore=true # Whether to skip search of BeanInfo classes.
    # SPRING CACHE (CacheProperties)
    spring.cache.cache-names= # Comma-separated list of cache names to create if supported by the underlying cache manager.
    spring.cache.caffeine.spec= # The spec to use to create caches. See CaffeineSpec for more details on the spec format.
    spring.cache.couchbase.expiration=0ms # Entry expiration in milliseconds. By default, the entries never expire.
    spring.cache.ehcache.config= # The location of the configuration file to use to initialize EhCache.
    spring.cache.infinispan.config= # The location of the configuration file to use to initialize Infinispan.
    spring.cache.jcache.config= # The location of the configuration file to use to initialize the cache manager.
    spring.cache.jcache.provider= # Fully qualified name of the CachingProvider implementation to use to retrieve the JSR-107 compliant cache manager. Needed only if more than one JSR-107 implementation is available on the classpath.
    spring.cache.redis.cache-null-values=true # Allow caching null values.
    spring.cache.redis.key-prefix= # Key prefix.
    spring.cache.redis.time-to-live=0ms # Entry expiration. By default the entries never expire.
    spring.cache.redis.use-key-prefix=true # Whether to use the key prefix when writing to Redis.
    spring.cache.type= # Cache type. By default, auto-detected according to the environment.
    # SPRING CONFIG - using environment property only (ConfigFileApplicationListener)
    spring.config.additional-location= # Config file locations used in addition to the defaults.
    spring.config.location= # Config file locations.
    spring.config.name=application # Config file name.
    # HAZELCAST (HazelcastProperties)
    spring.hazelcast.config= # The location of the configuration file to use to initialize Hazelcast.
    # PROJECT INFORMATION (ProjectInfoProperties)
    spring.info.build.location=classpath:META-INF/build-info.properties # Location of the generated build-info.properties file.
    spring.info.git.location=classpath:git.properties # Location of the generated git.properties file.
    # JMX
    spring.jmx.default-domain= # JMX domain name.
    spring.jmx.enabled=true # Expose management beans to the JMX domain.
    spring.jmx.server=mbeanServer # MBeanServer bean name.
    # Email (MailProperties)
    spring.mail.default-encoding=UTF-8 # Default MimeMessage encoding.
    spring.mail.host= # SMTP server host. For instance, `smtp.example.com`
    spring.mail.jndi-name= # Session JNDI name. When set, takes precedence over other mail settings.
    spring.mail.password= # Login password of the SMTP server.
    spring.mail.port= # SMTP server port.
    spring.mail.properties.*= # Additional JavaMail session properties.
    spring.mail.protocol=smtp # Protocol used by the SMTP server.
    spring.mail.test-connection=false # Whether to test that the mail server is available on startup.
    spring.mail.username= # Login user of the SMTP server.
    # APPLICATION SETTINGS (SpringApplication)
    spring.main.banner-mode=console # Mode used to display the banner when the application runs.
    spring.main.sources= # Sources (class names, package names, or XML resource locations) to include in the ApplicationContext.
    spring.main.web-application-type= # Flag to explicitly request a specific type of web application. If not set, auto-detected based on the classpath.
    # FILE ENCODING (FileEncodingApplicationListener)
    spring.mandatory-file-encoding= # Expected character encoding the application must use.
    # INTERNATIONALIZATION (MessageSourceProperties)
    spring.messages.always-use-message-format=false # Whether to always apply the MessageFormat rules, parsing even messages without arguments.
    spring.messages.basename=messages # Comma-separated list of basenames, each following the ResourceBundle convention.
    spring.messages.cache-duration=-1 # Loaded resource bundle files cache duration. When not set, bundles are cached forever.
    spring.messages.encoding=UTF-8 # Message bundles encoding.
    spring.messages.fallback-to-system-locale=true # Whether to fall back to the system Locale if no files for a specific Locale have been found.
    spring.messages.use-code-as-default-message=false # Whether to use the message code as the default message instead of throwing a "NoSuchMessageException". Recommended during development only.
    # OUTPUT
    spring.output.ansi.enabled=detect # Configures the ANSI output.
    # PID FILE (ApplicationPidFileWriter)
    spring.pid.fail-on-write-error= # Fails if ApplicationPidFileWriter is used but it cannot write the PID file.
    spring.pid.file= # Location of the PID file to write (if ApplicationPidFileWriter is used).
    # PROFILES
    spring.profiles.active= # Comma-separated list (or list if using YAML) of active profiles.
    spring.profiles.include= # Unconditionally activate the specified comma-separated list of profiles (or list of profiles if using YAML).
    # QUARTZ SCHEDULER (QuartzProperties)
    spring.quartz.job-store-type=memory # Quartz job store type.
    spring.quartz.properties.*= # Additional Quartz Scheduler properties.
    spring.quartz.jdbc.initialize-schema=embedded # Database schema initialization mode.
    spring.quartz.jdbc.schema=classpath:org/quartz/impl/jdbcjobstore/tables_@@platform@@.sql # Path to the SQL file to use to initialize the database schema.
    # REACTOR (ReactorCoreProperties)
    spring.reactor.stacktrace-mode.enabled=false # Whether Reactor should collect stacktrace information at runtime.
    # SENDGRID (SendGridAutoConfiguration)
    spring.sendgrid.api-key= # SendGrid API key.
    spring.sendgrid.proxy.host= # SendGrid proxy host.
    spring.sendgrid.proxy.port= # SendGrid proxy port.
    # ----------------------------------------
    # WEB PROPERTIES
    # ----------------------------------------
    # EMBEDDED SERVER CONFIGURATION (ServerProperties)
    server.address= # Network address to which the server should bind.
    server.compression.enabled=false # Whether response compression is enabled.
    server.compression.excluded-user-agents= # List of user-agents to exclude from compression.
    server.compression.mime-types=text/html,text/xml,text/plain,text/css,text/javascript,application/javascript # Comma-separated list of MIME types that should be compressed.
    server.compression.min-response-size=2048 # Minimum response size that is required for compression to be performed.
    server.connection-timeout= # Time that connectors wait for another HTTP request before closing the connection. When not set, the connector's container-specific default is used. Use a value of -1 to indicate no (that is, an infinite) timeout.
    server.display-name=application # Display name of the application.
    server.max-http-header-size=0 # Maximum size, in bytes, of the HTTP message header.
    server.error.include-exception=false # Include the "exception" attribute.
    server.error.include-stacktrace=never # When to include a "stacktrace" attribute.
    server.error.path=/error # Path of the error controller.
    server.error.whitelabel.enabled=true # Enable the default error page displayed in browsers in case of a server error.
    server.http2.enabled=true # Whether to enable HTTP/2 support, if the current environment supports it.
    server.jetty.acceptors= # Number of acceptor threads to use.
    server.jetty.accesslog.append=false # Append to log.
    server.jetty.accesslog.date-format=dd/MMM/yyyy:HH:mm:ss Z # Timestamp format of the request log.
    server.jetty.accesslog.enabled=false # Enable access log.
    server.jetty.accesslog.extended-format=false # Enable extended NCSA format.
    server.jetty.accesslog.file-date-format= # Date format to place in log file name.
    server.jetty.accesslog.filename= # Log filename. If not specified, logs redirect to "System.err".
    server.jetty.accesslog.locale= # Locale of the request log.
    server.jetty.accesslog.log-cookies=false # Enable logging of the request cookies.
    server.jetty.accesslog.log-latency=false # Enable logging of request processing time.
    server.jetty.accesslog.log-server=false # Enable logging of the request hostname.
    server.jetty.accesslog.retention-period=31 # Number of days before rotated log files are deleted.
    server.jetty.accesslog.time-zone=GMT # Timezone of the request log.
    server.jetty.max-http-post-size=0 # Maximum size, in bytes, of the HTTP post or put content.
    server.jetty.selectors= # Number of selector threads to use.
    server.port=8080 # Server HTTP port.
    server.server-header= # Value to use for the Server response header (if empty, no header is sent)
    server.use-forward-headers= # Whether X-Forwarded-* headers should be applied to the HttpRequest.
    server.servlet.context-parameters.*= # Servlet context init parameters
    server.servlet.context-path= # Context path of the application.
    server.servlet.jsp.class-name=org.apache.jasper.servlet.JspServlet # The class name of the JSP servlet.
    server.servlet.jsp.init-parameters.*= # Init parameters used to configure the JSP servlet.
    server.servlet.jsp.registered=true # Whether the JSP servlet is registered.
    server.servlet.path=/ # Path of the main dispatcher servlet.
    server.session.cookie.comment= # Comment for the session cookie.
    server.session.cookie.domain= # Domain for the session cookie.
    server.session.cookie.http-only= # "HttpOnly" flag for the session cookie.
    server.session.cookie.max-age= # Maximum age of the session cookie. If a duration suffix is not specified, seconds will be used.
    server.session.cookie.name= # Session cookie name.
    server.session.cookie.path= # Path of the session cookie.
    server.session.cookie.secure= # "Secure" flag for the session cookie.
    server.session.persistent=false # Whether to persist session data between restarts.
    server.session.store-dir= # Directory used to store session data.
    server.session.timeout= # Session timeout. If a duration suffix is not specified, seconds will be used.
    server.session.tracking-modes= # Session tracking modes (one or more of the following: "cookie", "url", "ssl").
    server.ssl.ciphers= # Supported SSL ciphers.
    server.ssl.client-auth= # Whether client authentication is wanted ("want") or needed ("need"). Requires a trust store.
    server.ssl.enabled= # Enable SSL support.
    server.ssl.enabled-protocols= # Enabled SSL protocols.
    server.ssl.key-alias= # Alias that identifies the key in the key store.
    server.ssl.key-password= # Password used to access the key in the key store.
    server.ssl.key-store= # Path to the key store that holds the SSL certificate (typically a jks file).
    server.ssl.key-store-password= # Password used to access the key store.
    server.ssl.key-store-provider= # Provider for the key store.
    server.ssl.key-store-type= # Type of the key store.
    server.ssl.protocol=TLS # SSL protocol to use.
    server.ssl.trust-store= # Trust store that holds SSL certificates.
    server.ssl.trust-store-password= # Password used to access the trust store.
    server.ssl.trust-store-provider= # Provider for the trust store.
    server.ssl.trust-store-type= # Type of the trust store.
    server.tomcat.accept-count= # Maximum queue length for incoming connection requests when all possible request processing threads are in use.
    server.tomcat.accesslog.buffered=true # Whether to buffer output such that it is flushed only periodically.
    server.tomcat.accesslog.directory=logs # Directory in which log files are created. Can be absolute or relative to the Tomcat base dir.
    server.tomcat.accesslog.enabled=false # Enable access log.
    server.tomcat.accesslog.file-date-format=.yyyy-MM-dd # Date format to place in the log file name.
    server.tomcat.accesslog.pattern=common # Format pattern for access logs.
    server.tomcat.accesslog.prefix=access_log # Log file name prefix.
    server.tomcat.accesslog.rename-on-rotate=false # Whether to defer inclusion of the date stamp in the file name until rotate time.
    server.tomcat.accesslog.request-attributes-enabled=false # Set request attributes for the IP address, Hostname, protocol, and port used for the request.
    server.tomcat.accesslog.rotate=true # Whether to enable access log rotation.
    server.tomcat.accesslog.suffix=.log # Log file name suffix.
    server.tomcat.additional-tld-skip-patterns= # Comma-separated list of additional patterns that match jars to ignore for TLD scanning.
    server.tomcat.background-processor-delay=30s # Delay between the invocation of backgroundProcess methods. If a duration suffix is not specified, seconds will be used.
    server.tomcat.basedir= # Tomcat base directory. If not specified, a temporary directory is used.
    server.tomcat.internal-proxies=10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|\\
    		192\\.168\\.\\d{1,3}\\.\\d{1,3}|\\
    		169\\.254\\.\\d{1,3}\\.\\d{1,3}|\\
    		127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|\\
    		172\\.1[6-9]{1}\\.\\d{1,3}\\.\\d{1,3}|\\
    		172\\.2[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}|\\
    		172\\.3[0-1]{1}\\.\\d{1,3}\\.\\d{1,3} # regular expression matching trusted IP addresses.
    server.tomcat.max-connections= # Maximum number of connections that the server accepts and processes at any given time.
    server.tomcat.max-http-header-size=0 # Maximum size, in bytes, of the HTTP message header.
    server.tomcat.max-http-post-size=0 # Maximum size, in bytes, of the HTTP post content.
    server.tomcat.max-threads=0 # Maximum number of worker threads.
    server.tomcat.min-spare-threads=0 # Minimum number of worker threads.
    server.tomcat.port-header=X-Forwarded-Port # Name of the HTTP header used to override the original port value.
    server.tomcat.protocol-header= # Header that holds the incoming protocol, usually named "X-Forwarded-Proto".
    server.tomcat.protocol-header-https-value=https # Value of the protocol header indicating whether the incoming request uses SSL.
    server.tomcat.redirect-context-root= # Whether requests to the context root should be redirected by appending a / to the path.
    server.tomcat.remote-ip-header= # Name of the HTTP header from which the remote IP is extracted. For instance, `X-FORWARDED-FOR`.
    server.tomcat.resource.cache-ttl= # Time-to-live of the static resource cache.
    server.tomcat.uri-encoding=UTF-8 # Character encoding to use to decode the URI.
    server.undertow.accesslog.dir= # Undertow access log directory.
    server.undertow.accesslog.enabled=false # Whether to enable the access log.
    server.undertow.accesslog.pattern=common # Format pattern for access logs.
    server.undertow.accesslog.prefix=access_log. # Log file name prefix.
    server.undertow.accesslog.rotate=true # Whether to enable access log rotation.
    server.undertow.accesslog.suffix=log # Log file name suffix.
    server.undertow.buffer-size= # Size of each buffer, in bytes.
    server.undertow.direct-buffers= # Whether to allocate buffers outside the Java heap.
    server.undertow.io-threads= # Number of I/O threads to create for the worker.
    server.undertow.eager-filter-init=true # Whether servlet filters should be initialized on startup.
    server.undertow.max-http-post-size=0 # Maximum size, in bytes, of the HTTP post content.
    server.undertow.worker-threads= # Number of worker threads.
    # FREEMARKER (FreeMarkerProperties)
    spring.freemarker.allow-request-override=false # Whether HttpServletRequest attributes are allowed to override (hide) controller generated model attributes of the same name.
    spring.freemarker.allow-session-override=false # Whether HttpSession attributes are allowed to override (hide) controller generated model attributes of the same name.
    spring.freemarker.cache=false # Whether to enable template caching.
    spring.freemarker.charset=UTF-8 # Template encoding.
    spring.freemarker.check-template-location=true # Whether to check that the templates location exists.
    spring.freemarker.content-type=text/html # Content-Type value.
    spring.freemarker.enabled=true # Whether to enable MVC view resolution for this technology.
    spring.freemarker.expose-request-attributes=false # Whether all request attributes should be added to the model prior to merging with the template.
    spring.freemarker.expose-session-attributes=false # Whether all HttpSession attributes should be added to the model prior to merging with the template.
    spring.freemarker.expose-spring-macro-helpers=true # Whether to expose a RequestContext for use by Spring's macro library, under the name "springMacroRequestContext".
    spring.freemarker.prefer-file-system-access=true # Whether to prefer file system access for template loading. File system access enables hot detection of template changes.
    spring.freemarker.prefix= # Prefix that gets prepended to view names when building a URL.
    spring.freemarker.request-context-attribute= # Name of the RequestContext attribute for all views.
    spring.freemarker.settings.*= # Well-known FreeMarker keys which are passed to FreeMarker's Configuration.
    spring.freemarker.suffix=.ftl # Suffix that gets appended to view names when building a URL.
    spring.freemarker.template-loader-path=classpath:/templates/ # Comma-separated list of template paths.
    spring.freemarker.view-names= # White list of view names that can be resolved.
    # GROOVY TEMPLATES (GroovyTemplateProperties)
    spring.groovy.template.allow-request-override=false # Whether HttpServletRequest attributes are allowed to override (hide) controller generated model attributes of the same name.
    spring.groovy.template.allow-session-override=false # Whether HttpSession attributes are allowed to override (hide) controller generated model attributes of the same name.
    spring.groovy.template.cache= # Whether to enable template caching.
    spring.groovy.template.charset=UTF-8 # Template encoding.
    spring.groovy.template.check-template-location=true # Check that the templates location exists.
    spring.groovy.template.configuration.*= # See GroovyMarkupConfigurer
    spring.groovy.template.content-type=test/html # Content-Type value.
    spring.groovy.template.enabled=true # Whether to enable MVC view resolution for this technology.
    spring.groovy.template.expose-request-attributes=false # Whether all request attributes should be added to the model prior to merging with the template.
    spring.groovy.template.expose-session-attributes=false # Whether all HttpSession attributes should be added to the model prior to merging with the template.
    spring.groovy.template.expose-spring-macro-helpers=true # Whether to expose a RequestContext for use by Spring's macro library, under the name "springMacroRequestContext".
    spring.groovy.template.prefix= # Prefix that gets prepended to view names when building a URL.
    spring.groovy.template.request-context-attribute= # Name of the RequestContext attribute for all views.
    spring.groovy.template.resource-loader-path=classpath:/templates/ # Template path.
    spring.groovy.template.suffix=.tpl # Suffix that gets appended to view names when building a URL.
    spring.groovy.template.view-names= # White list of view names that can be resolved.
    # SPRING HATEOAS (HateoasProperties)
    spring.hateoas.use-hal-as-default-json-media-type=true # Whether application/hal+json responses should be sent to requests that accept application/json.
    # HTTP message conversion
    spring.http.converters.preferred-json-mapper= # Preferred JSON mapper to use for HTTP message conversion. By default, auto-detected according to the environment.
    # HTTP encoding (HttpEncodingProperties)
    spring.http.encoding.charset=UTF-8 # Charset of HTTP requests and responses. Added to the "Content-Type" header if not set explicitly.
    spring.http.encoding.enabled=true # Whether to enable http encoding support.
    spring.http.encoding.force= # Whether to force the encoding to the configured charset on HTTP requests and responses.
    spring.http.encoding.force-request= # Whether to force the encoding to the configured charset on HTTP requests. Defaults to true when "force" has not been specified.
    spring.http.encoding.force-response= # Whether to force the encoding to the configured charset on HTTP responses.
    spring.http.encoding.mapping= # Locale in which to encode mapping.
    # MULTIPART (MultipartProperties)
    spring.servlet.multipart.enabled=true # Whether to enable support of multipart uploads.
    spring.servlet.multipart.file-size-threshold=0 # Threshold after which files are written to disk. Values can use the suffixes "MB" or "KB" to indicate megabytes or kilobytes, respectively.
    spring.servlet.multipart.location= # Intermediate location of uploaded files.
    spring.servlet.multipart.max-file-size=1MB # Max file size. Values can use the suffixes "MB" or "KB" to indicate megabytes or kilobytes, respectively.
    spring.servlet.multipart.max-request-size=10MB # Max request size. Values can use the suffixes "MB" or "KB" to indicate megabytes or kilobytes, respectively.
    spring.servlet.multipart.resolve-lazily=false # Whether to resolve the multipart request lazily at the time of file or parameter access.
    # JACKSON (JacksonProperties)
    spring.jackson.date-format= # Date format string or a fully-qualified date format class name. For instance, `yyyy-MM-dd HH:mm:ss`.
    spring.jackson.default-property-inclusion= # Controls the inclusion of properties during serialization. Configured with one of the values in Jackson's JsonInclude.Include enumeration.
    spring.jackson.deserialization.*= # Jackson on/off features that affect the way Java objects are deserialized.
    spring.jackson.generator.*= # Jackson on/off features for generators.
    spring.jackson.joda-date-time-format= # Joda date time format string. If not configured, "date-format" is used as a fallback if it is configured with a format string.
    spring.jackson.locale= # Locale used for formatting.
    spring.jackson.mapper.*= # Jackson general purpose on/off features.
    spring.jackson.parser.*= # Jackson on/off features for parsers.
    spring.jackson.property-naming-strategy= # One of the constants on Jackson's PropertyNamingStrategy. Can also be a fully-qualified class name of a PropertyNamingStrategy subclass.
    spring.jackson.serialization.*= # Jackson on/off features that affect the way Java objects are serialized.
    spring.jackson.time-zone= #  Time zone used when formatting dates. For instance, "America/Los_Angeles" or "GMT+10".
    # JERSEY (JerseyProperties)
    spring.jersey.application-path= # Path that serves as the base URI for the application. If specified, overrides the value of "@ApplicationPath".
    spring.jersey.filter.order=0 # Jersey filter chain order.
    spring.jersey.init.*= # Init parameters to pass to Jersey through the servlet or filter.
    spring.jersey.servlet.load-on-startup=-1 # Load on startup priority of the Jersey servlet.
    spring.jersey.type=servlet # Jersey integration type.
    # SPRING LDAP (LdapProperties)
    spring.ldap.urls= # LDAP URLs of the server.
    spring.ldap.base= # Base suffix from which all operations should originate.
    spring.ldap.username= # Login username of the server.
    spring.ldap.password= # Login password of the server.
    spring.ldap.base-environment.*= # LDAP specification settings.
    # EMBEDDED LDAP (EmbeddedLdapProperties)
    spring.ldap.embedded.base-dn= # The base DN
    spring.ldap.embedded.credential.username= # Embedded LDAP username.
    spring.ldap.embedded.credential.password= # Embedded LDAP password.
    spring.ldap.embedded.ldif=classpath:schema.ldif # Schema (LDIF) script resource reference.
    spring.ldap.embedded.port= # Embedded LDAP port.
    spring.ldap.embedded.validation.enabled=true # Whether to enable LDAP schema validation.
    spring.ldap.embedded.validation.schema= # Path to the custom schema.
    # MUSTACHE TEMPLATES (MustacheAutoConfiguration)
    spring.mustache.allow-request-override= # Whether HttpServletRequest attributes are allowed to override (hide) controller generated model attributes of the same name.
    spring.mustache.allow-session-override= # Whether HttpSession attributes are allowed to override (hide) controller generated model attributes of the same name.
    spring.mustache.cache= # Whether to enable template caching.
    spring.mustache.charset= # Template encoding.
    spring.mustache.check-template-location= # Whether to check that the templates location exists.
    spring.mustache.content-type= # Content-Type value.
    spring.mustache.enabled= # Whether to enable MVC view resolution for this technology.
    spring.mustache.expose-request-attributes= # Whether all request attributes should be added to the model prior to merging with the template.
    spring.mustache.expose-session-attributes= # Whether all HttpSession attributes should be added to the model prior to merging with the template.
    spring.mustache.expose-spring-macro-helpers= # Whether to expose a RequestContext for use by Spring's macro library under the name "springMacroRequestContext".
    spring.mustache.prefix=classpath:/templates/ # Prefix to apply to template names.
    spring.mustache.request-context-attribute= # Name of the RequestContext attribute for all views.
    spring.mustache.suffix=.mustache # Suffix to apply to template names.
    spring.mustache.view-names= # White list of view names that can be resolved.
    # SPRING MVC (WebMvcProperties)
    spring.mvc.async.request-timeout= # Amount of time before asynchronous request handling times out.
    spring.mvc.date-format= # Date format to use. For instance, `dd/MM/yyyy`.
    spring.mvc.dispatch-trace-request=false # Whether to dispatch TRACE requests to the FrameworkServlet doService method.
    spring.mvc.dispatch-options-request=true # Whether to dispatch OPTIONS requests to the FrameworkServlet doService method.
    spring.mvc.favicon.enabled=true # Whether to enable resolution of favicon.ico.
    spring.mvc.formcontent.putfilter.enabled=true # Whether to enable Spring's HttpPutFormContentFilter.
    spring.mvc.ignore-default-model-on-redirect=true # Whether the content of the "default" model should be ignored during redirect scenarios.
    spring.mvc.locale= # Locale to use. By default, this locale is overridden by the "Accept-Language" header.
    spring.mvc.locale-resolver=accept-header # Define how the locale should be resolved.
    spring.mvc.log-resolved-exception=false # Whether to enable warn logging of exceptions resolved by a "HandlerExceptionResolver".
    spring.mvc.media-types.*= # Maps file extensions to media types for content negotiation.
    spring.mvc.message-codes-resolver-format= # Formatting strategy for message codes. For instance, `PREFIX_ERROR_CODE`.
    spring.mvc.servlet.load-on-startup=-1 # Load on startup priority of the Spring Web Services servlet.
    spring.mvc.static-path-pattern=/** # Path pattern used for static resources.
    spring.mvc.throw-exception-if-no-handler-found=false # Whether a "NoHandlerFoundException" should be thrown if no Handler was found to process a request.
    spring.mvc.view.prefix= # Spring MVC view prefix.
    spring.mvc.view.suffix= # Spring MVC view suffix.
    # SPRING RESOURCES HANDLING (ResourceProperties)
    spring.resources.add-mappings=true # Whether to enable default resource handling.
    spring.resources.cache.cachecontrol.max-age= # Maximum time the response should be cached, in seconds if no duration suffix is not specified.
    spring.resources.cache.cachecontrol.no-cache= # Indicate that the cached response can be reused only if re-validated with the server.
    spring.resources.cache.cachecontrol.no-store= # Indicate to not cache the response in any case.
    spring.resources.cache.cachecontrol.must-revalidate= # Indicate that once it has become stale, a cache must not use the response without re-validating it with the server.
    spring.resources.cache.cachecontrol.no-transform= # Indicate intermediaries (caches and others) that they should not transform the response content.
    spring.resources.cache.cachecontrol.cache-public= # Indicate that any cache may store the response.
    spring.resources.cache.cachecontrol.cache-private= # Indicate that the response message is intended for a single user and must not be stored by a shared cache.
    spring.resources.cache.cachecontrol.proxy-revalidate= # Same meaning as the "must-revalidate" directive, except that it does not apply to private caches.
    spring.resources.cache.cachecontrol.stale-while-revalidate= # Maximum time the response can be served after it becomes stale, in seconds if no duration suffix is not specified.
    spring.resources.cache.cachecontrol.stale-if-error= # Maximum time the response may be used when errors are encountered, in seconds if no duration suffix is not specified.
    spring.resources.cache.cachecontrol.s-max-age= # Maximum time the response should be cached by shared caches, in seconds if no duration suffix is not specified.
    spring.resources.cache.period= # Cache period for the resources served by the resource handler. If a duration suffix is not specified, seconds will be used.
    spring.resources.chain.cache=true # Whether to enable caching in the Resource chain.
    spring.resources.chain.enabled= # Whether to enable the Spring Resource Handling chain. By default, disabled unless at least one strategy has been enabled.
    spring.resources.chain.gzipped=false # Whether to enable resolution of already gzipped resources.
    spring.resources.chain.html-application-cache=false # Whether to enable HTML5 application cache manifest rewriting.
    spring.resources.chain.strategy.content.enabled=false # Enable the content Version Strategy.
    spring.resources.chain.strategy.content.paths=/** # Comma-separated list of patterns to apply to the content Version Strategy.
    spring.resources.chain.strategy.content.enabled=false # Whether to enable the content Version Strategy.
    spring.resources.chain.strategy.fixed.enabled=false # Whether to enable the fixed Version Strategy.
    spring.resources.chain.strategy.fixed.paths=/** # Comma-separated list of patterns to apply to the fixed Version Strategy.
    spring.resources.chain.strategy.fixed.version= # Version string to use for the fixed Version Strategy.
    spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ # Locations of static resources.
    # SPRING SESSION (SessionProperties)
    spring.session.store-type= # Session store type.
    spring.session.servlet.filter-order=-2147483598 # Session repository filter order.
    spring.session.servlet.filter-dispatcher-types=ASYNC,ERROR,REQUEST # Session repository filter dispatcher types.
    # SPRING SESSION HAZELCAST (HazelcastSessionProperties)
    spring.session.hazelcast.flush-mode=on-save # Sessions flush mode.
    spring.session.hazelcast.map-name=spring:session:sessions # Name of the map used to store sessions.
    # SPRING SESSION JDBC (JdbcSessionProperties)
    spring.session.jdbc.cleanup-cron=0 * * * * * # Cron expression for expired session cleanup job.
    spring.session.jdbc.initialize-schema=embedded # Database schema initialization mode.
    spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema.
    spring.session.jdbc.table-name=SPRING_SESSION # Name of the database table used to store sessions.
    # SPRING SESSION MONGODB (MongoSessionProperties)
    spring.session.mongodb.collection-name=sessions # Collection name used to store sessions.
    # SPRING SESSION REDIS (RedisSessionProperties)
    spring.session.redis.cleanup-cron=0 * * * * * # Cron expression for expired session cleanup job.
    spring.session.redis.flush-mode=on-save # Sessions flush mode.
    spring.session.redis.namespace=spring:session # Namespace for keys used to store sessions.
    # THYMELEAF (ThymeleafAutoConfiguration)
    spring.thymeleaf.cache=true # Whether to enable template caching.
    spring.thymeleaf.check-template=true # Whether to check that the template exists before rendering it.
    spring.thymeleaf.check-template-location=true # Whether to check that the templates location exists.
    spring.thymeleaf.enabled=true # Whether to enable Thymeleaf view resolution for Web frameworks.
    spring.thymeleaf.enable-spring-el-compiler=false # Enable the SpringEL compiler in SpringEL expressions.
    spring.thymeleaf.encoding=UTF-8 # Template files encoding.
    spring.thymeleaf.excluded-view-names= # Comma-separated list of view names that should be excluded from resolution.
    spring.thymeleaf.mode=HTML5 # Template mode to be applied to templates. See also Thymeleaf's TemplateMode enum.
    spring.thymeleaf.prefix=classpath:/templates/ # Prefix that gets prepended to view names when building a URL.
    spring.thymeleaf.reactive.chunked-mode-view-names= # Comma-separated list of view names (patterns allowed) that should be the only ones executed in CHUNKED mode when a max chunk size is set.
    spring.thymeleaf.reactive.full-mode-view-names= # Comma-separated list of view names (patterns allowed) that should be executed in FULL mode even if a max chunk size is set.
    spring.thymeleaf.reactive.max-chunk-size= # Maximum size of data buffers used for writing to the response, in bytes.
    spring.thymeleaf.reactive.media-types= # Media types supported by the view technology.
    spring.thymeleaf.servlet.content-type=text/html # Content-Type value written to HTTP responses.
    spring.thymeleaf.suffix=.html # Suffix that gets appended to view names when building a URL.
    spring.thymeleaf.template-resolver-order= # Order of the template resolver in the chain.
    spring.thymeleaf.view-names= # Comma-separated list of view names that can be resolved.
    # SPRING WEB FLUX (WebFluxProperties)
    spring.webflux.static-path-pattern=/** # Path pattern used for static resources.
    # SPRING WEB SERVICES (WebServicesProperties)
    spring.webservices.path=/services # Path that serves as the base URI for the services.
    spring.webservices.servlet.init= # Servlet init parameters to pass to Spring Web Services.
    spring.webservices.servlet.load-on-startup=-1 # Load on startup priority of the Spring Web Services servlet.
    spring.webservices.wsdl-locations= # Comma-separated list of locations of WSDLs and accompanying XSDs to be exposed as beans.
    # ----------------------------------------
    # SECURITY PROPERTIES
    # ----------------------------------------
    # SECURITY (SecurityProperties)
    spring.security.filter.order=0 # Security filter chain order.
    spring.security.filter.dispatcher-types=ASYNC,ERROR,REQUEST # Security filter chain dispatcher types.
    # SECURITY OAUTH2 CLIENT (OAuth2ClientProperties)
    spring.security.oauth2.client.provider.*= # OAuth provider details.
    spring.security.oauth2.client.registration.*= # OAuth client registrations.
    # ----------------------------------------
    # DATA PROPERTIES
    # ----------------------------------------
    # FLYWAY (FlywayProperties)
    spring.flyway.allow-mixed-migrations= #
    spring.flyway.baseline-description= #
    spring.flyway.baseline-on-migrate= #
    spring.flyway.baseline-version=1 # Version to start migration
    spring.flyway.check-location=true # Whether to check that migration scripts location exists.
    spring.flyway.clean-disabled= #
    spring.flyway.clean-on-validation-error= #
    spring.flyway.enabled=true # Whether to enable flyway.
    spring.flyway.encoding= #
    spring.flyway.group= #
    spring.flyway.ignore-failed-future-migration= #
    spring.flyway.ignore-future-migrations= #
    spring.flyway.ignore-missing-migrations= #
    spring.flyway.init-sqls= # SQL statements to execute to initialize a connection immediately after obtaining it.
    spring.flyway.installed-by= #
    spring.flyway.locations=classpath:db/migration # The locations of migrations scripts.
    spring.flyway.mixed= #
    spring.flyway.out-of-order= #
    spring.flyway.password= # JDBC password to use if you want Flyway to create its own DataSource.
    spring.flyway.placeholder-prefix= #
    spring.flyway.placeholder-replacement= #
    spring.flyway.placeholder-suffix= #
    spring.flyway.placeholders.*= #
    spring.flyway.repeatable-sql-migration-prefix= #
    spring.flyway.schemas= # schemas to update
    spring.flyway.skip-default-callbacks= #
    spring.flyway.skip-default-resolvers= #
    spring.flyway.sql-migration-prefix=V #
    spring.flyway.sql-migration-separator= #
    spring.flyway.sql-migration-suffix=.sql #
    spring.flyway.table= #
    spring.flyway.target= #
    spring.flyway.url= # JDBC url of the database to migrate. If not set, the primary configured data source is used.
    spring.flyway.user= # Login user of the database to migrate.
    spring.flyway.validate-on-migrate= #
    # LIQUIBASE (LiquibaseProperties)
    spring.liquibase.change-log=classpath:/db/changelog/db.changelog-master.yaml # Change log configuration path.
    spring.liquibase.check-change-log-location=true # Whether to check that the change log location exists.
    spring.liquibase.contexts= # Comma-separated list of runtime contexts to use.
    spring.liquibase.default-schema= # Default database schema.
    spring.liquibase.drop-first=false # Whether to first drop the database schema.
    spring.liquibase.enabled=true # Whether to enable Liquibase support.
    spring.liquibase.labels= # Comma-separated list of runtime labels to use.
    spring.liquibase.parameters.*= # Change log parameters.
    spring.liquibase.password= # Login password of the database to migrate.
    spring.liquibase.rollback-file= # File to which rollback SQL is written when an update is performed.
    spring.liquibase.url= # JDBC URL of the database to migrate. If not set, the primary configured data source is used.
    spring.liquibase.user= # Login user of the database to migrate.
    # COUCHBASE (CouchbaseProperties)
    spring.couchbase.bootstrap-hosts= # Couchbase nodes (host or IP address) to bootstrap from.
    spring.couchbase.bucket.name=default # Name of the bucket to connect to.
    spring.couchbase.bucket.password=  # Password of the bucket.
    spring.couchbase.env.endpoints.key-value=1 # Number of sockets per node against the Key/value service.
    spring.couchbase.env.endpoints.query=1 # Number of sockets per node against the Query (N1QL) service.
    spring.couchbase.env.endpoints.view=1 # Number of sockets per node against the view service.
    spring.couchbase.env.ssl.enabled= # Whether to enable SSL support. Enabled automatically if a "keyStore" is provided, unless specified otherwise.
    spring.couchbase.env.ssl.key-store= # Path to the JVM key store that holds the certificates.
    spring.couchbase.env.ssl.key-store-password= # Password used to access the key store.
    spring.couchbase.env.timeouts.connect=5000ms # Bucket connections timeouts.
    spring.couchbase.env.timeouts.key-value=2500ms # Blocking operations performed on a specific key timeout.
    spring.couchbase.env.timeouts.query=7500ms # N1QL query operations timeout.
    spring.couchbase.env.timeouts.socket-connect=1000ms # Socket connect connections timeout.
    spring.couchbase.env.timeouts.view=7500ms # Regular and geospatial view operations timeout.
    # DAO (PersistenceExceptionTranslationAutoConfiguration)
    spring.dao.exceptiontranslation.enabled=true # Whether to enable the PersistenceExceptionTranslationPostProcessor.
    # CASSANDRA (CassandraProperties)
    spring.data.cassandra.cluster-name= # Name of the Cassandra cluster.
    spring.data.cassandra.compression=none # Compression supported by the Cassandra binary protocol.
    spring.data.cassandra.connect-timeout= # Socket option: connection time out.
    spring.data.cassandra.consistency-level= # Queries consistency level.
    spring.data.cassandra.contact-points=localhost # Comma-separated list of cluster node addresses.
    spring.data.cassandra.fetch-size= # Queries default fetch size.
    spring.data.cassandra.keyspace-name= # Keyspace name to use.
    spring.data.cassandra.load-balancing-policy= # Class name of the load balancing policy.
    spring.data.cassandra.port= # Port of the Cassandra server.
    spring.data.cassandra.password= # Login password of the server.
    spring.data.cassandra.pool.heartbeat-interval=30 # Heartbeat interval after which a message is sent on an idle connection to make sure it's still alive. If a duration suffix is not specified, seconds will be used.
    spring.data.cassandra.pool.idle-timeout=120 # Idle timeout before an idle connection is removed. If a duration suffix is not specified, seconds will be used.
    spring.data.cassandra.pool.max-queue-size=256 # Maximum number of requests that get queued if no connection is available.
    spring.data.cassandra.pool.pool-timeout=5000ms # Pool timeout when trying to acquire a connection from a host's pool.
    spring.data.cassandra.read-timeout= # Socket option: read time out.
    spring.data.cassandra.reconnection-policy= # Reconnection policy class.
    spring.data.cassandra.repositories.type=auto # Type of Cassandra repositories to enable.
    spring.data.cassandra.retry-policy= # Class name of the retry policy.
    spring.data.cassandra.serial-consistency-level= # Queries serial consistency level.
    spring.data.cassandra.schema-action=none # Schema action to take at startup.
    spring.data.cassandra.ssl=false # Enable SSL support.
    spring.data.cassandra.username= # Login user of the server.
    # DATA COUCHBASE (CouchbaseDataProperties)
    spring.data.couchbase.auto-index=false # Automatically create views and indexes.
    spring.data.couchbase.consistency=read-your-own-writes # Consistency to apply by default on generated queries.
    spring.data.couchbase.repositories.type=auto # Type of Couchbase repositories to enable.
    # ELASTICSEARCH (ElasticsearchProperties)
    spring.data.elasticsearch.cluster-name=elasticsearch # Elasticsearch cluster name.
    spring.data.elasticsearch.cluster-nodes= # Comma-separated list of cluster node addresses.
    spring.data.elasticsearch.properties.*= # Additional properties used to configure the client.
    spring.data.elasticsearch.repositories.enabled=true # Whether to enable Elasticsearch repositories.
    # DATA LDAP
    spring.data.ldap.repositories.enabled=true # Enable LDAP repositories.
    # MONGODB (MongoProperties)
    spring.data.mongodb.authentication-database= # Authentication database name.
    spring.data.mongodb.database=test # Database name.
    spring.data.mongodb.field-naming-strategy= # Fully qualified name of the FieldNamingStrategy to use.
    spring.data.mongodb.grid-fs-database= # GridFS database name.
    spring.data.mongodb.host=localhost # Mongo server host. Cannot be set with URI.
    spring.data.mongodb.password= # Login password of the mongo server. Cannot be set with URI.
    spring.data.mongodb.port=27017 # Mongo server port. Cannot be set with URI.
    spring.data.mongodb.repositories.type=true # Type of Mongo repositories to enable.
    spring.data.mongodb.uri=mongodb://localhost/test # Mongo database URI. Cannot be set with host, port and credentials.
    spring.data.mongodb.username= # Login user of the mongo server. Cannot be set with URI.
    # DATA REDIS
    spring.data.redis.repositories.enabled=true # Whether to enable Redis repositories.
    # NEO4J (Neo4jProperties)
    spring.data.neo4j.auto-index=none # Auto index mode.
    spring.data.neo4j.embedded.enabled=true # Whether to enable embedded mode if the embedded driver is available.
    spring.data.neo4j.open-in-view=true # Register OpenSessionInViewInterceptor. Binds a Neo4j Session to the thread for the entire processing of the request.
    spring.data.neo4j.password= # Login password of the server.
    spring.data.neo4j.repositories.enabled=true # Whether to enable Neo4j repositories.
    spring.data.neo4j.uri= # URI used by the driver. Auto-detected by default.
    spring.data.neo4j.username= # Login user of the server.
    # DATA REST (RepositoryRestProperties)
    spring.data.rest.base-path= # Base path to be used by Spring Data REST to expose repository resources.
    spring.data.rest.default-page-size= # Default size of pages.
    spring.data.rest.detection-strategy=default # Strategy to use to determine which repositories get exposed.
    spring.data.rest.enable-enum-translation= # Whether to enable enum value translation through the Spring Data REST default resource bundle.
    spring.data.rest.limit-param-name= # Name of the URL query string parameter that indicates how many results to return at once.
    spring.data.rest.max-page-size= # Maximum size of pages.
    spring.data.rest.page-param-name= # Name of the URL query string parameter that indicates what page to return.
    spring.data.rest.return-body-on-create= # Whether to return a response body after creating an entity.
    spring.data.rest.return-body-on-update= # Whether to return a response body after updating an entity.
    spring.data.rest.sort-param-name= # Name of the URL query string parameter that indicates what direction to sort results.
    # SOLR (SolrProperties)
    spring.data.solr.host=http://127.0.0.1:8983/solr # Solr host. Ignored if "zk-host" is set.
    spring.data.solr.repositories.enabled=true # Whether to enable Solr repositories.
    spring.data.solr.zk-host= # ZooKeeper host address in the form HOST:PORT.
    # DATA WEB (SpringDataWebProperties)
    spring.data.web.pageable.default-page-size=20 # Default page size.
    spring.data.web.pageable.page-parameter=page # Page index parameter name.
    spring.data.web.pageable.size-parameter=size # Page size parameter name.
    spring.data.web.sort.sort-parameter=sort # Sort parameter name.
    # DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
    spring.datasource.continue-on-error=false # Whether to stop if an error occurs while initializing the database.
    spring.datasource.data= # Data (DML) script resource references.
    spring.datasource.data-username= # Username of the database to execute DML scripts (if different).
    spring.datasource.data-password= # Password of the database to execute DML scripts (if different).
    spring.datasource.dbcp2.*= # Commons DBCP2 specific settings
    spring.datasource.driver-class-name= # Fully qualified name of the JDBC driver. Auto-detected based on the URL by default.
    spring.datasource.generate-unique-name=false # Whether to generate a random datasource name.
    spring.datasource.hikari.*= # Hikari specific settings
    spring.datasource.initialization-mode=embedded # Initialize the datasource with available DDL and DML scripts.
    spring.datasource.jmx-enabled=false # Whether to enable JMX support (if provided by the underlying pool).
    spring.datasource.jndi-name= # JNDI location of the datasource. Class, url, username & password are ignored when set.
    spring.datasource.name=testdb # Name of the datasource.
    spring.datasource.password= # Login password of the database.
    spring.datasource.platform=all # Platform to use in the DDL or DML scripts (such as schema-${platform}.sql or data-${platform}.sql).
    spring.datasource.schema= # Schema (DDL) script resource references.
    spring.datasource.schema-username= # Username of the database to execute DDL scripts (if different).
    spring.datasource.schema-password= # Password of the database to execute DDL scripts (if different).
    spring.datasource.separator=; # Statement separator in SQL initialization scripts.
    spring.datasource.sql-script-encoding= # SQL scripts encoding.
    spring.datasource.tomcat.*= # Tomcat datasource specific settings
    spring.datasource.type= # Fully qualified name of the connection pool implementation to use. By default, it is auto-detected from the classpath.
    spring.datasource.url= # JDBC URL of the database.
    spring.datasource.username= # Login username of the database.
    spring.datasource.xa.data-source-class-name= # XA datasource fully qualified name.
    spring.datasource.xa.properties= # Properties to pass to the XA data source.
    # JEST (Elasticsearch HTTP client) (JestProperties)
    spring.elasticsearch.jest.connection-timeout=3s # Connection timeout.
    spring.elasticsearch.jest.multi-threaded=true # Whether to enable connection requests from multiple execution threads.
    spring.elasticsearch.jest.password= # Login password.
    spring.elasticsearch.jest.proxy.host= # Proxy host the HTTP client should use.
    spring.elasticsearch.jest.proxy.port= # Proxy port the HTTP client should use.
    spring.elasticsearch.jest.read-timeout=3s # Read timeout.
    spring.elasticsearch.jest.uris=http://localhost:9200 # Comma-separated list of the Elasticsearch instances to use.
    spring.elasticsearch.jest.username= # Login username.
    # H2 Web Console (H2ConsoleProperties)
    spring.h2.console.enabled=false # Whether to enable the console.
    spring.h2.console.path=/h2-console # Path at which the console is available.
    spring.h2.console.settings.trace=false # Whether to enable trace output.
    spring.h2.console.settings.web-allow-others=false # Whether to enable remote access.
    # InfluxDB (InfluxDbProperties)
    spring.influx.password= # Login password.
    spring.influx.url= # URL of the InfluxDB instance to which to connect.
    spring.influx.user= # Login user.
    # JOOQ (JooqAutoConfiguration)
    spring.jooq.sql-dialect= # SQL dialect to use. Auto-detected by default.
    # JDBC (JdbcProperties)
    spring.jdbc.template.fetch-size=-1 # Number of rows that should be fetched from the database when more rows are needed.
    spring.jdbc.template.max-rows=-1 # Maximum number of rows.
    spring.jdbc.template.query-timeout= # Query timeout. If a duration suffix is not specified, seconds will be used.
    # JPA (JpaBaseConfiguration, HibernateJpaAutoConfiguration)
    spring.data.jpa.repositories.enabled=true # Whether to enable JPA repositories.
    spring.jpa.database= # Target database to operate on, auto-detected by default. Can be alternatively set using the "databasePlatform" property.
    spring.jpa.database-platform= # Name of the target database to operate on, auto-detected by default. Can be alternatively set using the "Database" enum.
    spring.jpa.generate-ddl=false # Whether to initialize the schema on startup.
    spring.jpa.hibernate.ddl-auto= # DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto" property. Defaults to "create-drop" when using an embedded database and no schema manager was detected. Otherwise, defaults to "none".
    spring.jpa.hibernate.naming.implicit-strategy= # Hibernate 5 implicit naming strategy fully qualified name.
    spring.jpa.hibernate.naming.physical-strategy= # Hibernate 5 physical naming strategy fully qualified name.
    spring.jpa.hibernate.use-new-id-generator-mappings= # Whether to use Hibernate's newer IdentifierGenerator for AUTO, TABLE and SEQUENCE.
    spring.jpa.mapping-resources= # Mapping resources (equivalent to "mapping-file" entries in persistence.xml).
    spring.jpa.open-in-view=true # Register OpenEntityManagerInViewInterceptor. Binds a JPA EntityManager to the thread for the entire processing of the request.
    spring.jpa.properties.*= # Additional native properties to set on the JPA provider.
    spring.jpa.show-sql=false # Whether to enable logging of SQL statements.
    # JTA (JtaAutoConfiguration)
    spring.jta.enabled=true # Whether to enable JTA support.
    spring.jta.log-dir= # Transaction logs directory.
    spring.jta.transaction-manager-id= # Transaction manager unique identifier.
    # ATOMIKOS (AtomikosProperties)
    spring.jta.atomikos.connectionfactory.borrow-connection-timeout=30 # Timeout, in seconds, for borrowing connections from the pool.
    spring.jta.atomikos.connectionfactory.ignore-session-transacted-flag=true # Whether to ignore the transacted flag when creating session.
    spring.jta.atomikos.connectionfactory.local-transaction-mode=false # Whether local transactions are desired.
    spring.jta.atomikos.connectionfactory.maintenance-interval=60 # The time, in seconds, between runs of the pool's maintenance thread.
    spring.jta.atomikos.connectionfactory.max-idle-time=60 # The time, in seconds, after which connections are cleaned up from the pool.
    spring.jta.atomikos.connectionfactory.max-lifetime=0 # The time, in seconds, that a connection can be pooled for before being destroyed. 0 denotes no limit.
    spring.jta.atomikos.connectionfactory.max-pool-size=1 # The maximum size of the pool.
    spring.jta.atomikos.connectionfactory.min-pool-size=1 # The minimum size of the pool.
    spring.jta.atomikos.connectionfactory.reap-timeout=0 # The reap timeout, in seconds, for borrowed connections. 0 denotes no limit.
    spring.jta.atomikos.connectionfactory.unique-resource-name=jmsConnectionFactory # The unique name used to identify the resource during recovery.
    spring.jta.atomikos.datasource.borrow-connection-timeout=30 # Timeout, in seconds, for borrowing connections from the pool.
    spring.jta.atomikos.datasource.default-isolation-level= # Default isolation level of connections provided by the pool.
    spring.jta.atomikos.datasource.login-timeout= # Timeout, in seconds, for establishing a database connection.
    spring.jta.atomikos.datasource.maintenance-interval=60 # The time, in seconds, between runs of the pool's maintenance thread.
    spring.jta.atomikos.datasource.max-idle-time=60 # The time, in seconds, after which connections are cleaned up from the pool.
    spring.jta.atomikos.datasource.max-lifetime=0 # The time, in seconds, that a connection can be pooled for before being destroyed. 0 denotes no limit.
    spring.jta.atomikos.datasource.max-pool-size=1 # The maximum size of the pool.
    spring.jta.atomikos.datasource.min-pool-size=1 # The minimum size of the pool.
    spring.jta.atomikos.datasource.reap-timeout=0 # The reap timeout, in seconds, for borrowed connections. 0 denotes no limit.
    spring.jta.atomikos.datasource.test-query= # SQL query or statement used to validate a connection before returning it.
    spring.jta.atomikos.datasource.unique-resource-name=dataSource # The unique name used to identify the resource during recovery.
    spring.jta.atomikos.properties.allow-sub-transactions=true # Specify whether sub-transactions are allowed.
    spring.jta.atomikos.properties.checkpoint-interval=500 # Interval between checkpoints, in milliseconds.
    spring.jta.atomikos.properties.default-jta-timeout=10000 # Default timeout for JTA transactions, in milliseconds.
    spring.jta.atomikos.properties.enable-logging=true # Whether to enable disk logging.
    spring.jta.atomikos.properties.force-shutdown-on-vm-exit=false # Whether a VM shutdown should trigger forced shutdown of the transaction core.
    spring.jta.atomikos.properties.log-base-dir= # Directory in which the log files should be stored.
    spring.jta.atomikos.properties.log-base-name=tmlog # Transactions log file base name.
    spring.jta.atomikos.properties.max-actives=50 # Maximum number of active transactions.
    spring.jta.atomikos.properties.max-timeout=30m # Maximum timeout that can be allowed for transactions.
    spring.jta.atomikos.properties.recovery.delay=10000ms # Delay between two recovery scans.
    spring.jta.atomikos.properties.recovery.forget-orphaned-log-entries-delay=86400000 # Delay after which recovery can cleanup pending ('orphaned') log entries.
    spring.jta.atomikos.properties.recovery.max-retries=5 # Number of retry attempts to commit the transaction before throwing an exception.
    spring.jta.atomikos.properties.recovery.retry-interval=10000ms # Delay between retry attempts.
    spring.jta.atomikos.properties.serial-jta-transactions=true # Whether sub-transactions should be joined when possible.
    spring.jta.atomikos.properties.service= # Transaction manager implementation that should be started.
    spring.jta.atomikos.properties.threaded-two-phase-commit=false # Whether to use different (and concurrent) threads for two-phase commit on the participating resources.
    spring.jta.atomikos.properties.transaction-manager-unique-name= # The transaction manager's unique name.
    # BITRONIX
    spring.jta.bitronix.connectionfactory.acquire-increment=1 # Number of connections to create when growing the pool.
    spring.jta.bitronix.connectionfactory.acquisition-interval=1 # Time, in seconds, to wait before trying to acquire a connection again after an invalid connection was acquired.
    spring.jta.bitronix.connectionfactory.acquisition-timeout=30 # Timeout, in seconds, for acquiring connections from the pool.
    spring.jta.bitronix.connectionfactory.allow-local-transactions=true # Whether the transaction manager should allow mixing XA and non-XA transactions.
    spring.jta.bitronix.connectionfactory.apply-transaction-timeout=false # Whether the transaction timeout should be set on the XAResource when it is enlisted.
    spring.jta.bitronix.connectionfactory.automatic-enlisting-enabled=true # Whether resources should be enlisted and delisted automatically.
    spring.jta.bitronix.connectionfactory.cache-producers-consumers=true # Whether producers and consumers should be cached.
    spring.jta.bitronix.connectionfactory.defer-connection-release=true # Whether the provider can run many transactions on the same connection and supports transaction interleaving.
    spring.jta.bitronix.connectionfactory.ignore-recovery-failures=false # Whether recovery failures should be ignored.
    spring.jta.bitronix.connectionfactory.max-idle-time=60 # The time, in seconds, after which connections are cleaned up from the pool.
    spring.jta.bitronix.connectionfactory.max-pool-size=10 # The maximum size of the pool. 0 denotes no limit.
    spring.jta.bitronix.connectionfactory.min-pool-size=0 # The minimum size of the pool.
    spring.jta.bitronix.connectionfactory.password= # The password to use to connect to the JMS provider.
    spring.jta.bitronix.connectionfactory.share-transaction-connections=false #  Whether connections in the ACCESSIBLE state can be shared within the context of a transaction.
    spring.jta.bitronix.connectionfactory.test-connections=true # Whether connections should be tested when acquired from the pool.
    spring.jta.bitronix.connectionfactory.two-pc-ordering-position=1 # The position that this resource should take during two-phase commit (always first is Integer.MIN_VALUE, always last is Integer.MAX_VALUE).
    spring.jta.bitronix.connectionfactory.unique-name=jmsConnectionFactory # The unique name used to identify the resource during recovery.
    spring.jta.bitronix.connectionfactory.use-tm-join=true Whether TMJOIN should be used when starting XAResources.
    spring.jta.bitronix.connectionfactory.user= # The user to use to connect to the JMS provider.
    spring.jta.bitronix.datasource.acquire-increment=1 # Number of connections to create when growing the pool.
    spring.jta.bitronix.datasource.acquisition-interval=1 # Time, in seconds, to wait before trying to acquire a connection again after an invalid connection was acquired.
    spring.jta.bitronix.datasource.acquisition-timeout=30 # Timeout, in seconds, for acquiring connections from the pool.
    spring.jta.bitronix.datasource.allow-local-transactions=true # Whether the transaction manager should allow mixing XA and non-XA transactions.
    spring.jta.bitronix.datasource.apply-transaction-timeout=false # Whether the transaction timeout should be set on the XAResource when it is enlisted.
    spring.jta.bitronix.datasource.automatic-enlisting-enabled=true # Whether resources should be enlisted and delisted automatically.
    spring.jta.bitronix.datasource.cursor-holdability= # The default cursor holdability for connections.
    spring.jta.bitronix.datasource.defer-connection-release=true # Whether the database can run many transactions on the same connection and supports transaction interleaving.
    spring.jta.bitronix.datasource.enable-jdbc4-connection-test= # Whether Connection.isValid() is called when acquiring a connection from the pool.
    spring.jta.bitronix.datasource.ignore-recovery-failures=false # Whether recovery failures should be ignored.
    spring.jta.bitronix.datasource.isolation-level= # The default isolation level for connections.
    spring.jta.bitronix.datasource.local-auto-commit= # The default auto-commit mode for local transactions.
    spring.jta.bitronix.datasource.login-timeout= # Timeout, in seconds, for establishing a database connection.
    spring.jta.bitronix.datasource.max-idle-time=60 # The time, in seconds, after which connections are cleaned up from the pool.
    spring.jta.bitronix.datasource.max-pool-size=10 # The maximum size of the pool. 0 denotes no limit.
    spring.jta.bitronix.datasource.min-pool-size=0 # The minimum size of the pool.
    spring.jta.bitronix.datasource.prepared-statement-cache-size=0 # The target size of the prepared statement cache. 0 disables the cache.
    spring.jta.bitronix.datasource.share-transaction-connections=false #  Whether connections in the ACCESSIBLE state can be shared within the context of a transaction.
    spring.jta.bitronix.datasource.test-query= # SQL query or statement used to validate a connection before returning it.
    spring.jta.bitronix.datasource.two-pc-ordering-position=1 # The position that this resource should take during two-phase commit (always first is Integer.MIN_VALUE, and always last is Integer.MAX_VALUE).
    spring.jta.bitronix.datasource.unique-name=dataSource # The unique name used to identify the resource during recovery.
    spring.jta.bitronix.datasource.use-tm-join=true Whether TMJOIN should be used when starting XAResources.
    spring.jta.bitronix.properties.allow-multiple-lrc=false # Whether to allow multiple LRC resources to be enlisted into the same transaction.
    spring.jta.bitronix.properties.asynchronous2-pc=false # Enable asynchronously execution of two phase commit.
    spring.jta.bitronix.properties.background-recovery-interval-seconds=60 # Interval in seconds at which to run the recovery process in the background.
    spring.jta.bitronix.properties.current-node-only-recovery=true # Whether to recover only the current node.
    spring.jta.bitronix.properties.debug-zero-resource-transaction=false # Whether to log the creation and commit call stacks of transactions executed without a single enlisted resource.
    spring.jta.bitronix.properties.default-transaction-timeout=60 # Default transaction timeout, in seconds.
    spring.jta.bitronix.properties.disable-jmx=false # Whether to enable JMX support.
    spring.jta.bitronix.properties.exception-analyzer= # Set the fully qualified name of the exception analyzer implementation to use.
    spring.jta.bitronix.properties.filter-log-status=false # Whether to enable filtering of logs so that only mandatory logs are written.
    spring.jta.bitronix.properties.force-batching-enabled=true #  Whether disk forces are batched.
    spring.jta.bitronix.properties.forced-write-enabled=true # Whether logs are forced to disk.
    spring.jta.bitronix.properties.graceful-shutdown-interval=60 # Maximum amount of seconds the TM waits for transactions to get done before aborting them at shutdown time.
    spring.jta.bitronix.properties.jndi-transaction-synchronization-registry-name= # JNDI name of the TransactionSynchronizationRegistry.
    spring.jta.bitronix.properties.jndi-user-transaction-name= # JNDI name of the UserTransaction.
    spring.jta.bitronix.properties.journal=disk # Name of the journal. Can be 'disk', 'null', or a class name.
    spring.jta.bitronix.properties.log-part1-filename=btm1.tlog # Name of the first fragment of the journal.
    spring.jta.bitronix.properties.log-part2-filename=btm2.tlog # Name of the second fragment of the journal.
    spring.jta.bitronix.properties.max-log-size-in-mb=2 # Maximum size in megabytes of the journal fragments.
    spring.jta.bitronix.properties.resource-configuration-filename= # ResourceLoader configuration file name.
    spring.jta.bitronix.properties.server-id= # ASCII ID that must uniquely identify this TM instance. Defaults to the machine's IP address.
    spring.jta.bitronix.properties.skip-corrupted-logs=false # Skip corrupted transactions log entries.
    spring.jta.bitronix.properties.warn-about-zero-resource-transaction=true # Whether to log a warning for transactions executed without a single enlisted resource.
    # NARAYANA (NarayanaProperties)
    spring.jta.narayana.default-timeout=60s # Transaction timeout. If a duration suffix is not specified, seconds will be used.
    spring.jta.narayana.expiry-scanners=com.arjuna.ats.internal.arjuna.recovery.ExpiredTransactionStatusManagerScanner # Comma-separated list of expiry scanners.
    spring.jta.narayana.log-dir= # Transaction object store directory.
    spring.jta.narayana.one-phase-commit=true # Whether to enable one phase commit optimization.
    spring.jta.narayana.periodic-recovery-period=120s # Interval in which periodic recovery scans are performed. If a duration suffix is not specified, seconds will be used.
    spring.jta.narayana.recovery-backoff-period=10s # Back off period between first and second phases of the recovery scan. If a duration suffix is not specified, seconds will be used.
    spring.jta.narayana.recovery-db-pass= # Database password to be used by the recovery manager.
    spring.jta.narayana.recovery-db-user= # Database username to be used by the recovery manager.
    spring.jta.narayana.recovery-jms-pass= # JMS password to be used by the recovery manager.
    spring.jta.narayana.recovery-jms-user= # JMS username to be used by the recovery manager.
    spring.jta.narayana.recovery-modules= # Comma-separated list of recovery modules.
    spring.jta.narayana.transaction-manager-id=1 # Unique transaction manager id.
    spring.jta.narayana.xa-resource-orphan-filters= # Comma-separated list of orphan filters.
    # EMBEDDED MONGODB (EmbeddedMongoProperties)
    spring.mongodb.embedded.features=SYNC_DELAY # Comma-separated list of features to enable.
    spring.mongodb.embedded.storage.database-dir= # Directory used for data storage.
    spring.mongodb.embedded.storage.oplog-size= # Maximum size of the oplog, in megabytes.
    spring.mongodb.embedded.storage.repl-set-name= # Name of the replica set.
    spring.mongodb.embedded.version=2.6.10 # Version of Mongo to use.
    # REDIS (RedisProperties)
    spring.redis.cluster.max-redirects= # Maximum number of redirects to follow when executing commands across the cluster.
    spring.redis.cluster.nodes= # Comma-separated list of "host:port" pairs to bootstrap from.
    spring.redis.database=0 # Database index used by the connection factory.
    spring.redis.url= # Connection URL. Overrides host, port, and password. User is ignored. Example: redis://user:[email protected]:6379
    spring.redis.host=localhost # Redis server host.
    spring.redis.jedis.pool.max-active=8 # Max number of connections that can be allocated by the pool at a given time. Use a negative value for no limit.
    spring.redis.jedis.pool.max-idle=8 # Max number of "idle" connections in the pool. Use a negative value to indicate an unlimited number of idle connections.
    spring.redis.jedis.pool.max-wait=-1ms # Maximum amount of time a connection allocation should block before throwing an exception when the pool is exhausted. Use a negative value to block indefinitely.
    spring.redis.jedis.pool.min-idle=0 # Target for the minimum number of idle connections to maintain in the pool. This setting only has an effect if it is positive.
    spring.redis.lettuce.pool.max-active=8 # Maximum number of connections that can be allocated by the pool at a given time. Use a negative value for no limit.
    spring.redis.lettuce.pool.max-idle=8 # Maximum number of "idle" connections in the pool. Use a negative value to indicate an unlimited number of idle connections.
    spring.redis.lettuce.pool.max-wait=-1ms # Maximum amount of time a connection allocation should block before throwing an exception when the pool is exhausted. Use a negative value to block indefinitely.
    spring.redis.lettuce.pool.min-idle=0 # Target for the minimum number of idle connections to maintain in the pool. This setting only has an effect if it is positive.
    spring.redis.lettuce.shutdown-timeout=100ms # Shutdown timeout.
    spring.redis.password= # Login password of the redis server.
    spring.redis.port=6379 # Redis server port.
    spring.redis.sentinel.master= # Name of the Redis server.
    spring.redis.sentinel.nodes= # Comma-separated list of "host:port" pairs.
    spring.redis.ssl=false # Whether to enable SSL support.
    spring.redis.timeout=0 # Connection timeout.
    # TRANSACTION (TransactionProperties)
    spring.transaction.default-timeout= # Default transaction timeout. If a duration suffix is not specified, seconds will be used.
    spring.transaction.rollback-on-commit-failure= # Whether to roll back on commit failures.
    # ----------------------------------------
    # INTEGRATION PROPERTIES
    # ----------------------------------------
    # ACTIVEMQ (ActiveMQProperties)
    spring.activemq.broker-url= # URL of the ActiveMQ broker. Auto-generated by default.
    spring.activemq.close-timeout=15s # Time to wait before considering a close complete.
    spring.activemq.in-memory=true # Whether the default broker URL should be in memory. Ignored if an explicit broker has been specified.
    spring.activemq.non-blocking-redelivery=false # Whether to stop message delivery before re-delivering messages from a rolled back transaction. This implies that message order is not preserved when this is enabled.
    spring.activemq.password= # Login password of the broker.
    spring.activemq.send-timeout=0 # Time to wait on message sends for a response. Set it to 0 to wait forever.
    spring.activemq.user= # Login user of the broker.
    spring.activemq.packages.trust-all= # Whether to trust all packages.
    spring.activemq.packages.trusted= # Comma-separated list of specific packages to trust (when not trusting all packages).
    spring.activemq.pool.block-if-full=true # Whether to block when a connection is requested and the pool is full. Set it to false to throw a "JMSException" instead.
    spring.activemq.pool.block-if-full-timeout=-1ms # Blocking period before throwing an exception if the pool is still full.
    spring.activemq.pool.create-connection-on-startup=true # Whether to create a connection on startup. Can be used to warm up the pool on startup.
    spring.activemq.pool.enabled=false # Whether a PooledConnectionFactory should be created, instead of a regular ConnectionFactory.
    spring.activemq.pool.expiry-timeout=0ms # Connection expiration timeout.
    spring.activemq.pool.idle-timeout=30s # Connection idle timeout.
    spring.activemq.pool.max-connections=1 # Maximum number of pooled connections.
    spring.activemq.pool.maximum-active-session-per-connection=500 # Maximum number of active sessions per connection.
    spring.activemq.pool.reconnect-on-exception=true # Reset the connection when a "JMSException" occurs.
    spring.activemq.pool.time-between-expiration-check=-1ms # Time to sleep between runs of the idle connection eviction thread. When negative, no idle connection eviction thread runs.
    spring.activemq.pool.use-anonymous-producers=true # Whether to use only one anonymous "MessageProducer" instance. Set it to false to create one "MessageProducer" every time one is required.
    # ARTEMIS (ArtemisProperties)
    spring.artemis.embedded.cluster-password= # Cluster password. Randomly generated on startup by default.
    spring.artemis.embedded.data-directory= # Journal file directory. Not necessary if persistence is turned off.
    spring.artemis.embedded.enabled=true # Whether to enable embedded mode if the Artemis server APIs are available.
    spring.artemis.embedded.persistent=false # Whether to enable persistent store.
    spring.artemis.embedded.queues= # Comma-separated list of queues to create on startup.
    spring.artemis.embedded.server-id= # Server ID. By default, an auto-incremented counter is used.
    spring.artemis.embedded.topics= # Comma-separated list of topics to create on startup.
    spring.artemis.host=localhost # Artemis broker host.
    spring.artemis.mode= # Artemis deployment mode, auto-detected by default.
    spring.artemis.password= # Login password of the broker.
    spring.artemis.port=61616 # Artemis broker port.
    spring.artemis.user= # Login user of the broker.
    # SPRING BATCH (BatchProperties)
    spring.batch.initialize-schema=embedded # Database schema initialization mode.
    spring.batch.job.enabled=true # Execute all Spring Batch jobs in the context on startup.
    spring.batch.job.names= # Comma-separated list of job names to execute on startup (for instance, `job1,job2`). By default, all Jobs found in the context are executed.
    spring.batch.schema=classpath:org/springframework/batch/core/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema.
    spring.batch.table-prefix= # Table prefix for all the batch meta-data tables.
    # SPRING INTEGRATION (IntegrationProperties)
    spring.integration.jdbc.initialize-schema=embedded # Database schema initialization mode.
    spring.integration.jdbc.schema=classpath:org/springframework/integration/jdbc/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema.
    # JMS (JmsProperties)
    spring.jms.jndi-name= # Connection factory JNDI name. When set, takes precedence to others connection factory auto-configurations.
    spring.jms.listener.acknowledge-mode= # Acknowledge mode of the container. By default, the listener is transacted with automatic acknowledgment.
    spring.jms.listener.auto-startup=true # Start the container automatically on startup.
    spring.jms.listener.concurrency= # Minimum number of concurrent consumers.
    spring.jms.listener.max-concurrency= # Maximum number of concurrent consumers.
    spring.jms.pub-sub-domain=false # Whether the default destination type is topic.
    spring.jms.template.default-destination= # Default destination to use on send and receive operations that do not have a destination parameter.
    spring.jms.template.delivery-delay= # Delivery delay to use for send calls.
    spring.jms.template.delivery-mode= # Delivery mode. Enables QoS (Quality of Service) when set.
    spring.jms.template.priority= # Priority of a message when sending. Enables QoS (Quality of Service) when set.
    spring.jms.template.qos-enabled= # Whether to enable explicit QoS (Quality of Service) when sending a message.
    spring.jms.template.receive-timeout= # Timeout to use for receive calls.
    spring.jms.template.time-to-live= # Time-to-live of a message when sending. Enable QoS (Quality of Service) when set.
    # APACHE KAFKA (KafkaProperties)
    spring.kafka.admin.client-id= # ID to pass to the server when making requests. Used for server-side logging.
    spring.kafka.admin.fail-fast=false # Whether to fail fast if the broker is not available on startup.
    spring.kafka.admin.properties.*= # Additional admin-specific properties used to configure the client.
    spring.kafka.admin.ssl.key-password= # Password of the private key in the key store file.
    spring.kafka.admin.ssl.keystore-location= # Location of the key store file.
    spring.kafka.admin.ssl.keystore-password= # Password of the key store file.
    spring.kafka.admin.ssl.truststore-location= # Location of the trust store file.
    spring.kafka.admin.ssl.truststore-password= # Store password for the trust store file.
    spring.kafka.bootstrap-servers= # Comma-delimited list of host:port pairs to use for establishing the initial connection to the Kafka cluster.
    spring.kafka.client-id= # ID to pass to the server when making requests. Used for server-side logging.
    spring.kafka.consumer.auto-commit-interval= # Frequency with which the consumer offsets are auto-committed to Kafka if 'enable.auto.commit' is set to true.
    spring.kafka.consumer.auto-offset-reset= # What to do when there is no initial offset in Kafka or if the current offset no longer exists on the server.
    spring.kafka.consumer.bootstrap-servers= # Comma-delimited list of host:port pairs to use for establishing the initial connection to the Kafka cluster.
    spring.kafka.consumer.client-id= # ID to pass to the server when making requests. Used for server-side logging.
    spring.kafka.consumer.enable-auto-commit= # Whether the consumer's offset is periodically committed in the background.
    spring.kafka.consumer.fetch-max-wait= # Maximum amount of time the server blocks before answering the fetch request if there isn't sufficient data to immediately satisfy the requirement given by "fetch.min.bytes".
    spring.kafka.consumer.fetch-min-size= # Minimum amount of data, in bytes, the server should return for a fetch request.
    spring.kafka.consumer.group-id= # Unique string that identifies the consumer group to which this consumer belongs.
    spring.kafka.consumer.heartbeat-interval= # Expected time between heartbeats to the consumer coordinator.
    spring.kafka.consumer.key-deserializer= # Deserializer class for keys.
    spring.kafka.consumer.max-poll-records= # Maximum number of records returned in a single call to poll().
    spring.kafka.consumer.properties.*= # Additional consumer-specific properties used to configure the client.
    spring.kafka.consumer.ssl.key-password= # Password of the private key in the key store file.
    spring.kafka.consumer.ssl.keystore-location= # Location of the key store file.
    spring.kafka.consumer.ssl.keystore-password= # Store password for the key store file.
    spring.kafka.consumer.ssl.truststore-location= # Location of the trust store file.
    spring.kafka.consumer.ssl.truststore-password= # Store password for the trust store file.
    spring.kafka.consumer.value-deserializer= # Deserializer class for values.
    spring.kafka.jaas.control-flag=required # Control flag for login configuration.
    spring.kafka.jaas.enabled= # Whether to enable JAAS configuration.
    spring.kafka.jaas.login-module=com.sun.security.auth.module.Krb5LoginModule # Login module.
    spring.kafka.jaas.options= # Additional JAAS options.
    spring.kafka.listener.ack-count= # Number of records between offset commits when ackMode is "COUNT" or "COUNT_TIME".
    spring.kafka.listener.ack-mode= # Listener AckMode. See the spring-kafka documentation.
    spring.kafka.listener.ack-time= # Time between offset commits when ackMode is "TIME" or "COUNT_TIME".
    spring.kafka.listener.concurrency= # Number of threads to run in the listener containers.
    spring.kafka.listener.poll-timeout= # Timeout to use when polling the consumer.
    spring.kafka.listener.type=single # Listener type.
    spring.kafka.producer.acks= # Number of acknowledgments the producer requires the leader to have received before considering a request complete.
    spring.kafka.producer.batch-size= # Number of records to batch before sending.
    spring.kafka.producer.bootstrap-servers= # Comma-delimited list of host:port pairs to use for establishing the initial connection to the Kafka cluster.
    spring.kafka.producer.buffer-memory= # Total bytes of memory the producer can use to buffer records waiting to be sent to the server.
    spring.kafka.producer.client-id= # ID to pass to the server when making requests. Used for server-side logging.
    spring.kafka.producer.compression-type= # Compression type for all data generated by the producer.
    spring.kafka.producer.key-serializer= # Serializer class for keys.
    spring.kafka.producer.properties.*= # Additional producer-specific properties used to configure the client.
    spring.kafka.producer.retries= # When greater than zero, enables retrying of failed sends.
    spring.kafka.producer.ssl.key-password= # Password of the private key in the key store file.
    spring.kafka.producer.ssl.keystore-location= # Location of the key store file.
    spring.kafka.producer.ssl.keystore-password= # Store password for the key store file.
    spring.kafka.producer.ssl.truststore-location= # Location of the trust store file.
    spring.kafka.producer.ssl.truststore-password= # Store password for the trust store file.
    spring.kafka.producer.transaction-id-prefix= # When non empty, enables transaction support for producer.
    spring.kafka.producer.value-serializer= # Serializer class for values.
    spring.kafka.properties.*= # Additional properties, common to producers and consumers, used to configure the client.
    spring.kafka.ssl.key-password= # Password of the private key in the key store file.
    spring.kafka.ssl.keystore-location= # Location of the key store file.
    spring.kafka.ssl.keystore-password= # Store password for the key store file.
    spring.kafka.ssl.truststore-location= # Location of the trust store file.
    spring.kafka.ssl.truststore-password= # Store password for the trust store file.
    spring.kafka.template.default-topic= # Default topic to which messages are sent.
    # RABBIT (RabbitProperties)
    spring.rabbitmq.addresses= # Comma-separated list of addresses to which the client should connect.
    spring.rabbitmq.cache.channel.checkout-timeout= # Duration to wait to obtain a channel if the cache size has been reached.
    spring.rabbitmq.cache.channel.size= # Number of channels to retain in the cache.
    spring.rabbitmq.cache.connection.mode=channel # Connection factory cache mode.
    spring.rabbitmq.cache.connection.size= # Number of connections to cache.
    spring.rabbitmq.connection-timeout= # Connection timeout. Set it to zero to wait forever.
    spring.rabbitmq.dynamic=true # Whether to create an AmqpAdmin bean.
    spring.rabbitmq.host=localhost # RabbitMQ host.
    spring.rabbitmq.listener.direct.acknowledge-mode= # Acknowledge mode of container.
    spring.rabbitmq.listener.direct.auto-startup=true # Whether to start the container automatically on startup.
    spring.rabbitmq.listener.direct.consumers-per-queue= # Number of consumers per queue.
    spring.rabbitmq.listener.direct.default-requeue-rejected= # Whether rejected deliveries are re-queued by default. Defaults to true.
    spring.rabbitmq.listener.direct.idle-event-interval= # How often idle container events should be published.
    spring.rabbitmq.listener.direct.prefetch= # Number of messages to be handled in a single request. It should be greater than or equal to the transaction size (if used).
    spring.rabbitmq.listener.direct.retry.enabled=false # Whether publishing retries are enabled.
    spring.rabbitmq.listener.direct.retry.initial-interval=1000ms # Interval between the first and second attempt to publish or deliver a message.
    spring.rabbitmq.listener.direct.retry.max-attempts=3 # Maximum number of attempts to publish or deliver a message.
    spring.rabbitmq.listener.direct.retry.max-interval=10000ms # Maximum interval between attempts.
    spring.rabbitmq.listener.direct.retry.multiplier=1 # Multiplier to apply to the previous retry interval.
    spring.rabbitmq.listener.direct.retry.stateless=true # Whether retries are stateless or stateful.
    spring.rabbitmq.listener.simple.acknowledge-mode= # Acknowledge mode of container.
    spring.rabbitmq.listener.simple.auto-startup=true # Whether to start the container automatically on startup.
    spring.rabbitmq.listener.simple.concurrency= # Minimum number of listener invoker threads.
    spring.rabbitmq.listener.simple.default-requeue-rejected= # Whether to re-queue delivery failures.
    spring.rabbitmq.listener.simple.idle-event-interval= # How often idle container events should be published.
    spring.rabbitmq.listener.simple.max-concurrency= # Maximum number of listener invoker.
    spring.rabbitmq.listener.simple.prefetch= # Number of messages to be handled in a single request. It should be greater than or equal to the transaction size (if used).
    spring.rabbitmq.listener.simple.retry.enabled=false # Whether publishing retries are enabled.
    spring.rabbitmq.listener.simple.retry.initial-interval=1000 # Interval, in milliseconds, between the first and second attempt to deliver a message.
    spring.rabbitmq.listener.simple.retry.max-attempts=3 # Maximum number of attempts to deliver a message.
    spring.rabbitmq.listener.simple.retry.max-interval=10000 # Maximum interval, in milliseconds, between attempts.
    spring.rabbitmq.listener.simple.retry.multiplier=1.0 # Multiplier to apply to the previous delivery retry interval.
    spring.rabbitmq.listener.simple.retry.stateless=true # Whether or not retry is stateless or stateful.
    spring.rabbitmq.listener.simple.transaction-size= # Number of messages to be processed in a transaction. That is, the number of messages between acks. For best results, it should be less than or equal to the prefetch count.
    spring.rabbitmq.listener.type=simple # Listener container type.
    spring.rabbitmq.password= # Login to authenticate against the broker.
    spring.rabbitmq.port=5672 # RabbitMQ port.
    spring.rabbitmq.publisher-confirms=false # Whether to enable publisher confirms.
    spring.rabbitmq.publisher-returns=false # Whether to enable publisher returns.
    spring.rabbitmq.requested-heartbeat= # Requested heartbeat timeout; zero for none. If a duration suffix is not specified, seconds will be used.
    spring.rabbitmq.ssl.enabled=false # Whether to enable SSL support.
    spring.rabbitmq.ssl.key-store= # Path to the key store that holds the SSL certificate.
    spring.rabbitmq.ssl.key-store-password= # Password used to access the key store.
    spring.rabbitmq.ssl.key-store-type=PKCS12 # Key store type.
    spring.rabbitmq.ssl.trust-store= # Trust store that holds SSL certificates.
    spring.rabbitmq.ssl.trust-store-password= # Password used to access the trust store.
    spring.rabbitmq.ssl.trust-store-type=JKS # Trust store type.
    spring.rabbitmq.ssl.algorithm= # SSL algorithm to use. By default, configured by the Rabbit client library.
    spring.rabbitmq.template.mandatory=false # Whether to enable mandatory messages.
    spring.rabbitmq.template.receive-timeout=0 # Timeout for `receive()` methods.
    spring.rabbitmq.template.reply-timeout=5000 # Timeout for `sendAndReceive()` methods.
    spring.rabbitmq.template.retry.enabled=false # Whether to enable retries in the `RabbitTemplate`.
    spring.rabbitmq.template.retry.initial-interval=1000 # Interval, in milliseconds, between the first and second attempt to publish a message.
    spring.rabbitmq.template.retry.max-attempts=3 # Maximum number of attempts to publish a message.
    spring.rabbitmq.template.retry.max-interval=10000 # Maximum number of attempts to publish a message.
    spring.rabbitmq.template.retry.multiplier=1.0 # Multiplier to apply to the previous publishing retry interval.
    spring.rabbitmq.username= # Login user to authenticate to the broker.
    spring.rabbitmq.virtual-host= # Virtual host to use when connecting to the broker.
    # ----------------------------------------
    # ACTUATOR PROPERTIES
    # ----------------------------------------
    # MANAGEMENT HTTP SERVER (ManagementServerProperties)
    management.server.add-application-context-header=false # Add the "X-Application-Context" HTTP header in each response. Requires a custom management.server.port.
    management.server.address= # Network address that to which the management endpoints should bind. Requires a custom management.server.port.
    management.server.context-path= # Management endpoint context-path. For instance, `/actuator`. Requires a custom management.server.port
    management.server.port= # Management endpoint HTTP port. Uses the same port as the application by default. Configure a different port to use management-specific SSL.
    management.server.ssl.ciphers= # Supported SSL ciphers. Requires a custom management.port.
    management.server.ssl.client-auth= # Whether client authentication is wanted ("want") or needed ("need"). Requires a trust store. Requires a custom management.server.port.
    management.server.ssl.enabled= # Whether to enable SSL support. Requires a custom management.server.port.
    management.server.ssl.enabled-protocols= # Enabled SSL protocols. Requires a custom management.server.port.
    management.server.ssl.key-alias= # Alias that identifies the key in the key store. Requires a custom management.server.port.
    management.server.ssl.key-password= # Password used to access the key in the key store. Requires a custom management.server.port.
    management.server.ssl.key-store= # Path to the key store that holds the SSL certificate (typically a jks file). Requires a custom management.server.port.
    management.server.ssl.key-store-password= # Password used to access the key store. Requires a custom management.server.port.
    management.server.ssl.key-store-provider= # Provider for the key store. Requires a custom management.server.port.
    management.server.ssl.key-store-type= # Type of the key store. Requires a custom management.server.port.
    management.server.ssl.protocol=TLS # SSL protocol to use. Requires a custom management.server.port.
    management.server.ssl.trust-store= # Trust store that holds SSL certificates. Requires a custom management.server.port.
    management.server.ssl.trust-store-password= # Password used to access the trust store. Requires a custom management.server.port.
    management.server.ssl.trust-store-provider= # Provider for the trust store. Requires a custom management.server.port.
    management.server.ssl.trust-store-type= # Type of the trust store. Requires a custom management.server.port.
    # CLOUDFOUNDRY
    management.cloudfoundry.enabled=true # Whether to enable extended Cloud Foundry actuator endpoints.
    management.cloudfoundry.skip-ssl-validation=false # Whether to skip SSL verification for Cloud Foundry actuator endpoint security calls.
    # ENDPOINTS GENERAL CONFIGURATION
    management.endpoints.enabled-by-default= # Enable or disable all endpoints by default.
    # ENDPOINTS JMX CONFIGURATION (JmxEndpointProperties)
    management.endpoints.jmx.enabled=true # Whether JMX endpoints are enabled.
    management.endpoints.jmx.expose=* # Endpoint IDs that should be exposed or '*' for all.
    management.endpoints.jmx.exclude= # Endpoint IDs that should be excluded.
    management.endpoints.jmx.domain=org.springframework.boot # Endpoints JMX domain name. Fallback to 'spring.jmx.default-domain' if set.
    management.endpoints.jmx.static-names=false # Additional static properties to append to all ObjectNames of MBeans representing Endpoints.
    management.endpoints.jmx.unique-names=false # Whether to ensure that ObjectNames are modified in case of conflict.
    # ENDPOINTS WEB CONFIGURATION (WebEndpointProperties)
    management.endpoints.web.enabled=true # Whether web endpoints are enabled
    management.endpoints.web.expose=info,status # Endpoint IDs that should be exposed or '*' for all.
    management.endpoints.web.exclude= # Endpoint IDs that should be excluded.
    management.endpoints.web.base-path=/actuator # Base path for Web endpoints. Relative to server.context-path or management.server.context-path if management.server.port is configured.
    management.endpoints.web.path-mapping= # Mapping between endpoint IDs and the path that should expose them.
    # ENDPOINTS CORS CONFIGURATION (CorsEndpointProperties)
    management.endpoints.web.cors.allow-credentials= # Whether credentials are supported. When not set, credentials are not supported.
    management.endpoints.web.cors.allowed-headers= # Comma-separated list of headers to allow in a request. '*' allows all headers.
    management.endpoints.web.cors.allowed-methods= # Comma-separated list of methods to allow. '*' allows all methods. When not set, defaults to GET.
    management.endpoints.web.cors.allowed-origins= # Comma-separated list of origins to allow. '*' allows all origins. When not set, CORS support is disabled.
    management.endpoints.web.cors.exposed-headers= # Comma-separated list of headers to include in a response.
    management.endpoints.web.cors.max-age=1800 # How long the response from a pre-flight request can be cached by clients. If a duration suffix is not specified, seconds will be used.
    # AUDIT EVENTS ENDPOINT (AuditEventsEndpoint)
    management.endpoint.auditevents.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.auditevents.enabled= # Whether to enable the auditevents endpoint.
    # BEANS ENDPOINT (BeansEndpoint)
    management.endpoint.beans.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.beans.enabled= # Whether to enable the beans endpoint.
    # CONDITIONS REPORT ENDPOINT (ConditionsReportEndpoint)
    management.endpoint.conditions.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.conditions.enabled= # Whether to enable the conditions endpoint.
    # CONFIGURATION PROPERTIES REPORT ENDPOINT (ConfigurationPropertiesReportEndpoint)
    management.endpoint.configprops.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.configprops.enabled= # Whether to enable the configprops endpoint.
    management.endpoint.configprops.keys-to-sanitize=password,secret,key,token,.*credentials.*,vcap_services # Keys that should be sanitized. Keys can be simple strings that the property ends with or regular expressions.
    # ENVIRONMENT ENDPOINT  (EnvironmentEndpoint)
    management.endpoint.env.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.env.enabled= # Whether to enable the env endpoint.
    management.endpoint.env.keys-to-sanitize=password,secret,key,token,.*credentials.*,vcap_services # Keys that should be sanitized. Keys can be simple strings that the property ends with or regular expressions.
    # FLYWAY ENDPOINT (FlywayEndpoint)
    management.endpoint.flyway.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.flyway.enabled= # Whether to enable the flyway endpoint.
    # HEALTH ENDPOINT (HealthEndpoint)
    management.endpoint.health.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.health.enabled= # Whether to enable the health endpoint.
    management.endpoint.health.show-details= # Whether to show full health details
    # HEAP DUMP ENDPOINT (HeapDumpWebEndpoint)
    management.endpoint.heapdump.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.heapdump.enabled= # Whether to enable the heapdump endpoint.
    # INFO ENDPOINT (InfoEndpoint)
    management.endpoint.info.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.info.enabled=true # Whether to enable the info endpoint.
    # LIQUIBASE ENDPOINT (LiquibaseEndpoint)
    management.endpoint.liquibase.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.liquibase.enabled= # Whether to enable the liquibase endpoint.
    # LOG FILE ENDPOINT (LogFileWebEndpoint)
    management.endpoint.logfile.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.logfile.enabled= # Whether to enable the logfile endpoint.
    management.endpoint.logfile.external-file= # External Logfile to be accessed. Can be used if the logfile is written by output redirect and not by the logging system itself.
    # LOGGERS ENDPOINT (LoggersEndpoint)
    management.endpoint.loggers.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.loggers.enabled= # Whether to enable the loggers endpoint.
    # REQUEST MAPPING ENDPOINT  (RequestMappingEndpoint)
    management.endpoint.mappings.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.mappings.enabled= # Whether to enable the mappings endpoint.
    # METRICS ENDPOINT (MetricsEndpoint)
    management.endpoint.metrics.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.metrics.enabled= # Whether to enable the metrics endpoint.
    # PROMETHEUS ENDPOINT (PrometheusScrapeEndpoint)
    management.endpoint.prometheus.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.prometheus.enabled= # Whether to enable the metrics endpoint.
    # SCHEDULED TASKS ENDPOINT (ScheduledTasksEndpoint)
    management.endpoint.scheduledtasks.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.scheduledtasks.enabled= # Whether to enable the scheduled tasks endpoint.
    # SESSIONS ENDPOINT (SessionsEndpoint)
    management.endpoint.sessions.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.sessions.enabled= # Whether to enable the sessions endpoint.
    # SHUTDOWN ENDPOINT (ShutdownEndpoint)
    management.endpoint.shutdown.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.shutdown.enabled=false # Whether to enable the shutdown endpoint.
    # THREAD DUMP ENDPOINT (ThreadDumpEndpoint)
    management.endpoint.threaddump.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.threaddump.enabled= # Whether to enable the threaddump endpoint.
    # TRACE ENDPOINT (TraceEndpoint)
    management.endpoint.trace.cache.time-to-live=0ms # Maximum time that a response can be cached.
    management.endpoint.trace.enabled= # Whether to enable the trace endpoint.
    # HEALTH INDICATORS
    management.health.db.enabled=true # Whether to enable database health check.
    management.health.cassandra.enabled=true # Whether to enable Cassandra health check.
    management.health.couchbase.enabled=true # Whether to enable Couchbase health check.
    management.health.defaults.enabled=true # Whether to enable default health indicators.
    management.health.diskspace.enabled=true # Whether to enable disk space health check.
    management.health.diskspace.path= # Path used to compute the available disk space.
    management.health.diskspace.threshold=0 # Minimum disk space, in bytes, that should be available.
    management.health.elasticsearch.enabled=true # Whether to enable Elasticsearch health check.
    management.health.elasticsearch.indices= # Comma-separated index names.
    management.health.elasticsearch.response-timeout=100ms # The time to wait for a response from the cluster.
    management.health.jms.enabled=true # Whether to enable JMS health check.
    management.health.ldap.enabled=true # Whether to enable LDAP health check.
    management.health.mail.enabled=true # Whether to enable Mail health check.
    management.health.mongo.enabled=true # Whether to enable MongoDB health check.
    management.health.neo4j.enabled=true # Whether to enable Neo4j health check.
    management.health.rabbit.enabled=true # Whether to enable RabbitMQ health check.
    management.health.redis.enabled=true # Whether to enable Redis health check.
    management.health.solr.enabled=true # Whether to enable Solr health check.
    management.health.status.http-mapping= # Mapping of health statuses to HTTP status codes. By default, registered health statuses map to sensible defaults (for example, UP maps to 200).
    management.health.status.order=DOWN, OUT_OF_SERVICE, UP, UNKNOWN # Comma-separated list of health statuses in order of severity.
    # INFO CONTRIBUTORS (InfoContributorProperties)
    management.info.build.enabled=true # Whether to enable build info.
    management.info.defaults.enabled=true # Whether to enable default info contributors.
    management.info.env.enabled=true # Whether to enable environment info.
    management.info.git.enabled=true # Whether to enable git info.
    management.info.git.mode=simple # Mode to use to expose git information.
    # JOLOKIA (JolokiaProperties)
    management.jolokia.config.*= # Jolokia settings. See the Jolokia manual for details.
    management.jolokia.enabled=false # Whether to enable Jolokia.
    management.jolokia.path=/jolokia # Path at which Jolokia is available.
    # TRACING (TraceEndpointProperties)
    management.trace.filter.enabled=true # Whether to enable the trace servlet filter.
    management.trace.include=request-headers,response-headers,cookies,errors # Items to be included in the trace.
    # METRICS
    spring.metrics.use-global-registry=true # Whether auto-configured MeterRegistry implementations should be bound to the global static registry on Metrics.
    spring.metrics.export.atlas.batch-size= # Number of measurements per request to use for the backend. If more measurements are found, then multiple requests will be made.
    spring.metrics.export.atlas.config-refresh-frequency= # Frequency for refreshing config settings from the LWC service.
    spring.metrics.export.atlas.config-time-to-live= # Time to live for subscriptions from the LWC service.
    spring.metrics.export.atlas.config-uri= # URI for the Atlas LWC endpoint to retrieve current subscriptions.
    spring.metrics.export.atlas.connect-timeout= # Connection timeout for requests to the backend.
    spring.metrics.export.atlas.enabled= # Whether exporting of metrics to this backend is enabled.
    spring.metrics.export.atlas.eval-uri= # URI for the Atlas LWC endpoint to evaluate the data for a subscription.
    spring.metrics.export.atlas.lwc-enabled= # Enable streaming to Atlas LWC.
    spring.metrics.export.atlas.meter-time-to-live= # Time to live for meters that do not have any activity. After this period the meter will be considered expired and will not get reported.
    spring.metrics.export.atlas.num-threads= # Number of threads to use with the metrics publishing scheduler.
    spring.metrics.export.atlas.read-timeout= # Read timeout for requests to the backend.
    spring.metrics.export.atlas.step=1m # Step size (i.e. reporting frequency) to use.
    spring.metrics.export.atlas.uri= # URI of the Atlas server.
    spring.metrics.export.datadog.api-key= # Datadog API key.
    spring.metrics.export.datadog.batch-size= # Number of measurements per request to use for the backend. If more measurements are found, then multiple requests will be made.
    spring.metrics.export.datadog.connect-timeout= # Connection timeout for requests to the backend.
    spring.metrics.export.datadog.enabled= # Whether exporting of metrics to this backend is enabled.
    spring.metrics.export.datadog.host-tag= # Tag that will be mapped to "host" when shipping metrics to Datadog. Can be omitted if host should be omitted on publishing.
    spring.metrics.export.datadog.num-threads= # Number of threads to use with the metrics publishing scheduler.
    spring.metrics.export.datadog.read-timeout= # Read timeout for requests to the backend.
    spring.metrics.export.datadog.step=1m # Step size (i.e. reporting frequency) to use.
    spring.metrics.export.datadog.uri= # URI to ship metrics to. If you need to publish metrics to an internal proxy en-route to Datadog, you can define the location of the proxy with this.
    spring.metrics.export.ganglia.addressing-mode= # UDP addressing mode, either unicast or multicast.
    spring.metrics.export.ganglia.duration-units= # Base time unit used to report durations.
    spring.metrics.export.ganglia.enabled= # Whether exporting of metrics to Ganglia is enabled.
    spring.metrics.export.ganglia.host= # Host of the Ganglia server to receive exported metrics.
    spring.metrics.export.ganglia.port= # Port of the Ganglia server to receive exported metrics.
    spring.metrics.export.ganglia.protocol-version= # Ganglia protocol version. Must be either 3.1 or 3.0.
    spring.metrics.export.ganglia.rate-units= # Base time unit used to report rates.
    spring.metrics.export.ganglia.step= # Step size (i.e. reporting frequency) to use.
    spring.metrics.export.ganglia.time-to-live= # Time to live for metrics on Ganglia.
    spring.metrics.export.graphite.duration-units= # Base time unit used to report durations.
    spring.metrics.export.graphite.enabled= # Whether exporting of metrics to Graphite is enabled.
    spring.metrics.export.graphite.host= # Host of the Graphite server to receive exported metrics.
    spring.metrics.export.graphite.port= # Port of the Graphite server to receive exported metrics.
    spring.metrics.export.graphite.protocol= # Protocol to use while shipping data to Graphite.
    spring.metrics.export.graphite.rate-units= # Base time unit used to report rates.
    spring.metrics.export.graphite.step= # Step size (i.e. reporting frequency) to use.
    spring.metrics.export.influx.batch-size= # Number of measurements per request to use for the backend. If more measurements are found, then multiple requests will be made.
    spring.metrics.export.influx.compressed= # Enable GZIP compression of metrics batches published to Influx.
    spring.metrics.export.influx.connect-timeout= # Connection timeout for requests to the backend.
    spring.metrics.export.influx.consistency= # Write consistency for each point.
    spring.metrics.export.influx.db= # Tag that will be mapped to "host" when shipping metrics to Influx. Can be omitted if host should be omitted on publishing.
    spring.metrics.export.influx.enabled= # Whether exporting of metrics to this backend is enabled.
    spring.metrics.export.influx.num-threads= # Number of threads to use with the metrics publishing scheduler.
    spring.metrics.export.influx.password= # Login password of the Influx server.
    spring.metrics.export.influx.read-timeout= # Read timeout for requests to the backend.
    spring.metrics.export.influx.retention-policy= # Retention policy to use (Influx writes to the DEFAULT retention policy if one is not specified).
    spring.metrics.export.influx.step=1m # Step size (i.e. reporting frequency) to use.
    spring.metrics.export.influx.uri= # URI of the Influx server.
    spring.metrics.export.influx.user-name= # Login user of the Influx server.
    spring.metrics.export.prometheus.descriptions= # Enable publishing descriptions as part of the scrape payload to Prometheus. Turn this off to minimize the amount of data sent on each scrape.
    spring.metrics.export.prometheus.enabled= # Whether exporting of metrics to Prometheus is enabled.
    spring.metrics.export.prometheus.step= # Step size (i.e. reporting frequency) to use.
    spring.metrics.export.simple.enabled=false # Whether exporting of metrics to a simple in-memory store is enabled.
    spring.metrics.export.simple.mode=cumulative # Counting mode.
    spring.metrics.export.simple.step=10s # Step size (i.e. reporting frequency) to use.
    spring.metrics.export.statsd.enabled= # Export metrics to StatsD.
    spring.metrics.export.statsd.flavor=datadog # StatsD line protocol to use.
    spring.metrics.export.statsd.host=localhost # Host of the StatsD server to receive exported metrics.
    spring.metrics.export.statsd.max-packet-length=1400 # Total length of a single payload should be kept within your network's MTU.
    spring.metrics.export.statsd.polling-frequency=10s # How often gauges will be polled. When a gauge is polled, its value is recalculated and if the value has changed, it is sent to the StatsD server.
    spring.metrics.export.statsd.port=8125 # Port of the StatsD server to receive exported metrics.
    spring.metrics.export.statsd.queue-size=2147483647 # Maximum size of the queue of items waiting to be sent to the StatsD server.
    spring.metrics.jdbc.datasource-metric-name=data.source # Name of the metric for data source usage.
    spring.metrics.jdbc.instrument-datasource=true # Instrument all available data sources.
    spring.metrics.web.client.record-request-percentiles=false # Whether instrumented requests record percentiles histogram buckets by default.
    spring.metrics.web.client.requests-metric-name=http.client.requests # Name of the metric for sent requests.
    spring.metrics.web.server.auto-time-requests=true # Whether requests handled by Spring MVC or WebFlux should be automatically timed.
    spring.metrics.web.server.record-request-percentiles=false # Whether instrumented requests record percentiles histogram buckets by default.
    spring.metrics.web.server.requests-metric-name=http.server.requests # Name of the metric for received requests.
    # ----------------------------------------
    # DEVTOOLS PROPERTIES
    # ----------------------------------------
    # DEVTOOLS (DevToolsProperties)
    spring.devtools.livereload.enabled=true # Whether to enable a livereload.com-compatible server.
    spring.devtools.livereload.port=35729 # Server port.
    spring.devtools.restart.additional-exclude= # Additional patterns that should be excluded from triggering a full restart.
    spring.devtools.restart.additional-paths= # Additional paths to watch for changes.
    spring.devtools.restart.enabled=true # Enable automatic restart.
    spring.devtools.restart.exclude=META-INF/maven/**,META-INF/resources/**,resources/**,static/**,public/**,templates/**,**/*Test.class,**/*Tests.class,git.properties # Patterns that should be excluded from triggering a full restart.
    spring.devtools.restart.log-condition-evaluation-delta=true # Whether to log the condition evaluation delta upon restart.
    spring.devtools.restart.poll-interval=1s # Amount of time to wait between polling for classpath changes.
    spring.devtools.restart.quiet-period=400ms # Amount of quiet time required without any classpath changes before a restart is triggered.
    spring.devtools.restart.trigger-file= # Name of a specific file that, when changed, triggers the restart check. If not specified, any classpath file change triggers the restart.
    # REMOTE DEVTOOLS (RemoteDevToolsProperties)
    spring.devtools.remote.context-path=/.~~spring-boot!~ # Context path used to handle the remote connection.
    spring.devtools.remote.proxy.host= # The host of the proxy to use to connect to the remote application.
    spring.devtools.remote.proxy.port= # The port of the proxy to use to connect to the remote application.
    spring.devtools.remote.restart.enabled=true # Whether to enable remote restart.
    spring.devtools.remote.secret= # A shared secret required to establish a connection (required to enable remote support).
    spring.devtools.remote.secret-header-name=X-AUTH-TOKEN # HTTP header used to transfer the shared secret.
    # ----------------------------------------
    # TESTING PROPERTIES
    # ----------------------------------------
    spring.test.database.replace=any # Type of existing DataSource to replace.
    spring.test.mockmvc.print=default # MVC Print option.

    Spring Boot jars include metadata files that provide details of all supported configuration properties. The files are designed to let IDE developers offer contextual help and “code completion” as users are working with application.properties or application.yml files.

    The majority of the metadata file is generated automatically at compile time by processing all items annotated with @ConfigurationProperties . However, it is possible to write part of the metadata manually for corner cases or more advanced use cases.

    Configuration metadata files are located inside jars under META-INF/spring-configuration-metadata.json They use a simple JSON format with items categorized under either “groups” or “properties” and additional values hints categorized under "hints", as shown in the following example:

    {"groups": [
    		"name": "server",
    		"type": "org.springframework.boot.autoconfigure.web.ServerProperties",
    		"sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties"
    		"name": "spring.jpa.hibernate",
    		"type": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate",
    		"sourceType": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties",
    		"sourceMethod": "getHibernate()"
    ],"properties": [
    		"name": "server.port",
    		"type": "java.lang.Integer",
    		"sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties"
    		"name": "server.servlet.path",
    		"type": "java.lang.String",
    		"sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties",
    		"defaultValue": "/"
    		  "name": "spring.jpa.hibernate.ddl-auto",
    		  "type": "java.lang.String",
    		  "description": "DDL mode. This is actually a shortcut for the \"hibernate.hbm2ddl.auto\" property.",
    		  "sourceType": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate"
    ],"hints": [
    		"name": "spring.jpa.hibernate.ddl-auto",
    		"values": [
    				"value": "none",
    				"description": "Disable DDL handling."
    				"value": "validate",
    				"description": "Validate the schema, make no changes to the database."
    				"value": "update",
    				"description": "Update the schema if necessary."
    				"value": "create",
    				"description": "Create the schema and destroy previous data."
    				"value": "create-drop",
    				"description": "Create and then destroy the schema at the end of the session."
    ]}

    Each “property” is a configuration item that the user specifies with a given value. For example, server.port and server.servlet.path might be specified in application.properties , as follows:

    server.port=9090
    server.servlet.path=/home

    The “groups” are higher level items that do not themselves specify a value but instead provide a contextual grouping for properties. For example, the server.port and server.servlet.path properties are part of the server group.

    [Note] Note

    It is not required that every “property” has a “group”. Some properties might exist in their own right.

    Finally, “hints” are additional information used to assist the user in configuring a given property. For example, when a developer is configuring the spring.jpa.hibernate.ddl-auto property, a tool can use the hints to offer some auto-completion help for the none , validate , update , create , and create-drop values.

    The JSON object contained in the groups array can contain the attributes shown in the following table:

    Name Type Purpose

    name

    String

    The full name of the group. This attribute is mandatory.

    type

    String

    The class name of the data type of the group. For example, if the group were based on a class annotated with @ConfigurationProperties , the attribute would contain the fully qualified name of that class. If it were based on a @Bean method, it would be the return type of that method. If the type is not known, the attribute may be omitted.

    description

    String

    A short description of the group that can be displayed to users. If not description is available, it may be omitted. It is recommended that descriptions be short paragraphs, with the first line providing a concise summary. The last line in the description should end with a period ( . ).

    sourceType

    String

    The class name of the source that contributed this group. For example, if the group were based on a @Bean method annotated with @ConfigurationProperties , this attribute would contain the fully qualified name of the @Configuration class that contains the method. If the source type is not known, the attribute may be omitted.

    sourceMethod

    String

    The full name of the method (include parenthesis and argument types) that contributed this group (for example, the name of a @ConfigurationProperties annotated @Bean method). If the source method is not known, it may be omitted.

    The JSON object contained in the properties array can contain the attributes described in the following table:

    Name Type Purpose

    name

    String

    The full name of the property. Names are in lower-case period-separated form (for example, server.servlet.path ). This attribute is mandatory.

    type

    String

    The full signature of the data type of the property (for example, java.lang.String ) but also a full generic type (such as java.util.Map<java.util.String,acme.MyEnum> ). You can use this attribute to guide the user as to the types of values that they can enter. For consistency, the type of a primitive is specified by using its wrapper counterpart (for example, boolean becomes java.lang.Boolean ). Note that this class may be a complex type that gets converted from a String as values are bound. If the type is not known, it may be omitted.

    description

    String

    A short description of the group that can be displayed to users. If no description is available, it may be omitted. It is recommended that descriptions be short paragraphs, with the first line providing a concise summary. The last line in the description should end with a period ( . ).

    sourceType

    String

    The class name of the source that contributed this property. For example, if the property were from a class annotated with @ConfigurationProperties , this attribute would contain the fully qualified name of that class. If the source type is unknown, it may be omitted.

    defaultValue

    Object

    The default value, which is used if the property is not specified. If the type of the property is an array, it can be an array of value(s). If the default value is unknown, it may be omitted.

    deprecation

    Deprecation

    Specify whether the property is deprecated. If the field is not deprecated or if that information is not known, it may be omitted. The next table offers more detail about the deprecation attribute.

    The JSON object contained in the deprecation attribute of each properties element can contain the following attributes:

    Name Type Purpose

    level

    String

    The level of deprecation, which can be either warning (the default) or error . When a property has a warning deprecation level, it should still be bound in the environment. However, when it has an error deprecation level, the property is no longer managed and is not bound.

    reason

    String

    A short description of the reason why the property was deprecated. If no reason is available, it may be omitted. It is recommended that descriptions be short paragraphs, with the first line providing a concise summary. The last line in the description should end with a period ( . ).

    replacement

    String

    The full name of the property that replaces this deprecated property. If there is no replacement for this property, it may be omitted.

    [Note] Note

    Prior to Spring Boot 1.3, a single deprecated boolean attribute can be used instead of the deprecation element. This is still supported in a deprecated fashion and should no longer be used. If no reason and replacement are available, an empty deprecation object should be set.

    Deprecation can also be specified declaratively in code by adding the @DeprecatedConfigurationProperty annotation to the getter exposing the deprecated property. For instance, assume that the app.foo.target property was confusing and was renamed to app.foo.name . The following example shows how to handle that situation:

    @ConfigurationProperties("app.foo")
    public class FooProperties {
    	private String name;
    	public String getName() { ... }
    	public void setName(String name) { ... }
    	@DeprecatedConfigurationProperty(replacement = "app.foo.name")
    	@Deprecated
    	public String getTarget() {
    		return getName();
    	@Deprecated
    	public void setTarget(String target) {
    		setName(target);
    }
    [Note] Note

    There is no way to set a level . warning is always assumed, since code is still handling the property.

    The preceding code makes sure that the deprecated property still works (delegating to the name property behind the scenes). Once the getTarget and setTarget methods can be removed from your public API, the automatic deprecation hint in the metadata goes away as well. If you want to keep a hint, adding manual metadata with an error deprecation level ensures that users are still informed about that property. Doing so is particularly useful when a replacement is provided.

    The JSON object contained in the hints array can contain the attributes shown in the following table:

    Name Type Purpose

    name

    String

    The full name of the property to which this hint refers. Names are in lower-case period-separated form (such as server.servlet.path ). If the property refers to a map (such as system.contexts ), the hint either applies to the keys of the map ( system.context.keys ) or the values ( system.context.values ) of the map. This attribute is mandatory.

    values

    ValueHint[]

    A list of valid values as defined by the ValueHint object (described in the next table). Each entry defines the value and may have a description.

    providers

    ValueProvider[]

    A list of providers as defined by the ValueProvider object (described later in this document). Each entry defines the name of the provider and its parameters, if any.

    The JSON object contained in the values attribute of each hint element can contain the attributes described in the following table:

    Name Type Purpose

    value

    Object

    A valid value for the element to which the hint refers. If the type of the property is an array, it can also be an array of value(s). This attribute is mandatory.

    description

    String

    A short description of the value that can be displayed to users. If no description is available, it may be omitted . It is recommended that descriptions be short paragraphs, with the first line providing a concise summary. The last line in the description should end with a period ( . ).

    The JSON object contained in the providers attribute of each hint element can contain the attributes described in the following table:

    Name Type Purpose

    name

    String

    The name of the provider to use to offer additional content assistance for the element to which the hint refers.

    parameters

    JSON object

    Any additional parameter that the provider supports (check the documentation of the provider for more details).

    To improve the user experience and further assist the user in configuring a given property, you can provide additional metadata that:

    The name attribute of each hint refers to the name of a property. In the initial example shown earlier , we provide five values for the spring.jpa.hibernate.ddl-auto property: none , validate , update , create , and create-drop . Each value may have a description as well.

    If your property is of type Map , you can provide hints for both the keys and the values (but not for the map itself). The special .keys and .values suffixes must refer to the keys and the values, respectively.

    Assume a sample.contexts maps magic String values to an integer, as shown in the following example:

    @ConfigurationProperties("sample")
    public class SampleProperties {
    	private Map<String,Integer> contexts;
    	// getters and setters
    }

    The magic values are (in this example) are sample1 and sample2 . In order to offer additional content assistance for the keys, you could add the following JSON to the manual metadata of the module :

    {"hints": [
    		"name": "sample.contexts.keys",
    		"values": [
    				"value": "sample1"
    				"value": "sample2"
    ]}
    [Tip] Tip

    We recommend that you use an Enum for those two values instead. If your IDE supports it, this is by far the most effective approach to auto-completion.

    Providers are a powerful way to attach semantics to a property. In this section, we define the official providers that you can use for your own hints. However, your favorite IDE may implement some of these or none of them. Also, it could eventually provide its own.

    [Note] Note

    As this is a new feature, IDE vendors must catch up with how it works. Adoption times naturally vary.

    The following table summarizes the list of supported providers:

    Name Description

    any

    Permits any additional value to be provided.

    class-reference

    Auto-completes the classes available in the project. Usually constrained by a base class that is specified by the target parameter.

    handle-as

    Handles the property as if it were defined by the type defined by the mandatory target parameter.

    logger-name

    Auto-completes valid logger names. Typically, package and class names available in the current project can be auto-completed.

    spring-bean-reference

    Auto-completes the available bean names in the current project. Usually constrained by a base class that is specified by the target parameter.

    spring-profile-name

    Auto-completes the available Spring profile names in the project.

    [Tip] Tip

    Only one provider can be active for a given property, but you can specify several providers if they can all manage the property in some way . Make sure to place the most powerful provider first, as the IDE must use the first one in the JSON section that it can handle. If no provider for a given property is supported, no special content assistance is provided, either.

    The class-reference provider auto-completes classes available in the project. This provider supports the following parameters:

    Parameter Type Default value Description

    target

    String ( Class )

    none

    The fully qualified name of the class that should be assignable to the chosen value. Typically used to filter out-non candidate classes. Note that this information can be provided by the type itself by exposing a class with the appropriate upper bound.

    concrete

    boolean

    true

    Specify whether only concrete classes are to be considered as valid candidates.

    The following metadata snippet corresponds to the standard server.servlet.jsp.class-name property that defines the JspServlet class name to use:

    {"hints": [
    		"name": "server.servlet.jsp.class-name",
    		"providers": [
    				"name": "class-reference",
    				"parameters": {
    					"target": "javax.servlet.http.HttpServlet"
    ]}

    The handle-as provider lets you substitute the type of the property to a more high-level type. This typically happens when the property has a java.lang.String type, because you do not want your configuration classes to rely on classes that may not be on the classpath. This provider supports the following parameters:

    Parameter Type Default value Description

    target

    String ( Class )

    none

    The fully qualified name of the type to consider for the property. This parameter is mandatory.

    The following types can be used:

    [Tip] Tip

    If multiple values can be provided, use a Collection or Array type to teach the IDE about it.

    The following metadata snippet corresponds to the standard spring.liquibase.change-log property that defines the path to the changelog to use. It is actually used internally as a org.springframework.core.io.Resource but cannot be exposed as such, because we need to keep the original String value to pass it to the Liquibase API.

    {"hints": [
    		"name": "spring.liquibase.change-log",
    		"providers": [
    				"name": "handle-as",
    				"parameters": {
    					"target": "org.springframework.core.io.Resource"
    ]}

    The spring-bean-reference provider auto-completes the beans that are defined in the configuration of the current project. This provider supports the following parameters:

    Parameter Type Default value Description

    target

    String ( Class )

    none

    The fully qualified name of the bean class that should be assignable to the candidate. Typically used to filter out non-candidate beans.

    The following metadata snippet corresponds to the standard spring.jmx.server property that defines the name of the MBeanServer bean to use:

    {"hints": [
    		"name": "spring.jmx.server",
    		"providers": [
    				"name": "spring-bean-reference",
    				"parameters": {
    					"target": "javax.management.MBeanServer"
    ]}
    [Note] Note

    The binder is not aware of the metadata. If you provide that hint, you still need to transform the bean name into an actual Bean reference using by the ApplicationContext .

    You can easily generate your own configuration metadata file from items annotated with @ConfigurationProperties by using the spring-boot-configuration-processor jar. The jar includes a Java annotation processor which is invoked as your project is compiled. To use the processor, include spring-boot-configuration-processor as an optional dependency. For example, with Maven, you can add:

    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-configuration-processor</artifactId>
    	<optional>true</optional>
    </dependency>

    With Gradle, you can use the propdeps-plugin and specify the following dependency:

    dependencies {
    	optional "org.springframework.boot:spring-boot-configuration-processor"
    compileJava.dependsOn(processResources)
    [Note] Note

    You need to add compileJava.dependsOn(processResources) to your build to ensure that resources are processed before code is compiled. Without this directive, any additional-spring-configuration-metadata.json files are not processed.

    The processor picks up both classes and methods that are annotated with @ConfigurationProperties . The Javadoc for field values within configuration classes is used to populate the description attribute.

    [Note] Note

    You should only use simple text with @ConfigurationProperties field Javadoc, since they are not processed before being added to the JSON.

    Properties are discovered through the presence of standard getters and setters with special handling for collection types (that is detected even if only a getter is present). The annotation processor also supports the use of the @Data , @Getter , and @Setter lombok annotations.

    [Note] Note

    If you are using AspectJ in your project, you need to make sure that the annotation processor runs only once. There are several ways to do this. With Maven, you can configure the maven-apt-plugin explicitly and add the dependency to the annotation processor only there. You could also let the AspectJ plugin run all the processing and disable annotation processing in the maven-compiler-plugin configuration, as follows:

    <plugin>
    	<groupId>org.apache.maven.plugins</groupId>
    	<artifactId>maven-compiler-plugin</artifactId>
    	<configuration>
    		<proc>none</proc>
    	</configuration>
    </plugin>

    Here is a list of all auto-configuration classes provided by Spring Boot, with links to documentation and source code. Remember to also look at the conditions report in your application for more details of which features are switched on. (To do so, start the app with --debug or -Ddebug or, in an Actuator application, use the conditions endpoint).

    The following auto-configuration classes are from the spring-boot-autoconfigure module:

    Configuration Class Links

    ActiveMQAutoConfiguration

    javadoc

    AopAutoConfiguration

    javadoc

    ArtemisAutoConfiguration

    javadoc

    BatchAutoConfiguration

    javadoc

    CacheAutoConfiguration

    javadoc

    CassandraAutoConfiguration

    javadoc

    CassandraDataAutoConfiguration

    javadoc

    CassandraReactiveDataAutoConfiguration

    javadoc

    CassandraReactiveRepositoriesAutoConfiguration

    javadoc

    CassandraRepositoriesAutoConfiguration

    javadoc

    CloudAutoConfiguration

    javadoc

    CodecsAutoConfiguration

    javadoc

    ConfigurationPropertiesAutoConfiguration

    javadoc

    CouchbaseAutoConfiguration

    javadoc

    CouchbaseDataAutoConfiguration

    javadoc

    CouchbaseReactiveDataAutoConfiguration

    javadoc

    CouchbaseReactiveRepositoriesAutoConfiguration

    javadoc

    CouchbaseRepositoriesAutoConfiguration

    javadoc

    DataSourceAutoConfiguration

    javadoc

    DataSourceTransactionManagerAutoConfiguration

    javadoc

    DispatcherServletAutoConfiguration

    javadoc

    ElasticsearchAutoConfiguration

    javadoc

    ElasticsearchDataAutoConfiguration

    javadoc

    ElasticsearchRepositoriesAutoConfiguration

    javadoc

    EmbeddedLdapAutoConfiguration

    javadoc

    EmbeddedMongoAutoConfiguration

    javadoc

    ErrorMvcAutoConfiguration

    javadoc

    ErrorWebFluxAutoConfiguration

    javadoc

    FlywayAutoConfiguration

    javadoc

    FreeMarkerAutoConfiguration

    javadoc

    GroovyTemplateAutoConfiguration

    javadoc

    GsonAutoConfiguration

    javadoc

    H2ConsoleAutoConfiguration

    javadoc

    HazelcastAutoConfiguration

    javadoc

    HazelcastJpaDependencyAutoConfiguration

    javadoc

    HibernateJpaAutoConfiguration

    javadoc

    HttpEncodingAutoConfiguration

    javadoc

    HttpHandlerAutoConfiguration

    javadoc

    HttpMessageConvertersAutoConfiguration

    javadoc

    HypermediaAutoConfiguration

    javadoc

    InfluxDbAutoConfiguration

    javadoc

    IntegrationAutoConfiguration

    javadoc

    JacksonAutoConfiguration

    javadoc

    JdbcTemplateAutoConfiguration

    javadoc

    JerseyAutoConfiguration

    javadoc

    JestAutoConfiguration

    javadoc

    JmsAutoConfiguration

    javadoc

    JmxAutoConfiguration

    javadoc

    JndiConnectionFactoryAutoConfiguration

    javadoc

    JndiDataSourceAutoConfiguration

    javadoc

    JooqAutoConfiguration

    javadoc

    JpaRepositoriesAutoConfiguration

    javadoc

    JsonbAutoConfiguration

    javadoc

    JtaAutoConfiguration

    javadoc

    KafkaAutoConfiguration

    javadoc

    LdapAutoConfiguration

    javadoc

    LdapDataAutoConfiguration

    javadoc

    LdapRepositoriesAutoConfiguration

    javadoc

    LiquibaseAutoConfiguration

    javadoc

    MailSenderAutoConfiguration

    javadoc

    MailSenderValidatorAutoConfiguration

    javadoc

    MessageSourceAutoConfiguration

    javadoc

    MongoAutoConfiguration

    javadoc

    MongoDataAutoConfiguration

    javadoc

    MongoReactiveAutoConfiguration

    javadoc

    MongoReactiveDataAutoConfiguration

    javadoc

    MongoReactiveRepositoriesAutoConfiguration

    javadoc

    MongoRepositoriesAutoConfiguration

    javadoc

    MultipartAutoConfiguration

    javadoc

    MustacheAutoConfiguration

    javadoc

    Neo4jDataAutoConfiguration

    javadoc

    Neo4jRepositoriesAutoConfiguration

    javadoc

    OAuth2ClientAutoConfiguration

    javadoc

    PersistenceExceptionTranslationAutoConfiguration

    javadoc

    ProjectInfoAutoConfiguration

    javadoc

    PropertyPlaceholderAutoConfiguration

    javadoc

    QuartzAutoConfiguration

    javadoc

    RabbitAutoConfiguration

    javadoc

    ReactiveSecurityAutoConfiguration

    javadoc

    ReactiveWebServerAutoConfiguration

    javadoc

    ReactorCoreAutoConfiguration

    javadoc

    RedisAutoConfiguration

    javadoc

    RedisReactiveAutoConfiguration

    javadoc

    RedisRepositoriesAutoConfiguration

    javadoc

    RepositoryRestMvcAutoConfiguration

    javadoc

    RestTemplateAutoConfiguration

    javadoc

    SecurityAutoConfiguration

    javadoc

    SecurityFilterAutoConfiguration

    javadoc

    SendGridAutoConfiguration

    javadoc

    ServletWebServerFactoryAutoConfiguration

    javadoc

    SessionAutoConfiguration

    javadoc

    SolrAutoConfiguration

    javadoc

    SolrRepositoriesAutoConfiguration

    javadoc

    SpringApplicationAdminJmxAutoConfiguration

    javadoc

    SpringDataWebAutoConfiguration

    javadoc

    ThymeleafAutoConfiguration

    javadoc

    TransactionAutoConfiguration

    javadoc

    ValidationAutoConfiguration

    javadoc

    WebClientAutoConfiguration

    javadoc

    WebFluxAutoConfiguration

    javadoc

    WebMvcAutoConfiguration

    javadoc

    WebServicesAutoConfiguration

    javadoc

    WebSocketMessagingAutoConfiguration

    javadoc

    WebSocketReactiveAutoConfiguration

    javadoc

    WebSocketServletAutoConfiguration

    javadoc

    XADataSourceAutoConfiguration

    javadoc

    The following auto-configuration classes are from the spring-boot-actuator-autoconfigure module:

    Configuration Class Links

    AuditAutoConfiguration

    javadoc

    AuditEventsEndpointAutoConfiguration

    javadoc

    BeansEndpointAutoConfiguration

    javadoc

    CassandraHealthIndicatorAutoConfiguration

    javadoc

    CloudFoundryActuatorAutoConfiguration

    javadoc

    CloudFoundryHealthWebEndpointManagementContextConfiguration

    javadoc

    ConditionsReportEndpointAutoConfiguration

    javadoc

    ConfigurationPropertiesReportEndpointAutoConfiguration

    javadoc

    CouchbaseHealthIndicatorAutoConfiguration

    javadoc

    DataSourceHealthIndicatorAutoConfiguration

    javadoc

    DiskSpaceHealthIndicatorAutoConfiguration

    javadoc

    ElasticsearchHealthIndicatorAutoConfiguration

    javadoc

    EndpointAutoConfiguration

    javadoc

    EnvironmentEndpointAutoConfiguration

    javadoc

    FlywayEndpointAutoConfiguration

    javadoc

    HealthEndpointAutoConfiguration

    javadoc

    HealthIndicatorAutoConfiguration

    javadoc

    HeapDumpWebEndpointAutoConfiguration

    javadoc

    InfoContributorAutoConfiguration

    javadoc

    InfoEndpointAutoConfiguration

    javadoc

    JmsHealthIndicatorAutoConfiguration

    javadoc

    JmxEndpointAutoConfiguration

    javadoc

    LdapHealthIndicatorAutoConfiguration

    javadoc

    LiquibaseEndpointAutoConfiguration

    javadoc

    LogFileWebEndpointAutoConfiguration

    javadoc

    LoggersEndpointAutoConfiguration

    javadoc

    MailHealthIndicatorAutoConfiguration

    javadoc

    ManagementContextAutoConfiguration

    javadoc

    MetricsAutoConfiguration

    javadoc

    MongoHealthIndicatorAutoConfiguration

    javadoc

    Neo4jHealthIndicatorAutoConfiguration

    javadoc

    RabbitHealthIndicatorAutoConfiguration

    javadoc

    ReactiveCloudFoundryActuatorAutoConfiguration

    javadoc

    ReactiveManagementContextAutoConfiguration

    javadoc

    RedisHealthIndicatorAutoConfiguration

    javadoc

    RequestMappingEndpointAutoConfiguration

    javadoc

    ScheduledTasksEndpointAutoConfiguration

    javadoc

    ServletManagementContextAutoConfiguration

    javadoc

    SessionsEndpointAutoConfiguration

    javadoc

    ShutdownEndpointAutoConfiguration

    javadoc

    SolrHealthIndicatorAutoConfiguration

    javadoc

    ThreadDumpEndpointAutoConfiguration

    javadoc

    TraceEndpointAutoConfiguration

    javadoc

    TraceRepositoryAutoConfiguration

    javadoc

    TraceWebFilterAutoConfiguration

    javadoc

    WebEndpointAutoConfiguration

    javadoc

    The following table lists the various @…Test annotations that can be used to test slices of your application and the auto-configuration that they import by default:

    Test slice Imported auto-configuration

    @DataJpaTest

    org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManagerAutoConfiguration

    @DataLdapTest

    org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration

    @DataMongoTest

    org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration

    @DataNeo4jTest

    org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration

    @DataRedisTest

    org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration

    @JdbcTest

    org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration

    @JooqTest

    org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration

    @JsonTest

    org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration org.springframework.boot.test.autoconfigure.json.JsonTestersAutoConfiguration

    @RestClientTest

    org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerAutoConfiguration org.springframework.boot.test.autoconfigure.web.client.WebClientRestTemplateAutoConfiguration

    @WebFluxTest

    org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientAutoConfiguration

    @WebMvcTest

    org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration org.springframework.boot.test.autoconfigure.web.servlet.MockMvcSecurityAutoConfiguration org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebClientAutoConfiguration org.springframework.boot.test.autoconfigure.web.servlet.MockMvcWebDriverAutoConfiguration

    Appendix E. The Executable Jar Format

    The spring-boot-loader modules lets Spring Boot support executable jar and war files. If you use the Maven plugin or the Gradle plugin, executable jars are automatically generated, and you generally do not need to know the details of how they work.

    If you need to create executable jars from a different build system or if you are just curious about the underlying technology, this section provides some background.

    Java does not provide any standard way to load nested jar files (that is, jar files that are themselves contained within a jar). This can be problematic if you need to distribute a self-contained application that can be run from the command line without unpacking.

    To solve this problem, many developers use “shaded” jars. A shaded jar packages all classes, from all jars, into a single “uber jar”. The problem with shaded jars is that it becomes hard to see which libraries are actually 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 and lets you actually nest jars directly.

    The core class used to support loading nested jars is org.springframework.boot.loader.jar.JarFile . It lets you load jar content from a standard jar file or from nested child jar data. When first loaded, the location of each JarEntry is mapped to a physical file offset of the outer jar, as shown in the following example:

    myapp.jar
    +-------------------+-------------------------+
    | /BOOT-INF/classes | /BOOT-INF/lib/mylib.jar |
    |+-----------------+||+-----------+----------+|
    ||     A.class      |||  B.class  |  C.class ||
    |+-----------------+||+-----------+----------+|
    +-------------------+-------------------------+
     ^                    ^           ^
     0063                 3452        3980

    The preceding example shows how A.class can be found in /BOOT-INF/classes in myapp.jar at position 0063 . B.class from the nested jar can actually be found in myapp.jar at position 3452 , and C.class is at position 3980 .

    Armed with this information, we can load specific nested entries by seeking to the appropriate part of the outer jar. We do not need to unpack the archive, and we do not need to read all entry data into memory.

    The org.springframework.boot.loader.Launcher class is a special bootstrap class that is used as an executable jar’s main entry point. It is the actual Main-Class in your jar file, and it is used to setup an appropriate URLClassLoader and ultimately call your main() method.

    There are three launcher subclasses ( JarLauncher , WarLauncher , and PropertiesLauncher ). Their purpose is to load resources ( .class files and so on.) from nested jar files or war files in directories (as opposed to those explicitly on the classpath). In the case of JarLauncher and WarLauncher , the nested paths are fixed. JarLauncher looks in BOOT-INF/lib/ , and WarLauncher looks in WEB-INF/lib/ and WEB-INF/lib-provided/ . You can add extra jars in those locations if you want more. The PropertiesLauncher looks in BOOT-INF/lib/ in your application archive by default, but you can add additional locations by setting an environment variable called LOADER_PATH or loader.path in loader.properties (which is a comma-separated list of directories, archives, or directories within archives).

    PropertiesLauncher has a few special features that can be enabled with external properties (System properties, environment variables, manifest entries, or loader.properties ). The following table describes these properties:

    Key Purpose

    loader.path

    Comma-separated Classpath, such as lib,${HOME}/app/lib . Earlier entries take precedence, like a regular -classpath on the javac command line.

    loader.home

    Used to resolve relative paths in loader.path . For example, given loader.path=lib , then ${loader.home}/lib is a classpath location (along with all jar files in that directory). This property is also used to locate a loader.properties file, as in the following example /opt/app It defaults to ${user.dir} .

    loader.args

    Default arguments for the main method (space separated).

    loader.main

    Name of main class to launch (for example, com.app.Application ).

    loader.config.name

    Name of properties file (for example, launcher ) It defaults to loader .

    loader.config.location

    Path to properties file (for example, classpath:loader.properties ). It defaults to loader.properties .

    loader.system

    Boolean flag to indicate that all properties should be added to System properties It defaults to false .

    When specified as environment variables or manifest entries, the following names should be used:

    Key Manifest entry Environment variable

    loader.path

    Loader-Path

    LOADER_PATH

    loader.home

    Loader-Home

    LOADER_HOME

    loader.args

    Loader-Args

    LOADER_ARGS

    loader.main

    Start-Class

    LOADER_MAIN

    loader.config.location

    Loader-Config-Location

    LOADER_CONFIG_LOCATION

    loader.system

    Loader-System

    LOADER_SYSTEM

    [Tip] Tip

    Build plugins automatically move the Main-Class attribute to Start-Class when the fat jar is built. If you use that, specify the name of the class to launch by using the Main-Class attribute and leaving out Start-Class .

    The following rules apply to working with PropertiesLauncher :