12 changed files with 438 additions and 217 deletions
@ -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(); |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
||||
@ -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; |
||||
|
||||
} |
||||
@ -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(); |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
||||
@ -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(); |
||||
} |
||||
|
||||
} |
||||
@ -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(); |
||||
} |
||||
|
||||
} |
||||
@ -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(); |
||||
} |
||||
|
||||
} |
||||
@ -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(); |
||||
} |
||||
|
||||
} |
||||
@ -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(); |
||||
} |
||||
|
||||
} |
||||
@ -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(); |
||||
} |
||||
|
||||
} |
||||
@ -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(); |
||||
} |
||||
|
||||
} |
||||
@ -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; |
||||
Loading…
Reference in new issue