Browse Source

Split up BackgroundPreinitializer

Closes gh-44065
pull/46230/head
Phillip Webb 10 months ago committed by Andy Wilkinson
parent
commit
2077e4f96e
  1. 216
      spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/BackgroundPreinitializer.java
  2. 35
      spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/BackgroundPreinitializer.java
  3. 133
      spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/BackgroundPreinitializingApplicationListener.java
  4. 33
      spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/CharsetsBackgroundPreinitializer.java
  5. 34
      spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/ConversionServiceBackgroundPreinitializer.java
  6. 34
      spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/JacksonBackgroundPreinitializer.java
  7. 35
      spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/JakartaValidationBackgroundPreinitializer.java
  8. 35
      spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/MessageConverterBackgroundPreinitializer.java
  9. 35
      spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/TomcatBackgroundPreinitializer.java
  10. 33
      spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/ZoneIdBackgroundPreinitializer.java
  11. 20
      spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/package-info.java
  12. 12
      spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories

216
spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/BackgroundPreinitializer.java

@ -1,216 +0,0 @@ @@ -1,216 +0,0 @@
/*
* Copyright 2012-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure;
import java.nio.charset.StandardCharsets;
import java.time.ZoneId;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
import jakarta.validation.Configuration;
import jakarta.validation.Validation;
import org.apache.catalina.authenticator.NonLoginAuthenticator;
import org.apache.tomcat.util.http.Rfc6265CookieProcessor;
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.boot.context.event.ApplicationFailedEvent;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.boot.context.event.SpringApplicationEvent;
import org.springframework.boot.context.logging.LoggingApplicationListener;
import org.springframework.context.ApplicationListener;
import org.springframework.core.NativeDetector;
import org.springframework.core.Ordered;
import org.springframework.format.support.DefaultFormattingConversionService;
import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter;
/**
* {@link ApplicationListener} to trigger early initialization in a background thread of
* time-consuming tasks.
* <p>
* Set the {@link #IGNORE_BACKGROUNDPREINITIALIZER_PROPERTY_NAME} system property to
* {@code true} to disable this mechanism and let such initialization happen in the
* foreground.
*
* @author Phillip Webb
* @author Andy Wilkinson
* @author Artsiom Yudovin
* @author Sebastien Deleuze
* @since 1.3.0
*/
public class BackgroundPreinitializer implements ApplicationListener<SpringApplicationEvent>, Ordered {
/**
* System property that instructs Spring Boot how to run pre initialization. When the
* property is set to {@code true}, no pre-initialization happens and each item is
* initialized in the foreground as it needs to. When the property is {@code false}
* (default), pre initialization runs in a separate thread in the background.
* @since 2.1.0
*/
public static final String IGNORE_BACKGROUNDPREINITIALIZER_PROPERTY_NAME = "spring.backgroundpreinitializer.ignore";
private static final AtomicBoolean preinitializationStarted = new AtomicBoolean();
private static final CountDownLatch preinitializationComplete = new CountDownLatch(1);
private static final boolean ENABLED = !Boolean.getBoolean(IGNORE_BACKGROUNDPREINITIALIZER_PROPERTY_NAME)
&& Runtime.getRuntime().availableProcessors() > 1;
@Override
public int getOrder() {
return LoggingApplicationListener.DEFAULT_ORDER + 1;
}
@Override
public void onApplicationEvent(SpringApplicationEvent event) {
if (!ENABLED || NativeDetector.inNativeImage()) {
return;
}
if (event instanceof ApplicationEnvironmentPreparedEvent
&& preinitializationStarted.compareAndSet(false, true)) {
performPreinitialization();
}
if ((event instanceof ApplicationReadyEvent || event instanceof ApplicationFailedEvent)
&& preinitializationStarted.get()) {
try {
preinitializationComplete.await();
}
catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
private void performPreinitialization() {
try {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
runSafely(new ConversionServiceInitializer());
runSafely(new ValidationInitializer());
if (!runSafely(new MessageConverterInitializer())) {
// If the MessageConverterInitializer fails to run, we still might
// be able to
// initialize Jackson
runSafely(new JacksonInitializer());
}
runSafely(new CharsetInitializer());
runSafely(new TomcatInitializer());
runSafely(new JdkInitializer());
preinitializationComplete.countDown();
}
boolean runSafely(Runnable runnable) {
try {
runnable.run();
return true;
}
catch (Throwable ex) {
return false;
}
}
}, "background-preinit");
thread.start();
}
catch (Exception ex) {
// This will fail on GAE where creating threads is prohibited. We can safely
// continue but startup will be slightly slower as the initialization will now
// happen on the main thread.
preinitializationComplete.countDown();
}
}
/**
* Early initializer for Spring MessageConverters.
*/
private static final class MessageConverterInitializer implements Runnable {
@Override
public void run() {
new AllEncompassingFormHttpMessageConverter();
}
}
/**
* Early initializer for jakarta.validation.
*/
private static final class ValidationInitializer implements Runnable {
@Override
public void run() {
Configuration<?> configuration = Validation.byDefaultProvider().configure();
configuration.buildValidatorFactory().getValidator();
}
}
/**
* Early initializer for Jackson.
*/
@SuppressWarnings({ "removal", "deprecation" })
private static final class JacksonInitializer implements Runnable {
@Override
public void run() {
org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.json().build();
}
}
/**
* Early initializer for Spring's ConversionService.
*/
private static final class ConversionServiceInitializer implements Runnable {
@Override
public void run() {
new DefaultFormattingConversionService();
}
}
private static final class CharsetInitializer implements Runnable {
@Override
public void run() {
StandardCharsets.UTF_8.name();
}
}
private static final class TomcatInitializer implements Runnable {
@Override
public void run() {
new Rfc6265CookieProcessor();
new NonLoginAuthenticator();
}
}
private static final class JdkInitializer implements Runnable {
@Override
public void run() {
ZoneId.systemDefault();
}
}
}

