From 9aa979cd318db34feef6dde8db4aa137ebcdd335 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Thu, 29 Jan 2015 16:50:37 +0000 Subject: [PATCH] @FeignClientScan -> @EnableFeignClients By analogy with @EnableJpaRepositories, so it's obvious that the same thing will happen (interfaces are turned into concrete @Beans). --- ...lientScan.java => EnableFeignClients.java} | 4 +- .../netflix/feign/FeignAutoConfiguration.java | 24 +-------- .../cloud/netflix/feign/FeignClient.java | 14 +++-- .../netflix/feign/FeignClientFactoryBean.java | 6 +-- .../feign/FeignClientsConfiguration.java | 52 +++++++++++++++++++ ...istrar.java => FeignClientsRegistrar.java} | 11 ++-- .../cloud/netflix/feign/FeignClientTests.java | 2 +- 7 files changed, 72 insertions(+), 41 deletions(-) rename spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/{FeignClientScan.java => EnableFeignClients.java} (95%) create mode 100644 spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientsConfiguration.java rename spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/{FeignClientScanRegistrar.java => FeignClientsRegistrar.java} (94%) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientScan.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/EnableFeignClients.java similarity index 95% rename from spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientScan.java rename to spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/EnableFeignClients.java index 74b485fe9..6332a49ed 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientScan.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/EnableFeignClients.java @@ -37,8 +37,8 @@ import org.springframework.context.annotation.Import; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented -@Import(FeignClientScanRegistrar.class) -public @interface FeignClientScan { +@Import({ FeignClientsConfiguration.class, FeignClientsRegistrar.class }) +public @interface EnableFeignClients { /** * Alias for the {@link #basePackages()} attribute. Allows for more concise annotation diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignAutoConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignAutoConfiguration.java index 34118b97d..088c433e2 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignAutoConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignAutoConfiguration.java @@ -16,7 +16,6 @@ package org.springframework.cloud.netflix.feign; -import feign.slf4j.Slf4jLogger; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; @@ -28,9 +27,7 @@ import org.springframework.context.annotation.Configuration; import com.netflix.loadbalancer.ILoadBalancer; import feign.Client; -import feign.Contract; import feign.Feign; -import feign.Logger; /** * @author Spencer Gibb @@ -39,28 +36,9 @@ import feign.Logger; @Configuration @ConditionalOnClass(Feign.class) @AutoConfigureAfter(ArchaiusAutoConfiguration.class) +@EnableFeignClients public class FeignAutoConfiguration { - @Bean - public SpringDecoder feignDecoder() { - return new SpringDecoder(); - } - - @Bean - public SpringEncoder feignEncoder() { - return new SpringEncoder(); - } - - @Bean - public Logger feignLogger() { - return new Slf4jLogger(); - } - - @Bean - public Contract feignContract() { - return new SpringMvcContract(); - } - @ConditionalOnClass(ILoadBalancer.class) @Configuration protected static class RibbonClientConfiguration { diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClient.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClient.java index 8daa1b04e..e8d02c261 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClient.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClient.java @@ -24,7 +24,10 @@ import java.lang.annotation.Target; /** * Annotation for interfaces declaring that a REST client with that interface should be - * created (e.g. for autowiring into another component). + * created (e.g. for autowiring into another component). If ribbon is available it will be + * used to load balance the backend requests, and the load balancer can be configured + * using a @RibbonClient with the same name (i.e. value) as the feign client. + * * @author Spencer Gibb */ @Target(ElementType.TYPE) @@ -33,14 +36,15 @@ import java.lang.annotation.Target; public @interface FeignClient { /** - * @return serviceId if loadbalance is true, url otherwise There is no need to prefix - * serviceId with http://. + * The serviceId if loadbalance is true, or an absolute URL otherwise There is no need + * to prefix serviceId with http://. */ String value(); /** - * @return true if calls should be load balanced (assuming a load balancer is - * available). + * Set to true if calls should be load balanced (assuming a load balancer is + * available). If no load balancer is available this flag is ignored (and hence the + * {@link #value() value} should be an absolute URL). */ boolean loadbalance() default true; diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientFactoryBean.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientFactoryBean.java index 5a2da27ad..1731f3d25 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientFactoryBean.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientFactoryBean.java @@ -106,10 +106,6 @@ class FeignClientFactoryBean implements FactoryBean { return builder; } - protected T loadBalance(Class type, String schemeName) { - return loadBalance(feign(), type, schemeName); - } - protected T loadBalance(Feign.Builder builder, Class type, String schemeName) { builder.logger(new Slf4jLogger(type)); // TODO: how to have choice here? if (this.ribbonClient != null) { @@ -126,7 +122,7 @@ class FeignClientFactoryBean implements FactoryBean { this.schemeName = "http://" + this.schemeName; } if (this.loadbalance) { - return loadBalance(this.type, this.schemeName); + return loadBalance(feign(), this.type, this.schemeName); } return feign().target(this.type, this.schemeName); } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientsConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientsConfiguration.java new file mode 100644 index 000000000..2c317f8ef --- /dev/null +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientsConfiguration.java @@ -0,0 +1,52 @@ +/* + * Copyright 2013-2015 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 + * + * http://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.netflix.feign; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import feign.Contract; +import feign.Logger; +import feign.slf4j.Slf4jLogger; + +/** + * @author Dave Syer + */ +@Configuration +public class FeignClientsConfiguration { + + @Bean + public SpringDecoder feignDecoder() { + return new SpringDecoder(); + } + + @Bean + public SpringEncoder feignEncoder() { + return new SpringEncoder(); + } + + @Bean + public Logger feignLogger() { + return new Slf4jLogger(); + } + + @Bean + public Contract feignContract() { + return new SpringMvcContract(); + } + +} diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientScanRegistrar.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientsRegistrar.java similarity index 94% rename from spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientScanRegistrar.java rename to spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientsRegistrar.java index 411794f2c..6fda8be82 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientScanRegistrar.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientsRegistrar.java @@ -41,7 +41,7 @@ import org.springframework.util.StringUtils; /** * @author Spencer Gibb */ -public class FeignClientScanRegistrar implements ImportBeanDefinitionRegistrar, +public class FeignClientsRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, BeanClassLoaderAware { // patterned after Spring Integration IntegrationComponentScanRegistrar @@ -50,7 +50,7 @@ public class FeignClientScanRegistrar implements ImportBeanDefinitionRegistrar, private ClassLoader classLoader; - public FeignClientScanRegistrar() { + public FeignClientsRegistrar() { } @Override @@ -91,7 +91,8 @@ public class FeignClientScanRegistrar implements ImportBeanDefinitionRegistrar, } } - public BeanDefinitionHolder createBeanDefinition(AnnotationMetadata annotationMetadata) { + private BeanDefinitionHolder createBeanDefinition( + AnnotationMetadata annotationMetadata) { Map attributes = annotationMetadata .getAnnotationAttributes(FeignClient.class.getCanonicalName()); @@ -121,7 +122,7 @@ public class FeignClientScanRegistrar implements ImportBeanDefinitionRegistrar, try { Class target = ClassUtils.forName(beanDefinition .getMetadata().getClassName(), - FeignClientScanRegistrar.this.classLoader); + FeignClientsRegistrar.this.classLoader); return !target.isAnnotation(); } catch (Exception ex) { @@ -140,7 +141,7 @@ public class FeignClientScanRegistrar implements ImportBeanDefinitionRegistrar, protected Set getBasePackages(AnnotationMetadata importingClassMetadata) { Map attributes = importingClassMetadata - .getAnnotationAttributes(FeignClientScan.class.getCanonicalName()); + .getAnnotationAttributes(EnableFeignClients.class.getCanonicalName()); Set basePackages = new HashSet<>(); for (String pkg : (String[]) attributes.get("value")) { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignClientTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignClientTests.java index c1eeae75c..72a13fee1 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignClientTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignClientTests.java @@ -91,7 +91,7 @@ public class FeignClientTests { @Configuration @EnableAutoConfiguration @RestController - @FeignClientScan + @EnableFeignClients @RibbonClient(name = "localapp", configuration = LocalRibbonClientConfiguration.class) protected static class Application {