package org.springframework.issues; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ConditionContext; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ConfigurationCondition; import org.springframework.context.annotation.ConfigurationCondition.ConfigurationPhase; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.core.type.AnnotatedTypeMetadata; @Configuration public class Config { public static final String BEAN_NAME = "name"; @Order(Ordered.HIGHEST_PRECEDENCE) @Conditional(OnBeanMissingCondition.class) public class MemberBefore { @Bean(BEAN_NAME) public Foo foo() { return new Foo(); } } @Order(Ordered.LOWEST_PRECEDENCE) @Conditional(OnBeanMissingCondition.class) public class MemberAfter { @Bean(BEAN_NAME) public Bar bar() { return new Bar(); } } // based on org.springframework.boot.autoconfigure.condition.OnBeanCondition public static class OnBeanMissingCondition implements ConfigurationCondition { @Override public ConfigurationPhase getConfigurationPhase() { return ConfigurationPhase.REGISTER_BEAN; } @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { return !context.getBeanFactory().containsBeanDefinition(BEAN_NAME); } } }