springboot使用ImportBeanDefinitionRegistrar 动态注册bean

【README】

1.采用  ImportBeanDefinitionRegistrar 动态注册bean,应用场景有

如 一个后端服务需要用到多个 rabbitmq集群客户端,kafka客户端;这时就需要手动注册多个同类型的bean,但不同beanName,并用 @Resource(name="beanName") (或@Autowire+@Qualifier)来引入bean;

2.在封装后台框架时,经常会注册同类型的多个bean,因此 ImportBeanDefinitionRegistrar 特别有用;

3.本文代码转自

https://www.logicbig.com/tutorials/spring-framework/spring-core/import-bean-registrar.htmlhttps://www.logicbig.com/tutorials/spring-framework/spring-core/import-bean-registrar.html


【例】使用 ImportBeanDefinitionRegistrar 动态注册bean

public class MyBeanRegistrar implements ImportBeanDefinitionRegistrar {

  @Override
  public void registerBeanDefinitions (AnnotationMetadata importingClassMetadata,
                                       BeanDefinitionRegistry registry) {
      GenericBeanDefinition gbd = new GenericBeanDefinition();
      gbd.setBeanClass(AppBean.class);
      // 显然,这里是基于反射调用bean的setter方法 
      gbd.getPropertyValues().addPropertyValue("str", "value set from registrar");
      registry.registerBeanDefinition("appBean", gbd);
  }
}

自动装配类

@Configuration
@Import(MyBeanRegistrar.class)
public class MyConfig {

  @Bean
  ClientBean clientBean () {
      return new ClientBean();
  }
}

使用动态注册的bean, AppBean

public class ClientBean {
  @Autowired
  private AppBean appBean;

  public void doSomething () {
      appBean.process();
  }
}

AppBean 定义:

public class AppBean {
  private String str;

  public void setStr (String str) {
      this.str = str;
  }

  public void process () {
      System.out.println(str);
  }
}

测试方法入口:

public class ImportBeanDefinitionRegistrarExample {

  public static void main (String[] args) {
      ApplicationContext context =
                new AnnotationConfigApplicationContext(
                          MyConfig.class);
      ClientBean bean = context.getBean(ClientBean.class);
      bean.doSomething();
  }
}

打印日志:

value set from registrar 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot提供了多种方式来动态注册bean: 1. 使用@Bean注解 可以使用@Bean注解在@Configuration类中动态注册bean。例如: @Configuration public class MyConfig { @Bean public MyBean myBean() { return new MyBean(); } } 在运行时,可以使用ApplicationContext的registerBean方法来动态注册这个bean: @Autowired private ApplicationContext context; public void registerMyBean() { context.registerBean(MyBean.class, () -> new MyBean()); } 2. 使用@ComponentScan注解 可以使用@ComponentScan注解扫描指定的包路径,动态注册bean。例如: @Configuration @ComponentScan("com.example.beans") public class MyConfig {} 在运行时,可以使用ApplicationContext的refresh方法来刷新ApplicationContext,从而加载并注册所有被@ComponentScan扫描到的bean。 @Autowired private ApplicationContext context; public void refreshContext() { context.refresh(); } 3. 使用FactoryBean 可以实现FactoryBean接口来动态创建bean。例如: public class MyFactoryBean implements FactoryBean<MyBean> { @Override public MyBean getObject() throws Exception { return new MyBean(); } @Override public Class<?> getObjectType() { return MyBean.class; } @Override public boolean isSingleton() { return true; } } 在运行时,可以使用ApplicationContext的registerBean方法来动态注册这个FactoryBean: @Autowired private ApplicationContext context; public void registerMyFactoryBean() { context.registerBean("myBean", MyFactoryBean.class); } 以上三种方式都可以动态注册bean,根据具体场景来选择合适的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值