@ -16,22 +16,9 @@
@@ -16,22 +16,9 @@
package org.springframework.cloud.netflix.ribbon ;
import java.util.Collection ;
import java.util.Collections ;
import java.util.List ;
import java.util.Map ;
import java.util.Map.Entry ;
import java.util.concurrent.ConcurrentHashMap ;
import org.springframework.beans.BeanUtils ;
import org.springframework.beans.BeansException ;
import org.springframework.beans.factory.BeanFactoryUtils ;
import org.springframework.beans.factory.DisposableBean ;
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration ;
import org.springframework.context.ApplicationContext ;
import org.springframework.context.ApplicationContextAware ;
import org.springframework.cloud.context.named.NamedContextFactory ;
import org.springframework.context.annotation.AnnotationConfigApplicationContext ;
import org.springframework.core.env.MapPropertySource ;
import com.netflix.client.IClient ;
import com.netflix.client.IClientConfigAware ;
@ -46,32 +33,10 @@ import com.netflix.loadbalancer.ILoadBalancer;
@@ -46,32 +33,10 @@ import com.netflix.loadbalancer.ILoadBalancer;
* @author Spencer Gibb
* @author Dave Syer
* /
public class SpringClientFactory implements DisposableBean , ApplicationContextAware {
private Map < String , AnnotationConfigApplicationContext > contexts = new ConcurrentHashMap < > ( ) ;
private Map < String , RibbonClientSpecification > configurations = new ConcurrentHashMap < > ( ) ;
private ApplicationContext parent ;
@Override
public void setApplicationContext ( ApplicationContext parent ) throws BeansException {
this . parent = parent ;
}
public class SpringClientFactory extends NamedContextFactory < RibbonClientSpecification > {
public void setConfigurations ( List < RibbonClientSpecification > configurations ) {
for ( RibbonClientSpecification client : configurations ) {
this . configurations . put ( client . getName ( ) , client ) ;
}
}
@Override
public void destroy ( ) {
Collection < AnnotationConfigApplicationContext > values = this . contexts . values ( ) ;
this . contexts . clear ( ) ;
for ( AnnotationConfigApplicationContext context : values ) {
context . close ( ) ;
}
public SpringClientFactory ( ) {
super ( RibbonClientConfiguration . class , "ribbon" , "ribbon.client.name" ) ;
}
/ * *
@ -106,51 +71,8 @@ public class SpringClientFactory implements DisposableBean, ApplicationContextAw
@@ -106,51 +71,8 @@ public class SpringClientFactory implements DisposableBean, ApplicationContextAw
return getInstance ( serviceId , RibbonLoadBalancerContext . class ) ;
}
private AnnotationConfigApplicationContext getContext ( String name ) {
if ( ! this . contexts . containsKey ( name ) ) {
synchronized ( this . contexts ) {
if ( ! this . contexts . containsKey ( name ) ) {
this . contexts . put ( name , createContext ( name ) ) ;
}
}
}
return this . contexts . get ( name ) ;
}
private AnnotationConfigApplicationContext createContext ( String name ) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext ( ) ;
if ( this . configurations . containsKey ( name ) ) {
for ( Class < ? > configuration : this . configurations . get ( name )
. getConfiguration ( ) ) {
context . register ( configuration ) ;
}
}
for ( Entry < String , RibbonClientSpecification > entry : this . configurations
. entrySet ( ) ) {
if ( entry . getKey ( ) . startsWith ( "default." ) ) {
for ( Class < ? > configuration : entry . getValue ( ) . getConfiguration ( ) ) {
context . register ( configuration ) ;
}
}
}
context . register ( PropertyPlaceholderAutoConfiguration . class ,
RibbonClientConfiguration . class ) ;
context . getEnvironment ( )
. getPropertySources ( )
. addFirst (
new MapPropertySource ( "ribbon" ,
Collections . < String , Object > singletonMap (
"ribbon.client.name" , name ) ) ) ;
if ( this . parent ! = null ) {
// Uses Environment from parent as well as beans
context . setParent ( this . parent ) ;
}
context . refresh ( ) ;
return context ;
}
private < C > C instantiateWithConfig ( AnnotationConfigApplicationContext context ,
Class < C > clazz , IClientConfig config ) {
Class < C > clazz , IClientConfig config ) {
C result = null ;
if ( IClientConfigAware . class . isAssignableFrom ( clazz ) ) {
IClientConfigAware obj = ( IClientConfigAware ) BeanUtils . instantiate ( clazz ) ;
@ -178,12 +100,13 @@ public class SpringClientFactory implements DisposableBean, ApplicationContextAw
@@ -178,12 +100,13 @@ public class SpringClientFactory implements DisposableBean, ApplicationContextAw
}
public < C > C getInstance ( String name , Class < C > type ) {
AnnotationConfigApplicationContext context = getContext ( name ) ;
if ( BeanFactoryUtils . beanNamesForTypeIncludingAncestors ( context , type ) . length > 0 ) {
return context . getBean ( type ) ;
C instance = super . getInstance ( name , typ e ) ;
if ( instance ! = null ) {
return instance ;
}
IClientConfig config = getInstance ( name , IClientConfig . class ) ;
return instantiateWithConfig ( context , type , config ) ;
return instantiateWithConfig ( getContext ( name ) , type , config ) ;
}
}