diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/spring/annotation/ApolloAnnotationProcessor.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/spring/annotation/ApolloAnnotationProcessor.java index 45de8dfd4f1..34529917834 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/spring/annotation/ApolloAnnotationProcessor.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/spring/annotation/ApolloAnnotationProcessor.java @@ -9,6 +9,8 @@ import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.core.Ordered; +import org.springframework.core.PriorityOrdered; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.util.ReflectionUtils; @@ -20,7 +22,7 @@ * * @author Jason Song(song_s@ctrip.com) */ -public class ApolloAnnotationProcessor implements BeanPostProcessor { +public class ApolloAnnotationProcessor implements BeanPostProcessor, PriorityOrdered { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { Class clazz = bean.getClass(); @@ -80,4 +82,9 @@ public void onChange(ConfigChangeEvent changeEvent) { } } + @Override + public int getOrder() { + //make it as late as possible + return Ordered.LOWEST_PRECEDENCE; + } } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/spring/config/PropertySourcesProcessor.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/spring/config/PropertySourcesProcessor.java index 36717280a5c..048a6fab135 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/spring/config/PropertySourcesProcessor.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/spring/config/PropertySourcesProcessor.java @@ -11,6 +11,8 @@ import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.context.EnvironmentAware; +import org.springframework.core.Ordered; +import org.springframework.core.PriorityOrdered; import org.springframework.core.env.CompositePropertySource; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.Environment; @@ -24,10 +26,9 @@ * * @author Jason Song(song_s@ctrip.com) */ -public class PropertySourcesProcessor implements BeanFactoryPostProcessor, EnvironmentAware { +public class PropertySourcesProcessor implements BeanFactoryPostProcessor, EnvironmentAware, PriorityOrdered { private static final String APOLLO_PROPERTY_SOURCE_NAME = "ApolloPropertySources"; private static final Multimap NAMESPACE_NAMES = HashMultimap.create(); - private static final AtomicBoolean PROPERTY_SOURCES_INITIALIZED = new AtomicBoolean(false); private ConfigurableEnvironment environment; @@ -37,15 +38,14 @@ public static boolean addNamespaces(Collection namespaces, int order) { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { - if (!PROPERTY_SOURCES_INITIALIZED.compareAndSet(false, true)) { - //already initialized - return; - } - initializePropertySources(); } protected void initializePropertySources() { + if (environment.getPropertySources().contains(APOLLO_PROPERTY_SOURCE_NAME)) { + //already initialized + return; + } CompositePropertySource composite = new CompositePropertySource(APOLLO_PROPERTY_SOURCE_NAME); //sort by order asc @@ -72,6 +72,11 @@ public void setEnvironment(Environment environment) { //only for test private static void reset() { NAMESPACE_NAMES.clear(); - PROPERTY_SOURCES_INITIALIZED.set(false); + } + + @Override + public int getOrder() { + //make it as early as possible + return Ordered.HIGHEST_PRECEDENCE; } }