spring上下文

tvz2xvvm  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(434)

我正在尝试将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();
    }
  }
}
zd287kbt

zd287kbt1#

你可以用多种方法,
使用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);
    }

}

相关问题