繁体   English   中英

如何动态注册spring bean并设置为主

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM