首页 > 解决方案 > 我们如何在春季刷新 AnnotationconfigwebapplicationContext 之前删除/忽略对象?

问题描述

我有 2 个依赖应用程序。当我的子应用程序启动时,我们更新了一些 bean 并刷新了AnnotationconfigwebapplicationContext对象,但是在刷新上下文后,我的MqttConnection对象开始连接和断开连接。
我不想刷新我的Mqttconnection对象。

请建议我如何在刷新之前忽略/删除MqttConnection对象。AnnotationconfigwebapplicationContext


    static{
    AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
    context.regirster(MqttConnection.class);
    context.register(Config.class);
    
    if(checkChildServiceup()){
      Class<?>[] configClasses = getServletConfigClasses();
      if (!ObjectUtils.isEmpty(configClasses)) {
        this.context.register(configClasses);
      }
      this.context.refresh();
     }
     
     }
      
     
    public static Class<?> getServletConfigClasses(){
    retrun new Class[]{AppConfig.class,devService.class,DbConfiguration.class}; 
    }
    
    public boolean static checkChildServiceup(){
      while(true){
          
    if(up){
    return true;
    break;    
      }
    }

标签: javaspring

解决方案


在刷新期间,春季会发生以下情况:

  1. 它扫描配置的所有“资源”(XML、java @Config 文件、用 @Component 注释的类及其派生类等等)并创建 Bean 定义,它是每个 bean 的元数据。注意,bean 定义是一个元对象,它不是 bean 对象本身。

  2. 调用称为“BeanFactoryPostProcessor”-s 的钩子。这些允许更改 bean 定义注册表 - 一个聚合步骤中解析的所有“信息”的对象

  3. 初始化 bean:创建、自动装配等。

因此,您可能需要实现自己的 BeanFactoryPostProcessor,它将动态检查属性集,如我所见,并将MqttConnection从注册表中删除 bean 定义。

@Component // (or register in @Configuration annotated class):
// this must be a spring driven bean by itself, 
// it resolves it but "puts aside" because it 
// recognizes that its a special "hook" 

public class SampleBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

  @Override
  public void postProcessBeanFactory (
            ConfigurableListableBeanFactory beanFactory)
            throws BeansException {

       if(<WHATEVER_PROPERTY_CHANGED__PERFORM_THE CHECK)) {
         ((BeanDefinitionRegistry) beanFactory).removeBeanDefinition("myBean");
      }
  }
}

至于实际删除 bean 定义,这里有许多可能的选项,请确保您阅读了这个 SO 线程以及本教程以获取示例。


推荐阅读