代码之家  ›  专栏  ›  技术社区  ›  LppEdd

使用运行时值初始化Spring上下文

  •  0
  • LppEdd  · 技术社区  · 5 年前

    我正在尝试将Spring集成到一个独立的Swing应用程序中。
    Swing应用程序在启动时要求提供登录详细信息,然后应使用该信息创建一个单例 DataSource 豆子。

    但是,我无法想出一种方法将这些登录信息(作为Java对象)传递给Spring ApplicationContext 在初始化过程中(然后传递给 @Bean 生产者方法)。


    可能的解决方案:

    @SpringBootApplication
    public class DemoSwingApplication {
      public static void main(final String[] args) {
        ...
    
        final var loginInfo = buildLoginInfo();
    
        try (final var context = new AnnotationConfigApplicationContext()) {
          context.getBeanFactory().registerSingleton("loginInfo", loginInfo);
          context.register(DemoSwingApplication.class);
          context.refresh();
        }
      }
    }
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Sachin Gorade    5 年前

    你可以用多种方法,

    使用BeanDefinitionRegistryPostProcessor -创建一个将实现 BeanDefinitionRegistryPostProcessor BeanDefinitionRegistry 实例并动态注册bean。

    @Component
    public class DbConfigurer implements BeanDefinitionRegistryPostProcessor, BeanFactoryAware {
    
        private BeanDefinitionRegistry beanDefinitionRegistry;
    
        @Override
        public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
            this.beanDefinitionRegistry = beanDefinitionRegistry;
        }
    
        public void registerDataSourceBean() {
            beanDefinitionRegistry.registerBeanDefinition("dataSource", new RootBeanDefinition(DataSource.class,
                    BeanDefinition.SCOPE_SINGLETON, yourDataSourceBeanSupplier));
        }
    }
    

    使用BeanFactoryAware BeanFactoryAware 但这样做的缺点是 BeanFactory 实例-

    @Component
    public class DbConfigurer implements BeanDefinitionRegistryPostProcessor, BeanFactoryAware {
    
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) beanFactory; // Need to cast
        }
    }
    

    然后在你的 UI And 并在配置属性可用时注册bean-

    @Component
    public class MainWindow extends JFrame {
    
        private final DbConfigurer dbConfigurer;
    
        // register bean once user provides config properties
    }
    

    @SpringBootApplication
    public class DesktopApplication {
    
        public static void main(String[] args) {
            new SpringApplicationBuilder(DesktopApplication.class).headless(false).run(args);
        }
    
    }