From 05fe17522302b4a513900cf0685586e4ed6a2bdc Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Wed, 26 Nov 2014 09:58:05 +0000 Subject: [PATCH] Move field injection into @Configuration --- .../cloud/netflix/zuul/FilterInitializer.java | 8 +- .../cloud/netflix/zuul/RouteLocator.java | 43 ++++++---- .../cloud/netflix/zuul/ZuulConfiguration.java | 25 ++++-- .../netflix/zuul/ZuulHandlerMapping.java | 30 +++---- .../cloud/netflix/zuul/RouteLocatorTests.java | 79 ++++++++++--------- 5 files changed, 102 insertions(+), 83 deletions(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/FilterInitializer.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/FilterInitializer.java index 4d4f5ee7..e540261d 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/FilterInitializer.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/FilterInitializer.java @@ -7,7 +7,6 @@ import javax.servlet.ServletContextListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.filters.FilterRegistry; @@ -23,10 +22,13 @@ public class FilterInitializer implements ServletContextListener { private static final Logger LOGGER = LoggerFactory.getLogger(FilterInitializer.class); - @Autowired private Map filters; - @Override + public FilterInitializer(Map filters) { + this.filters = filters; + } + + @Override public void contextInitialized(ServletContextEvent sce) { LOGGER.info("Starting filter initializer context listener"); diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/RouteLocator.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/RouteLocator.java index 879808eb..72aebcdb 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/RouteLocator.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/RouteLocator.java @@ -1,40 +1,53 @@ package org.springframework.cloud.netflix.zuul; +import java.lang.reflect.Field; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; + import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; + import org.springframework.boot.bind.PropertySourceUtils; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.context.environment.EnvironmentChangeEvent; import org.springframework.context.ApplicationListener; -import org.springframework.core.env.*; +import org.springframework.context.EnvironmentAware; +import org.springframework.core.env.CompositePropertySource; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.Environment; +import org.springframework.core.env.MutablePropertySources; +import org.springframework.core.env.PropertySource; +import org.springframework.core.env.StandardEnvironment; import org.springframework.util.ReflectionUtils; -import java.lang.reflect.Field; -import java.util.*; -import java.util.concurrent.atomic.AtomicReference; - /** * @author Spencer Gibb */ @Slf4j -public class RouteLocator implements ApplicationListener { +public class RouteLocator implements ApplicationListener, EnvironmentAware { public static final String DEFAULT_ROUTE = "/"; - @Autowired - protected ConfigurableEnvironment env; + private ConfigurableEnvironment env = new StandardEnvironment(); - @Autowired - protected DiscoveryClient discovery; + private DiscoveryClient discovery; - @Autowired - protected ZuulProperties properties; + private ZuulProperties properties; private Field propertySourcesField; private AtomicReference> routes = new AtomicReference<>(); + + @Override + public void setEnvironment(Environment environment) { + env = (ConfigurableEnvironment) environment; + } - public RouteLocator() { - initField(); + public RouteLocator(DiscoveryClient discovery, ZuulProperties properties) { + this.discovery = discovery; + this.properties = properties; + initField(); } private void initField() { diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulConfiguration.java index 95b0f497..1ab4ce72 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulConfiguration.java @@ -1,11 +1,16 @@ package org.springframework.cloud.netflix.zuul; +import java.util.Map; + +import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.http.ZuulServlet; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.trace.TraceRepository; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.netflix.zuul.filters.post.SendErrorFilter; import org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter; import org.springframework.cloud.netflix.zuul.filters.pre.DebugFilter; @@ -19,7 +24,7 @@ import org.springframework.context.annotation.Configuration; * @author Spencer Gibb */ @Configuration -@EnableConfigurationProperties() +@EnableConfigurationProperties(ZuulProperties.class) @ConditionalOnClass(ZuulServlet.class) @ConditionalOnExpression("${zuul.enabled:true}") public class ZuulConfiguration { @@ -27,14 +32,18 @@ public class ZuulConfiguration { @Autowired(required=false) private TraceRepository traces; - @Bean - public ZuulProperties zuulProperties() { - return new ZuulProperties(); - } + @Autowired + private DiscoveryClient discovery; + + @Autowired + private ZuulProperties zuulProperties; + + @Autowired + private Map filters; @Bean public RouteLocator routes(){ - return new RouteLocator(); + return new RouteLocator(discovery, zuulProperties); } @Bean @@ -44,12 +53,12 @@ public class ZuulConfiguration { @Bean public ZuulHandlerMapping zuulHandlerMapping() { - return new ZuulHandlerMapping(); + return new ZuulHandlerMapping(routes(), zuulController(), zuulProperties); } @Bean public FilterInitializer zuulFilterInitializer() { - return new FilterInitializer(); + return new FilterInitializer(filters); } // pre filters diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulHandlerMapping.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulHandlerMapping.java index 51c16f61..afaa6a49 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulHandlerMapping.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulHandlerMapping.java @@ -1,36 +1,30 @@ package org.springframework.cloud.netflix.zuul; -import lombok.extern.slf4j.Slf4j; +import java.util.Map; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.discovery.InstanceRegisteredEvent; import org.springframework.context.ApplicationListener; import org.springframework.util.StringUtils; import org.springframework.web.servlet.handler.AbstractUrlHandlerMapping; -import javax.annotation.PostConstruct; -import java.util.Map; - /** * @author Spencer Gibb */ -@Slf4j public class ZuulHandlerMapping extends AbstractUrlHandlerMapping implements ApplicationListener { - @Autowired - protected RouteLocator routeLocator; + private RouteLocator routeLocator; + + private ZuulController zuul; + + private ZuulProperties properties; @Autowired - protected ZuulController zuul; - - @Autowired - protected ZuulProperties properties; - - public ZuulHandlerMapping() { - setOrder(-200); - } - - @PostConstruct - public void init() { + public ZuulHandlerMapping(RouteLocator routeLocator, ZuulController zuul, ZuulProperties properties) { + this.routeLocator = routeLocator; + this.zuul = zuul; + this.properties = properties; + setOrder(-200); } @Override diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/RouteLocatorTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/RouteLocatorTests.java index ed63a947..7d658d2e 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/RouteLocatorTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/RouteLocatorTests.java @@ -20,52 +20,53 @@ import static org.mockito.MockitoAnnotations.initMocks; */ public class RouteLocatorTests { - public static final String IGNOREDSERVICE = "ignoredservice"; - public static final String ASERVICE = "aservice"; - public static final String MYSERVICE = "myservice"; - @Mock - ConfigurableEnvironment env; + public static final String IGNOREDSERVICE = "ignoredservice"; + public static final String ASERVICE = "aservice"; + public static final String MYSERVICE = "myservice"; + @Mock + ConfigurableEnvironment env; - @Mock - DiscoveryClient discovery; + @Mock + DiscoveryClient discovery; + @Before + public void init() { + initMocks(this); + } - @Before - public void init() { - initMocks(this); - } + @Test + public void testGetRoutes() { + ZuulProperties properties = new ZuulProperties(); + RouteLocator routeLocator = new RouteLocator(this.discovery, properties); + properties.setIgnoredServices(Lists.newArrayList(IGNOREDSERVICE)); + routeLocator.setEnvironment(this.env); - @Test - public void testGetRoutes() { - RouteLocator routeLocator = new RouteLocator(); - routeLocator.properties = new ZuulProperties(); - routeLocator.properties.setIgnoredServices(Lists.newArrayList(IGNOREDSERVICE)); - routeLocator.discovery = this.discovery; - routeLocator.env = this.env; + MutablePropertySources propertySources = new MutablePropertySources(); + propertySources.addFirst(new MockPropertySource().withProperty("zuul.route." + + ASERVICE, getMapping(ASERVICE))); + when(env.getPropertySources()).thenReturn(propertySources); + when(discovery.getServices()).thenReturn( + Lists.newArrayList(MYSERVICE, IGNOREDSERVICE)); - MutablePropertySources propertySources = new MutablePropertySources(); - propertySources.addFirst(new MockPropertySource().withProperty("zuul.route."+ ASERVICE, getMapping(ASERVICE))); - when(env.getPropertySources()).thenReturn(propertySources); - when(discovery.getServices()).thenReturn(Lists.newArrayList(MYSERVICE, IGNOREDSERVICE)); + Map routesMap = routeLocator.getRoutes(); - Map routesMap = routeLocator.getRoutes(); + assertNotNull("routesMap was null", routesMap); + assertFalse("routesMap was empty", routesMap.isEmpty()); + assertMapping(routesMap, MYSERVICE); + assertMapping(routesMap, ASERVICE); - assertNotNull("routesMap was null", routesMap); - assertFalse("routesMap was empty", routesMap.isEmpty()); - assertMapping(routesMap, MYSERVICE); - assertMapping(routesMap, ASERVICE); + String serviceId = routesMap.get(getMapping(IGNOREDSERVICE)); + assertNull("routes did not ignore " + IGNOREDSERVICE, serviceId); + } - String serviceId = routesMap.get(getMapping(IGNOREDSERVICE)); - assertNull("routes did not ignore "+IGNOREDSERVICE, serviceId); - } + protected void assertMapping(Map routesMap, String expectedServiceId) { + String mapping = getMapping(expectedServiceId); + String serviceId = routesMap.get(mapping); + assertEquals("routesMap had wrong value for " + mapping, expectedServiceId, + serviceId); + } - protected void assertMapping(Map routesMap, String expectedServiceId) { - String mapping = getMapping(expectedServiceId); - String serviceId = routesMap.get(mapping); - assertEquals("routesMap had wrong value for "+mapping, expectedServiceId, serviceId); - } - - private String getMapping(String serviceId) { - return "/"+ serviceId +"/**"; - } + private String getMapping(String serviceId) { + return "/" + serviceId + "/**"; + } }