[英]how to dynamic register spring bean and set as primary
注册很容易。 只需要调用beanFactory.registerSingleton(beanName, object);
.
但是beanFactory.getBeanDefinition(beanName).setPrimary(true)
会抛出NPE 。
那么如何动态注册spring bean并设置为primary呢?
您必须构建 BeanDefinition。 例如
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(object.class)
.addPropertyValue("nameProperty1", propertyValue1)
.addPropertyValue("nameProperty2", propertyValue2)
BeanDefinition beanDefinition = builder.getBeanDefinition();
beanDefinition.setPrimary(Boolean.TRUE);
beanDefinitionRegistry.registerBeanDefinition(beanName, beanDefinition);
因此,您现在可以从应用程序上下文中获取 bean “beanName”。
尝试打电话
beanFactory.initializeBean(object, beanName);
beanFactory.autowireBeanProperties(object, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true);
进而
beanFactory.getBeanDefinition(beanName).setPrimary(true)
这是一个完整的示例,因为我必须搜索并结合其他答案才能使其充分发挥作用
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Config implements BeanDefinitionRegistryPostProcessor {
public static final String MOCK_CLASS = "MyClassMock";
public static final String MY_CLASS = "MyClass";
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
final var beanDefinition = BeanDefinitionBuilder
.rootBeanDefinition(MyClass.class)
.getBeanDefinition();
beanDefinition.setPrimary(true);
registry.registerBeanDefinition(MOCK_CLASS, beanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
beanFactory.registerSingleton(MOCK_CLASS, new MyClass());
beanFactory.registerSingleton(MY_CLASS, new MyClass());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.