35
spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/BackgroundPreinitializer.java

@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
/*
* Copyright 2012-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.preinitialize;
/**
* Interface used to preinitialize in the background code that may otherwise cause a delay
* when first called. Implementations should be registered in {@code spring.factories}.
*
* @author Phillip Webb
* @since 4.0.0
*/
@FunctionalInterface
public interface BackgroundPreinitializer {
/**
* Perform any require preinitialization.
* @throws Exception on any initialization error
*/
void preinitialize() throws Exception;
}

133
spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/BackgroundPreinitializingApplicationListener.java

@ -0,0 +1,133 @@ @@ -0,0 +1,133 @@
/*
* Copyright 2012-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.preinitialize;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.boot.context.event.ApplicationFailedEvent;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.boot.context.event.SpringApplicationEvent;
import org.springframework.boot.context.logging.LoggingApplicationListener;
import org.springframework.context.ApplicationListener;
import org.springframework.core.NativeDetector;
import org.springframework.core.Ordered;
import org.springframework.core.io.support.SpringFactoriesLoader;
/**
* {@link ApplicationListener} to trigger early initialization in a background thread of
* time-consuming tasks.
* <p>
* Set the {@link #IGNORE_BACKGROUNDPREINITIALIZER_PROPERTY_NAME} system property to
* {@code true} to disable this mechanism.
*
* @author Phillip Webb
* @author Andy Wilkinson
* @author Artsiom Yudovin
* @author Sebastien Deleuze
* @see BackgroundPreinitializer
*/
class BackgroundPreinitializingApplicationListener implements ApplicationListener<SpringApplicationEvent>, Ordered {
/**
* System property that instructs Spring Boot how to run pre initialization. When the
* property is set to {@code true}, no pre-initialization happens and each item is
* initialized in the foreground as it needs to. When the property is {@code false}
* (default), pre initialization runs in a separate thread in the background.
*/
public static final String IGNORE_BACKGROUNDPREINITIALIZER_PROPERTY_NAME = "spring.backgroundpreinitializer.ignore";
private static final AtomicBoolean started = new AtomicBoolean();
private static final CountDownLatch complete = new CountDownLatch(1);
private final SpringFactoriesLoader factoriesLoader;
private final boolean enabled;
BackgroundPreinitializingApplicationListener() {
this(SpringFactoriesLoader.forDefaultResourceLocation());
}
BackgroundPreinitializingApplicationListener(SpringFactoriesLoader factoriesLoader) {
this.factoriesLoader = factoriesLoader;
this.enabled = !NativeDetector.inNativeImage()
&& !Boolean.getBoolean(IGNORE_BACKGROUNDPREINITIALIZER_PROPERTY_NAME)
&& Runtime.getRuntime().availableProcessors() > 1;
}
@Override
public int getOrder() {
return LoggingApplicationListener.DEFAULT_ORDER + 1;
}
@Override
public void onApplicationEvent(SpringApplicationEvent event) {
if (!this.enabled) {
return;
}
if (event instanceof ApplicationEnvironmentPreparedEvent && started.compareAndSet(false, true)) {
preinitialize();
}
if ((event instanceof ApplicationReadyEvent || event instanceof ApplicationFailedEvent) && started.get()) {
try {
complete.await();
}
catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
private void preinitialize() {
Runner runner = new Runner(this.factoriesLoader.load(BackgroundPreinitializer.class));
try {
Thread thread = new Thread(runner, "background-preinit");
thread.start();
}
catch (Exception ex) {
// This will fail on Google App Engine where creating threads is
// prohibited. We can safely continue but startup will be slightly slower
// as the initialization will now happen on the main thread.
complete.countDown();
}
}
/**
* Runner thread to call the {@link BackgroundPreinitializer} instances.
*
* @param preinitializers the preinitializers
*/
record Runner(List<BackgroundPreinitializer> preinitializers) implements Runnable {
@Override
public void run() {
for (BackgroundPreinitializer preinitializer : this.preinitializers) {
try {
preinitializer.preinitialize();
}
catch (Throwable ex) {
}
}
complete.countDown();
}
}
}

33
spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/CharsetsBackgroundPreinitializer.java

@ -0,0 +1,33 @@ @@ -0,0 +1,33 @@
/*
* Copyright 2012-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.preinitialize;
import java.nio.charset.StandardCharsets;
/**
* {@link BackgroundPreinitializer} for commonly used charsets.
*
* @author Phillip Webb
*/
final class CharsetsBackgroundPreinitializer implements BackgroundPreinitializer {
@Override
public void preinitialize() throws Exception {
StandardCharsets.UTF_8.name();
}
}

34
spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/ConversionServiceBackgroundPreinitializer.java

@ -0,0 +1,34 @@ @@ -0,0 +1,34 @@
/*
* Copyright 2012-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.preinitialize;
import org.springframework.core.convert.ConversionService;
import org.springframework.format.support.DefaultFormattingConversionService;
/**
* {@link BackgroundPreinitializer} for Spring's {@link ConversionService}.
*
* @author Phillip Webb
*/
final class ConversionServiceBackgroundPreinitializer implements BackgroundPreinitializer {
@Override
public void preinitialize() throws Exception {
new DefaultFormattingConversionService();
}
}

34
spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/JacksonBackgroundPreinitializer.java

@ -0,0 +1,34 @@ @@ -0,0 +1,34 @@
/*
* Copyright 2012-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.preinitialize;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
/**
* {@link JacksonBackgroundPreinitializer} for Jackson.
*
* @author Phillip Webb
*/
@SuppressWarnings("removal")
final class JacksonBackgroundPreinitializer implements BackgroundPreinitializer {
@Override
public void preinitialize() throws Exception {
Jackson2ObjectMapperBuilder.json().build();
}
}

35
spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/JakartaValidationBackgroundPreinitializer.java

@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
/*
* Copyright 2012-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.preinitialize;
import jakarta.validation.Configuration;
import jakarta.validation.Validation;
/**
* {@link BackgroundPreinitializer} for jakarta.validation.
*
* @author Phillip Webb
*/
final class JakartaValidationBackgroundPreinitializer implements BackgroundPreinitializer {
@Override
public void preinitialize() throws Exception {
Configuration<?> configuration = Validation.byDefaultProvider().configure();
configuration.buildValidatorFactory().getValidator();
}
}

35
spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/MessageConverterBackgroundPreinitializer.java

@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
/*
* Copyright 2012-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.preinitialize;
import org.apache.activemq.artemis.spi.core.protocol.MessageConverter;
import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter;
/**
* {@link BackgroundPreinitializer} Spring's {@link MessageConverter} implementations.
*
* @author Phillip Webb
*/
final class MessageConverterBackgroundPreinitializer implements BackgroundPreinitializer {
@Override
public void preinitialize() throws Exception {
new AllEncompassingFormHttpMessageConverter();
}
}

35
spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/TomcatBackgroundPreinitializer.java

@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
/*
* Copyright 2012-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.preinitialize;
import org.apache.catalina.authenticator.NonLoginAuthenticator;
import org.apache.tomcat.util.http.Rfc6265CookieProcessor;
/**
* {@link BackgroundPreinitializer} for Tomcat.
*
* @author Phillip Webb
*/
final class TomcatBackgroundPreinitializer implements BackgroundPreinitializer {
@Override
public void preinitialize() throws Exception {
new Rfc6265CookieProcessor();
new NonLoginAuthenticator();
}
}

33
spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/ZoneIdBackgroundPreinitializer.java

@ -0,0 +1,33 @@ @@ -0,0 +1,33 @@
/*
* Copyright 2012-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.boot.autoconfigure.preinitialize;
import java.time.ZoneId;
/**
* {@link BackgroundPreinitializer} for {@link ZoneId}.
*
* @author Phillip Webb
*/
final class ZoneIdBackgroundPreinitializer implements BackgroundPreinitializer {
@Override
public void preinitialize() throws Exception {
ZoneId.systemDefault();
}
}

20
spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/preinitialize/package-info.java

@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
/*
* Copyright 2012-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Capabilities to preinitialize code in the background to improve startup performance.
*/
package org.springframework.boot.autoconfigure.preinitialize;

12
spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories

@ -5,7 +5,7 @@ org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingL @@ -5,7 +5,7 @@ org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingL
# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer
org.springframework.boot.autoconfigure.preinitialize.BackgroundPreinitializingApplicationListener
# Environment Post Processors
org.springframework.boot.env.EnvironmentPostProcessor=\
@ -21,6 +21,16 @@ org.springframework.boot.autoconfigure.condition.OnBeanCondition,\ @@ -21,6 +21,16 @@ org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
org.springframework.boot.autoconfigure.condition.OnClassCondition,\
org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition
# Background Preinitializers
org.springframework.boot.autoconfigure.preinitialize.BackgroundPreinitializer=\
org.springframework.boot.autoconfigure.preinitialize.CharsetsBackgroundPreinitializer,\
org.springframework.boot.autoconfigure.preinitialize.ConversionServiceBackgroundPreinitializer,\
org.springframework.boot.autoconfigure.preinitialize.JacksonBackgroundPreinitializer,\
org.springframework.boot.autoconfigure.preinitialize.JakartaValidationBackgroundPreinitializer,\
org.springframework.boot.autoconfigure.preinitialize.MessageConverterBackgroundPreinitializer,\
org.springframework.boot.autoconfigure.preinitialize.TomcatBackgroundPreinitializer,\
org.springframework.boot.autoconfigure.preinitialize.ZoneIdBackgroundPreinitializer
# Failure Analyzers
org.springframework.boot.diagnostics.FailureAnalyzer=\
org.springframework.boot.autoconfigure.data.redis.RedisUrlSyntaxFailureAnalyzer,\

Loading…
Cancel
Save