From 87bb8f1fa17f71f0bc21a7d9f5c972706fe5feb4 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Wed, 1 Aug 2018 16:19:44 -0400 Subject: [PATCH] Upgrades to build 2.1.0.BUILD-SNAPSHOT and boot 2.1.x Moves refresh scope proxy creation from BeanDefinitionRegistryPostProcessor to BeanPostProcessor fixes gh-400 --- docs/pom.xml | 4 +- pom.xml | 4 +- spring-cloud-commons-dependencies/pom.xml | 4 +- spring-cloud-commons/pom.xml | 2 +- .../CommonsClientAutoConfigurationTests.java | 3 +- ...EnableDiscoveryClientMissingImplTests.java | 3 +- ...actLoadBalancerAutoConfigurationTests.java | 3 +- ...yncLoadBalancerAutoConfigurationTests.java | 3 +- ...ancerRequestFactoryConfigurationTests.java | 3 +- ...iceRegistrationAutoConfigurationTests.java | 5 +- .../pom.xml | 2 +- .../RefreshScopeIntegrationTests.java | 1 + spring-cloud-context/pom.xml | 2 +- .../RefreshAutoConfiguration.java | 63 +++++++++++-------- .../RefreshAutoConfigurationTests.java | 2 +- .../refresh/ContextRefresherTests.java | 10 +-- spring-cloud-starter/pom.xml | 2 +- spring-cloud-test-support/pom.xml | 2 +- 18 files changed, 67 insertions(+), 51 deletions(-) diff --git a/docs/pom.xml b/docs/pom.xml index edfba75c..d1eb9961 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -8,7 +8,7 @@ org.springframework.cloud spring-cloud-commons-parent - 2.0.2.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT pom Spring Cloud Commons Docs @@ -16,7 +16,7 @@ spring-cloud-commons ${basedir}/.. - 1.1.x,1.2.x,1.3.x + 1.2.x,1.3.x,2.0.x diff --git a/pom.xml b/pom.xml index 5e39cc04..9dfbf2c7 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.springframework.cloud spring-cloud-commons-parent - 2.0.2.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT pom Spring Cloud Commons Parent Spring Cloud Commons Parent @@ -11,7 +11,7 @@ org.springframework.cloud spring-cloud-build - 2.0.3.RELEASE + 2.1.0.BUILD-SNAPSHOT diff --git a/spring-cloud-commons-dependencies/pom.xml b/spring-cloud-commons-dependencies/pom.xml index ea634b9d..c7e8642c 100644 --- a/spring-cloud-commons-dependencies/pom.xml +++ b/spring-cloud-commons-dependencies/pom.xml @@ -5,11 +5,11 @@ spring-cloud-dependencies-parent org.springframework.cloud - 2.0.3.RELEASE + 2.1.0.BUILD-SNAPSHOT spring-cloud-commons-dependencies - 2.0.2.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT pom spring-cloud-commons-dependencies Spring Cloud Commons Dependencies diff --git a/spring-cloud-commons/pom.xml b/spring-cloud-commons/pom.xml index a4c7a419..2a7cc349 100644 --- a/spring-cloud-commons/pom.xml +++ b/spring-cloud-commons/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-commons-parent - 2.0.2.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-commons diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/CommonsClientAutoConfigurationTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/CommonsClientAutoConfigurationTests.java index c11877f7..c390a3c2 100644 --- a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/CommonsClientAutoConfigurationTests.java +++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/CommonsClientAutoConfigurationTests.java @@ -2,6 +2,7 @@ package org.springframework.cloud.client; import org.junit.Test; import org.springframework.beans.BeansException; +import org.springframework.boot.WebApplicationType; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.client.actuator.FeaturesEndpoint; @@ -81,7 +82,7 @@ public class CommonsClientAutoConfigurationTests { } protected ConfigurableApplicationContext init(String... pairs) { - return new SpringApplicationBuilder().web(false).sources(Config.class) + return new SpringApplicationBuilder().web(WebApplicationType.NONE).sources(Config.class) .properties(pairs).run(); } diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientMissingImplTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientMissingImplTests.java index b1a0c461..7bfb1796 100644 --- a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientMissingImplTests.java +++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientMissingImplTests.java @@ -1,6 +1,7 @@ package org.springframework.cloud.client.discovery; import org.junit.Test; +import org.springframework.boot.WebApplicationType; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.context.ConfigurableApplicationContext; @@ -19,7 +20,7 @@ public class EnableDiscoveryClientMissingImplTests { @Test public void testContextFails() { try (ConfigurableApplicationContext context = new SpringApplicationBuilder() - .sources(App.class).web(false).run(new String[0]);) { + .sources(App.class).web(WebApplicationType.NONE).run(new String[0]);) { } catch (NestedRuntimeException e) { Throwable rootCause = e.getRootCause(); diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/AbstractLoadBalancerAutoConfigurationTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/AbstractLoadBalancerAutoConfigurationTests.java index dad62f0b..8df8ccc8 100644 --- a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/AbstractLoadBalancerAutoConfigurationTests.java +++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/AbstractLoadBalancerAutoConfigurationTests.java @@ -31,6 +31,7 @@ import java.util.Random; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.WebApplicationType; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.client.DefaultServiceInstance; import org.springframework.cloud.client.ServiceInstance; @@ -81,7 +82,7 @@ public abstract class AbstractLoadBalancerAutoConfigurationTests { } protected ConfigurableApplicationContext init(Class config) { - return new SpringApplicationBuilder().web(false) + return new SpringApplicationBuilder().web(WebApplicationType.NONE) .properties("spring.aop.proxyTargetClass=true") .sources(config, LoadBalancerAutoConfiguration.class).run(); } diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/AsyncLoadBalancerAutoConfigurationTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/AsyncLoadBalancerAutoConfigurationTests.java index 84d0903e..41d4f5f9 100644 --- a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/AsyncLoadBalancerAutoConfigurationTests.java +++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/AsyncLoadBalancerAutoConfigurationTests.java @@ -19,6 +19,7 @@ package org.springframework.cloud.client.loadbalancer; import org.hamcrest.MatcherAssert; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.WebApplicationType; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.client.DefaultServiceInstance; import org.springframework.cloud.client.ServiceInstance; @@ -89,7 +90,7 @@ public class AsyncLoadBalancerAutoConfigurationTests { } protected ConfigurableApplicationContext init(Class config) { - return new SpringApplicationBuilder().web(false) + return new SpringApplicationBuilder().web(WebApplicationType.NONE) .properties("spring.aop.proxyTargetClass=true") .sources(config, AsyncLoadBalancerAutoConfiguration.class).run(); } diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/LoadBalancerRequestFactoryConfigurationTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/LoadBalancerRequestFactoryConfigurationTests.java index 4cdbc0a5..c89a3e14 100644 --- a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/LoadBalancerRequestFactoryConfigurationTests.java +++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/LoadBalancerRequestFactoryConfigurationTests.java @@ -28,6 +28,7 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.boot.WebApplicationType; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.cloud.client.ServiceInstance; import org.springframework.context.ConfigurableApplicationContext; @@ -62,7 +63,7 @@ public class LoadBalancerRequestFactoryConfigurationTests { } protected ConfigurableApplicationContext init(Class config) { - ConfigurableApplicationContext context = new SpringApplicationBuilder().web(false) + ConfigurableApplicationContext context = new SpringApplicationBuilder().web(WebApplicationType.NONE) .properties("spring.aop.proxyTargetClass=true") .sources(config, LoadBalancerAutoConfiguration.class).run(); diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/serviceregistry/AutoServiceRegistrationAutoConfigurationTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/serviceregistry/AutoServiceRegistrationAutoConfigurationTests.java index 39e82067..a1126619 100644 --- a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/serviceregistry/AutoServiceRegistrationAutoConfigurationTests.java +++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/serviceregistry/AutoServiceRegistrationAutoConfigurationTests.java @@ -8,8 +8,9 @@ import org.hamcrest.Matchers; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; + import org.springframework.beans.factory.BeanCreationException; -import org.springframework.boot.test.util.EnvironmentTestUtils; +import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -74,7 +75,7 @@ public class AutoServiceRegistrationAutoConfigurationTests { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); context.register(list.toArray(new Class[0])); if (StringUtils.hasText(property)) { - EnvironmentTestUtils.addEnvironment(context, property); + TestPropertyValues.of(property).applyTo(context); } context.refresh(); return context; diff --git a/spring-cloud-context-integration-tests/pom.xml b/spring-cloud-context-integration-tests/pom.xml index 58fee792..30644d60 100644 --- a/spring-cloud-context-integration-tests/pom.xml +++ b/spring-cloud-context-integration-tests/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-commons-parent - 2.0.2.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-context-integration-tests diff --git a/spring-cloud-context-integration-tests/src/test/java/org/springframework/cloud/autoconfigure/RefreshScopeIntegrationTests.java b/spring-cloud-context-integration-tests/src/test/java/org/springframework/cloud/autoconfigure/RefreshScopeIntegrationTests.java index 7cc93062..47c6b6c6 100644 --- a/spring-cloud-context-integration-tests/src/test/java/org/springframework/cloud/autoconfigure/RefreshScopeIntegrationTests.java +++ b/spring-cloud-context-integration-tests/src/test/java/org/springframework/cloud/autoconfigure/RefreshScopeIntegrationTests.java @@ -49,6 +49,7 @@ import static org.junit.Assert.assertTrue; @RunWith(SpringRunner.class) @SpringBootTest(classes = TestConfiguration.class) +@SuppressWarnings("Duplicates") public class RefreshScopeIntegrationTests { @Autowired diff --git a/spring-cloud-context/pom.xml b/spring-cloud-context/pom.xml index 3684942b..3b52b3bb 100644 --- a/spring-cloud-context/pom.xml +++ b/spring-cloud-context/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-commons-parent - 2.0.2.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-context diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/RefreshAutoConfiguration.java b/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/RefreshAutoConfiguration.java index c6e41a6f..78518ef2 100644 --- a/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/RefreshAutoConfiguration.java +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/autoconfigure/RefreshAutoConfiguration.java @@ -23,13 +23,14 @@ import java.util.Set; import javax.annotation.PostConstruct; -import org.springframework.aop.scope.ScopedProxyUtils; +import org.springframework.aop.framework.ProxyFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.ListableBeanFactory; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; -import org.springframework.beans.factory.config.BeanDefinitionHolder; +import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; @@ -62,10 +63,14 @@ import org.springframework.stereotype.Component; */ @Configuration @ConditionalOnClass(RefreshScope.class) -@ConditionalOnProperty(name = "spring.cloud.refresh.enabled", matchIfMissing = true) +@ConditionalOnProperty(name = RefreshAutoConfiguration.REFRESH_SCOPE_ENABLED, matchIfMissing = true) @AutoConfigureBefore(HibernateJpaAutoConfiguration.class) public class RefreshAutoConfiguration { + public static final String REFRESH_SCOPE_NAME = "refresh"; + public static final String REFRESH_SCOPE_PREFIX = "spring.cloud.refresh"; + public static final String REFRESH_SCOPE_ENABLED = REFRESH_SCOPE_PREFIX + ".enabled"; + @Bean @ConditionalOnMissingBean(RefreshScope.class) public static RefreshScope refreshScope() { @@ -95,7 +100,9 @@ public class RefreshAutoConfiguration { @Component protected static class RefreshScopeBeanDefinitionEnhancer - implements BeanDefinitionRegistryPostProcessor { + implements BeanPostProcessor, BeanDefinitionRegistryPostProcessor { + + private BeanDefinitionRegistry registry; /** * Class names for beans to post process into refresh scope. Useful when you don't @@ -104,8 +111,6 @@ public class RefreshAutoConfiguration { private Set refreshables = new HashSet<>( Arrays.asList("com.zaxxer.hikari.HikariDataSource")); - private Environment environment; - public Set getRefreshable() { return this.refreshables; } @@ -124,29 +129,42 @@ public class RefreshAutoConfiguration { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + Environment environment = beanFactory.getBean(Environment.class); + if (environment == null) { + environment = new StandardEnvironment(); + } + Binder.get(environment).bind(REFRESH_SCOPE_PREFIX, Bindable.ofInstance(this)); } @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { - for (String name : registry.getBeanDefinitionNames()) { - BeanDefinition definition = registry.getBeanDefinition(name); - if (isApplicable(registry, name, definition)) { - BeanDefinitionHolder holder = new BeanDefinitionHolder(definition, - name); - BeanDefinitionHolder proxy = ScopedProxyUtils - .createScopedProxy(holder, registry, true); - definition.setScope("refresh"); - registry.registerBeanDefinition(proxy.getBeanName(), - proxy.getBeanDefinition()); - } + this.registry = registry; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) + throws BeansException { + BeanDefinition definition = null; + try { + definition = registry.getBeanDefinition(beanName); } + catch (NoSuchBeanDefinitionException e) { + // just ignore and move on + return bean; + } + if (isApplicable(registry, beanName, definition)) { + definition.setScope(REFRESH_SCOPE_NAME); + ProxyFactory proxyFactory = new ProxyFactory(bean); + return proxyFactory.getProxy(); + } + return bean; } private boolean isApplicable(BeanDefinitionRegistry registry, String name, BeanDefinition definition) { String scope = definition.getScope(); - if ("refresh".equals(scope)) { + if (REFRESH_SCOPE_NAME.equals(scope)) { // Already refresh scoped return false; } @@ -158,15 +176,6 @@ public class RefreshAutoConfiguration { } } if (type != null) { - if (this.environment == null && registry instanceof BeanFactory) { - this.environment = ((BeanFactory) registry) - .getBean(Environment.class); - } - if (this.environment == null) { - this.environment = new StandardEnvironment(); - } - Binder.get(environment).bind("spring.cloud.refresh", - Bindable.ofInstance(this)); return this.refreshables.contains(type); } return false; diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/autoconfigure/RefreshAutoConfigurationTests.java b/spring-cloud-context/src/test/java/org/springframework/cloud/autoconfigure/RefreshAutoConfigurationTests.java index 7512f2ef..2ec3f28d 100644 --- a/spring-cloud-context/src/test/java/org/springframework/cloud/autoconfigure/RefreshAutoConfigurationTests.java +++ b/spring-cloud-context/src/test/java/org/springframework/cloud/autoconfigure/RefreshAutoConfigurationTests.java @@ -69,7 +69,7 @@ public class RefreshAutoConfigurationTests { @Configuration @EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class) - @EnableConfigurationProperties(ConfigProps.class) + @EnableConfigurationProperties static class Config { } diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/context/refresh/ContextRefresherTests.java b/spring-cloud-context/src/test/java/org/springframework/cloud/context/refresh/ContextRefresherTests.java index e4b7cc9c..d7591d0f 100644 --- a/spring-cloud-context/src/test/java/org/springframework/cloud/context/refresh/ContextRefresherTests.java +++ b/spring-cloud-context/src/test/java/org/springframework/cloud/context/refresh/ContextRefresherTests.java @@ -38,7 +38,7 @@ public class ContextRefresherTests { @Test public void orderNewPropertiesConsistentWithNewContext() { try (ConfigurableApplicationContext context = SpringApplication.run(Empty.class, - "--spring.main.webEnvironment=false", "--debug=false", + "--spring.main.web-application-type=none", "--debug=false", "--spring.main.bannerMode=OFF")) { context.getEnvironment().setActiveProfiles("refresh"); List names = names(context.getEnvironment().getPropertySources()); @@ -61,7 +61,7 @@ public class ContextRefresherTests { // Use spring.cloud.bootstrap.name to switch off the defaults (which would pick up // a bootstrapProperties immediately try (ConfigurableApplicationContext context = SpringApplication.run(Empty.class, - "--spring.main.webEnvironment=false", "--debug=false", + "--spring.main.web-application-type=none", "--debug=false", "--spring.main.bannerMode=OFF", "--spring.cloud.bootstrap.name=refresh")) { List names = names(context.getEnvironment().getPropertySources()); @@ -82,7 +82,7 @@ public class ContextRefresherTests { // Use spring.cloud.bootstrap.name to switch off the defaults (which would pick up // a bootstrapProperties immediately try (ConfigurableApplicationContext context = SpringApplication.run( - ContextRefresherTests.class, "--spring.main.webEnvironment=false", + ContextRefresherTests.class, "--spring.main.web-application-type=none", "--debug=false", "--spring.main.bannerMode=OFF", "--spring.cloud.bootstrap.name=refresh")) { ContextRefresher refresher = new ContextRefresher(context, scope); @@ -107,7 +107,7 @@ public class ContextRefresherTests { .get(getClass().getClassLoader()); assertThat(system.getCount()).isEqualTo(0); try (ConfigurableApplicationContext context = SpringApplication.run(Empty.class, - "--spring.main.webEnvironment=false", "--debug=false", + "--spring.main.web-application-type=none", "--debug=false", "--spring.main.bannerMode=OFF", "--spring.cloud.bootstrap.name=refresh")) { assertThat(system.getCount()).isEqualTo(4); @@ -123,7 +123,7 @@ public class ContextRefresherTests { TestBootstrapConfiguration.fooSightings = new ArrayList<>(); try (ConfigurableApplicationContext context = SpringApplication.run(ContextRefresherTests.class, - "--spring.main.webEnvironment=false", "--debug=false", + "--spring.main.web-application-type=none", "--debug=false", "--spring.main.bannerMode=OFF", "--spring.cloud.bootstrap.name=refresh", "--test.bootstrap.foo=bar")) { diff --git a/spring-cloud-starter/pom.xml b/spring-cloud-starter/pom.xml index c153f105..f1ef0553 100644 --- a/spring-cloud-starter/pom.xml +++ b/spring-cloud-starter/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-commons-parent - 2.0.2.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT spring-cloud-starter spring-cloud-starter diff --git a/spring-cloud-test-support/pom.xml b/spring-cloud-test-support/pom.xml index ddf021d1..28826c2f 100644 --- a/spring-cloud-test-support/pom.xml +++ b/spring-cloud-test-support/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-commons-parent - 2.0.2.BUILD-SNAPSHOT + 2.1.0.BUILD-SNAPSHOT .. spring-cloud-test-support