Use new boot ConfigData framework (#703)
Bootstrap is now opt-in using `spring.config.use-legacy-processing`. Otherwise, bootstrap is left as is. If bootstrap is disabled, the `ContextRefresher` uses new `ConfigData` framework from boot. See #608 for original motivation.
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright 2013-2020 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.context.config;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import org.springframework.core.env.ConfigurableEnvironment;
|
||||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.core.io.ResourceLoader;
|
||||
|
||||
public class ConfigDataAccessor {
|
||||
|
||||
private final ConfigDataEnvironment configDataEnvironment;
|
||||
|
||||
/**
|
||||
* Create a new {@link ConfigDataEnvironment} instance.
|
||||
* @param environment the Spring {@link Environment}.
|
||||
* @param resourceLoader {@link ResourceLoader} to load resource locations
|
||||
* @param additionalProfiles any additional profiles to activate
|
||||
*/
|
||||
public ConfigDataAccessor(ConfigurableEnvironment environment,
|
||||
ResourceLoader resourceLoader, String[] additionalProfiles) {
|
||||
configDataEnvironment = new ConfigDataEnvironment(Supplier::get, environment,
|
||||
resourceLoader, Arrays.asList(additionalProfiles));
|
||||
}
|
||||
|
||||
public void applyToEnvironment() {
|
||||
configDataEnvironment.processAndApply();
|
||||
}
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -38,10 +38,14 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
|
||||
import org.springframework.boot.context.properties.bind.Bindable;
|
||||
import org.springframework.boot.context.properties.bind.Binder;
|
||||
import org.springframework.cloud.context.refresh.ConfigDataContextRefresher;
|
||||
import org.springframework.cloud.context.refresh.ContextRefresher;
|
||||
import org.springframework.cloud.context.refresh.LegacyContextRefresher;
|
||||
import org.springframework.cloud.context.scope.refresh.RefreshScope;
|
||||
import org.springframework.cloud.endpoint.event.RefreshEventListener;
|
||||
import org.springframework.cloud.logging.LoggingRebinder;
|
||||
import org.springframework.cloud.util.ConditionalOnBootstrapDisabled;
|
||||
import org.springframework.cloud.util.ConditionalOnBootstrapEnabled;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.context.EnvironmentAware;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
@@ -96,9 +100,18 @@ public class RefreshAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
public ContextRefresher contextRefresher(ConfigurableApplicationContext context,
|
||||
RefreshScope scope) {
|
||||
return new ContextRefresher(context, scope);
|
||||
@ConditionalOnBootstrapEnabled
|
||||
public LegacyContextRefresher legacyContextRefresher(
|
||||
ConfigurableApplicationContext context, RefreshScope scope) {
|
||||
return new LegacyContextRefresher(context, scope);
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
@ConditionalOnBootstrapDisabled
|
||||
public ConfigDataContextRefresher configDataContextRefresher(
|
||||
ConfigurableApplicationContext context, RefreshScope scope) {
|
||||
return new ConfigDataContextRefresher(context, scope);
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -27,7 +27,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
|
||||
import org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration;
|
||||
import org.springframework.cloud.context.properties.ConfigurationPropertiesRebinder;
|
||||
import org.springframework.cloud.context.refresh.ContextRefresher;
|
||||
import org.springframework.cloud.context.restart.RestartEndpoint;
|
||||
@@ -63,7 +62,6 @@ public class RefreshEndpointAutoConfiguration {
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnBean(PropertySourceBootstrapConfiguration.class)
|
||||
protected static class RefreshEndpointConfiguration {
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -60,6 +60,9 @@ import org.springframework.core.env.SystemEnvironmentPropertySource;
|
||||
import org.springframework.util.ReflectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import static org.springframework.cloud.util.PropertyUtils.bootstrapEnabled;
|
||||
import static org.springframework.cloud.util.PropertyUtils.useLegacyProcessing;
|
||||
|
||||
/**
|
||||
* A listener that prepares a SpringApplication (e.g. populating its Environment) by
|
||||
* delegating to {@link ApplicationContextInitializer} beans in a separate bootstrap
|
||||
@@ -94,8 +97,7 @@ public class BootstrapApplicationListener
|
||||
@Override
|
||||
public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
|
||||
ConfigurableEnvironment environment = event.getEnvironment();
|
||||
if (!environment.getProperty("spring.cloud.bootstrap.enabled", Boolean.class,
|
||||
true)) {
|
||||
if (!bootstrapEnabled(environment) && !useLegacyProcessing(environment)) {
|
||||
return;
|
||||
}
|
||||
// don't listen to events in a bootstrap context
|
||||
|
||||
@@ -47,6 +47,7 @@ public class LoggingSystemShutdownListener
|
||||
}
|
||||
|
||||
private void shutdownLogging() {
|
||||
// TODO: only enable if bootstrap and legacy
|
||||
LoggingSystem loggingSystem = LoggingSystem
|
||||
.get(ClassUtils.getDefaultClassLoader());
|
||||
loggingSystem.cleanUp();
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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.cloud.context.refresh;
|
||||
|
||||
import org.springframework.boot.context.config.ConfigDataAccessor;
|
||||
import org.springframework.cloud.context.scope.refresh.RefreshScope;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.core.env.MutablePropertySources;
|
||||
import org.springframework.core.env.PropertySource;
|
||||
import org.springframework.core.env.StandardEnvironment;
|
||||
import org.springframework.core.io.DefaultResourceLoader;
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
* @author Venil Noronha
|
||||
*/
|
||||
public class ConfigDataContextRefresher extends ContextRefresher {
|
||||
|
||||
public ConfigDataContextRefresher(ConfigurableApplicationContext context,
|
||||
RefreshScope scope) {
|
||||
super(context, scope);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateEnvironment() {
|
||||
if (logger.isTraceEnabled()) {
|
||||
logger.trace("Re-processing environment to add config data");
|
||||
}
|
||||
StandardEnvironment environment = copyEnvironment(getContext().getEnvironment());
|
||||
String[] activeProfiles = getContext().getEnvironment().getActiveProfiles();
|
||||
DefaultResourceLoader resourceLoader = new DefaultResourceLoader();
|
||||
ConfigDataAccessor configDataAccessor = new ConfigDataAccessor(environment,
|
||||
resourceLoader, activeProfiles);
|
||||
|
||||
configDataAccessor.applyToEnvironment();
|
||||
|
||||
if (environment.getPropertySources().contains(REFRESH_ARGS_PROPERTY_SOURCE)) {
|
||||
environment.getPropertySources().remove(REFRESH_ARGS_PROPERTY_SOURCE);
|
||||
}
|
||||
MutablePropertySources target = getContext().getEnvironment()
|
||||
.getPropertySources();
|
||||
String targetName = null;
|
||||
for (PropertySource<?> source : environment.getPropertySources()) {
|
||||
String name = source.getName();
|
||||
if (target.contains(name)) {
|
||||
targetName = name;
|
||||
}
|
||||
if (!this.standardSources.contains(name)) {
|
||||
if (target.contains(name)) {
|
||||
target.replace(name, source);
|
||||
}
|
||||
else {
|
||||
if (targetName != null) {
|
||||
target.addAfter(targetName, source);
|
||||
// update targetName to preserve ordering
|
||||
targetName = name;
|
||||
}
|
||||
else {
|
||||
// targetName was null so we are at the start of the list
|
||||
target.addFirst(source);
|
||||
targetName = name;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -24,11 +24,9 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.boot.Banner.Mode;
|
||||
import org.springframework.boot.WebApplicationType;
|
||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||
import org.springframework.boot.context.config.ConfigFileApplicationListener;
|
||||
import org.springframework.cloud.bootstrap.BootstrapApplicationListener;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import org.springframework.cloud.context.environment.EnvironmentChangeEvent;
|
||||
import org.springframework.cloud.context.scope.refresh.RefreshScope;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
@@ -47,16 +45,18 @@ import org.springframework.web.context.support.StandardServletEnvironment;
|
||||
* @author Dave Syer
|
||||
* @author Venil Noronha
|
||||
*/
|
||||
public class ContextRefresher {
|
||||
public abstract class ContextRefresher {
|
||||
|
||||
private static final String REFRESH_ARGS_PROPERTY_SOURCE = "refreshArgs";
|
||||
protected final Log logger = LogFactory.getLog(getClass());
|
||||
|
||||
private static final String[] DEFAULT_PROPERTY_SOURCES = new String[] {
|
||||
protected static final String REFRESH_ARGS_PROPERTY_SOURCE = "refreshArgs";
|
||||
|
||||
protected static final String[] DEFAULT_PROPERTY_SOURCES = new String[] {
|
||||
// order matters, if cli args aren't first, things get messy
|
||||
CommandLinePropertySource.COMMAND_LINE_PROPERTY_SOURCE_NAME,
|
||||
"defaultProperties" };
|
||||
|
||||
private Set<String> standardSources = new HashSet<>(
|
||||
protected Set<String> standardSources = new HashSet<>(
|
||||
Arrays.asList(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME,
|
||||
StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME,
|
||||
StandardServletEnvironment.JNDI_PROPERTY_SOURCE_NAME,
|
||||
@@ -68,7 +68,8 @@ public class ContextRefresher {
|
||||
|
||||
private RefreshScope scope;
|
||||
|
||||
public ContextRefresher(ConfigurableApplicationContext context, RefreshScope scope) {
|
||||
protected ContextRefresher(ConfigurableApplicationContext context,
|
||||
RefreshScope scope) {
|
||||
this.context = context;
|
||||
this.scope = scope;
|
||||
}
|
||||
@@ -90,80 +91,18 @@ public class ContextRefresher {
|
||||
public synchronized Set<String> refreshEnvironment() {
|
||||
Map<String, Object> before = extract(
|
||||
this.context.getEnvironment().getPropertySources());
|
||||
addConfigFilesToEnvironment();
|
||||
updateEnvironment();
|
||||
Set<String> keys = changes(before,
|
||||
extract(this.context.getEnvironment().getPropertySources())).keySet();
|
||||
this.context.publishEvent(new EnvironmentChangeEvent(this.context, keys));
|
||||
return keys;
|
||||
}
|
||||
|
||||
/* For testing. */ ConfigurableApplicationContext addConfigFilesToEnvironment() {
|
||||
ConfigurableApplicationContext capture = null;
|
||||
try {
|
||||
StandardEnvironment environment = copyEnvironment(
|
||||
this.context.getEnvironment());
|
||||
SpringApplicationBuilder builder = new SpringApplicationBuilder(Empty.class)
|
||||
.bannerMode(Mode.OFF).web(WebApplicationType.NONE)
|
||||
.environment(environment);
|
||||
// Just the listeners that affect the environment (e.g. excluding logging
|
||||
// listener because it has side effects)
|
||||
builder.application()
|
||||
.setListeners(Arrays.asList(new BootstrapApplicationListener(),
|
||||
new ConfigFileApplicationListener()));
|
||||
capture = builder.run();
|
||||
if (environment.getPropertySources().contains(REFRESH_ARGS_PROPERTY_SOURCE)) {
|
||||
environment.getPropertySources().remove(REFRESH_ARGS_PROPERTY_SOURCE);
|
||||
}
|
||||
MutablePropertySources target = this.context.getEnvironment()
|
||||
.getPropertySources();
|
||||
String targetName = null;
|
||||
for (PropertySource<?> source : environment.getPropertySources()) {
|
||||
String name = source.getName();
|
||||
if (target.contains(name)) {
|
||||
targetName = name;
|
||||
}
|
||||
if (!this.standardSources.contains(name)) {
|
||||
if (target.contains(name)) {
|
||||
target.replace(name, source);
|
||||
}
|
||||
else {
|
||||
if (targetName != null) {
|
||||
target.addAfter(targetName, source);
|
||||
// update targetName to preserve ordering
|
||||
targetName = name;
|
||||
}
|
||||
else {
|
||||
// targetName was null so we are at the start of the list
|
||||
target.addFirst(source);
|
||||
targetName = name;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
finally {
|
||||
ConfigurableApplicationContext closeable = capture;
|
||||
while (closeable != null) {
|
||||
try {
|
||||
closeable.close();
|
||||
}
|
||||
catch (Exception e) {
|
||||
// Ignore;
|
||||
}
|
||||
if (closeable.getParent() instanceof ConfigurableApplicationContext) {
|
||||
closeable = (ConfigurableApplicationContext) closeable.getParent();
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return capture;
|
||||
}
|
||||
protected abstract void updateEnvironment();
|
||||
|
||||
// Don't use ConfigurableEnvironment.merge() in case there are clashes with property
|
||||
// source names
|
||||
private StandardEnvironment copyEnvironment(ConfigurableEnvironment input) {
|
||||
protected StandardEnvironment copyEnvironment(ConfigurableEnvironment input) {
|
||||
StandardEnvironment environment = new StandardEnvironment();
|
||||
MutablePropertySources capturedPropertySources = environment.getPropertySources();
|
||||
// Only copy the default property source(s) and the profiles over from the main
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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.cloud.context.refresh;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.springframework.boot.Banner;
|
||||
import org.springframework.boot.WebApplicationType;
|
||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||
import org.springframework.boot.context.config.ConfigFileApplicationListener;
|
||||
import org.springframework.cloud.bootstrap.BootstrapApplicationListener;
|
||||
import org.springframework.cloud.context.scope.refresh.RefreshScope;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.core.env.MutablePropertySources;
|
||||
import org.springframework.core.env.PropertySource;
|
||||
import org.springframework.core.env.StandardEnvironment;
|
||||
|
||||
import static org.springframework.cloud.util.PropertyUtils.BOOTSTRAP_ENABLED_PROPERTY;
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
* @author Venil Noronha
|
||||
*/
|
||||
public class LegacyContextRefresher extends ContextRefresher {
|
||||
|
||||
public LegacyContextRefresher(ConfigurableApplicationContext context,
|
||||
RefreshScope scope) {
|
||||
super(context, scope);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updateEnvironment() {
|
||||
addConfigFilesToEnvironment();
|
||||
}
|
||||
|
||||
/* For testing. */ ConfigurableApplicationContext addConfigFilesToEnvironment() {
|
||||
ConfigurableApplicationContext capture = null;
|
||||
try {
|
||||
StandardEnvironment environment = copyEnvironment(
|
||||
getContext().getEnvironment());
|
||||
SpringApplicationBuilder builder = new SpringApplicationBuilder(Empty.class)
|
||||
.properties(BOOTSTRAP_ENABLED_PROPERTY + "=true")
|
||||
.bannerMode(Banner.Mode.OFF).web(WebApplicationType.NONE)
|
||||
.environment(environment);
|
||||
// Just the listeners that affect the environment (e.g. excluding logging
|
||||
// listener because it has side effects)
|
||||
builder.application()
|
||||
.setListeners(Arrays.asList(new BootstrapApplicationListener(),
|
||||
new ConfigFileApplicationListener()));
|
||||
capture = builder.run();
|
||||
if (environment.getPropertySources().contains(REFRESH_ARGS_PROPERTY_SOURCE)) {
|
||||
environment.getPropertySources().remove(REFRESH_ARGS_PROPERTY_SOURCE);
|
||||
}
|
||||
MutablePropertySources target = getContext().getEnvironment()
|
||||
.getPropertySources();
|
||||
String targetName = null;
|
||||
for (PropertySource<?> source : environment.getPropertySources()) {
|
||||
String name = source.getName();
|
||||
if (target.contains(name)) {
|
||||
targetName = name;
|
||||
}
|
||||
if (!this.standardSources.contains(name)) {
|
||||
if (target.contains(name)) {
|
||||
target.replace(name, source);
|
||||
}
|
||||
else {
|
||||
if (targetName != null) {
|
||||
target.addAfter(targetName, source);
|
||||
// update targetName to preserve ordering
|
||||
targetName = name;
|
||||
}
|
||||
else {
|
||||
// targetName was null so we are at the start of the list
|
||||
target.addFirst(source);
|
||||
targetName = name;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
finally {
|
||||
ConfigurableApplicationContext closeable = capture;
|
||||
while (closeable != null) {
|
||||
try {
|
||||
closeable.close();
|
||||
}
|
||||
catch (Exception e) {
|
||||
// Ignore;
|
||||
}
|
||||
if (closeable.getParent() instanceof ConfigurableApplicationContext) {
|
||||
closeable = (ConfigurableApplicationContext) closeable.getParent();
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return capture;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright 2013-2020 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.cloud.util;
|
||||
|
||||
import java.lang.annotation.Documented;
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.boot.autoconfigure.condition.NoneNestedConditions;
|
||||
import org.springframework.context.annotation.Conditional;
|
||||
|
||||
import static org.springframework.cloud.util.PropertyUtils.BOOTSTRAP_ENABLED_PROPERTY;
|
||||
import static org.springframework.cloud.util.PropertyUtils.USE_LEGACY_PROCESSING_PROPERTY;
|
||||
|
||||
@Target({ ElementType.TYPE, ElementType.METHOD })
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
@Conditional(ConditionalOnBootstrapDisabled.OnBootstrapDisabledCondition.class)
|
||||
public @interface ConditionalOnBootstrapDisabled {
|
||||
|
||||
class OnBootstrapDisabledCondition extends NoneNestedConditions {
|
||||
|
||||
OnBootstrapDisabledCondition() {
|
||||
super(ConfigurationPhase.REGISTER_BEAN);
|
||||
}
|
||||
|
||||
@ConditionalOnProperty(name = USE_LEGACY_PROCESSING_PROPERTY)
|
||||
static class OnUseLegacyProcessingEnabled {
|
||||
|
||||
}
|
||||
|
||||
@ConditionalOnProperty(name = BOOTSTRAP_ENABLED_PROPERTY)
|
||||
static class OnBootstrapEnabled {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright 2013-2020 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.cloud.util;
|
||||
|
||||
import java.lang.annotation.Documented;
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.context.annotation.Conditional;
|
||||
|
||||
import static org.springframework.cloud.util.PropertyUtils.BOOTSTRAP_ENABLED_PROPERTY;
|
||||
import static org.springframework.cloud.util.PropertyUtils.USE_LEGACY_PROCESSING_PROPERTY;
|
||||
|
||||
@Target({ ElementType.TYPE, ElementType.METHOD })
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
@Conditional(ConditionalOnBootstrapEnabled.OnBootstrapEnabledCondition.class)
|
||||
public @interface ConditionalOnBootstrapEnabled {
|
||||
|
||||
class OnBootstrapEnabledCondition extends AnyNestedCondition {
|
||||
|
||||
OnBootstrapEnabledCondition() {
|
||||
super(ConfigurationPhase.REGISTER_BEAN);
|
||||
}
|
||||
|
||||
@ConditionalOnProperty(name = USE_LEGACY_PROCESSING_PROPERTY)
|
||||
static class OnUseLegacyProcessingEnabled {
|
||||
|
||||
}
|
||||
|
||||
@ConditionalOnProperty(name = BOOTSTRAP_ENABLED_PROPERTY)
|
||||
static class OnBootstrapEnabled {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright 2013-2020 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.cloud.util;
|
||||
|
||||
import org.springframework.core.env.Environment;
|
||||
|
||||
public abstract class PropertyUtils {
|
||||
|
||||
/**
|
||||
* Property name for checking if bootstrap is enabled.
|
||||
*/
|
||||
public static final String BOOTSTRAP_ENABLED_PROPERTY = "spring.cloud.bootstrap.enabled";
|
||||
|
||||
/**
|
||||
* Property name for spring boot legacy processing.
|
||||
*/
|
||||
public static final String USE_LEGACY_PROCESSING_PROPERTY = "spring.config.use-legacy-processing";
|
||||
|
||||
private PropertyUtils() {
|
||||
|
||||
}
|
||||
|
||||
public static boolean bootstrapEnabled(Environment environment) {
|
||||
return environment.getProperty(BOOTSTRAP_ENABLED_PROPERTY, Boolean.class, false);
|
||||
}
|
||||
|
||||
public static boolean useLegacyProcessing(Environment environment) {
|
||||
return environment.getProperty(USE_LEGACY_PROCESSING_PROPERTY, Boolean.class,
|
||||
false);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user