可以,我相信这个答案会满足您的需求。
我们需要的一个实现
MergedBeanDefinitionPostProcessor将为
aclass
的属性设置正确的值
MyBean。可以通过以下课程来完成
import org.springframework.beans.BeansException;import org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor;import org.springframework.beans.factory.support.RootBeanDefinition;import org.springframework.stereotype.Component;@Componentpublic class MyBeanPostProcessor implements MergedBeanDefinitionPostProcessor { @Override public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) { if(beanName.equals("myBeanFirst")) { beanDefinition.getPropertyValues().add("a", getMyBeanFirstAImpl()); } else if(beanName.equals("myBeanSecond")) { beanDefinition.getPropertyValues().add("a", getMyBeanSecondAImpl()); } } private Object getMyBeanFirstAImpl() { return new AImpl(); } private Object getMyBeanSecondAImpl() { return new AImpl(); } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; }}如您所见,这里的bean名称是硬编码的,但是可以在静态最终String中设置它们,以下代码中的@Bean批注也将使用它们
@Configurationpublic class Configuration { @Bean public MyBean myBeanFirst() { return new MyBean(); } @Bean public MyBean myBeanSecond() { return new MyBean(); }}您将在以下代码中注意到,在MyBean创建方法中未调用setA,因为无论设置的值(在这种情况下未设置)在Spring执行bean后处理器时都将被覆盖。
如果您需要A的默认值(例如,要将其注入其他bean),请继续在先前的配置中定义一个@Bean



