我正在尝试将Spring集成到一个独立的Swing应用程序中。
Swing应用程序在启动时要求提供登录详细信息,然后应该使用这些信息来创建一个单独的DataSource
Bean。
但是,我想不出一种方法在初始化期间将这些登录信息(作为Java object)传递给Spring (然后再传递给@Bean
ApplicationContext
方法)。
有什么想法吗?
可能的解决方案:
@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();
}
}
}
发布于 2021-04-15 23:06:59
有多种方法可以做到这一点,
使用BeanDefinitionRegistryPostProcessor的-创建将实现BeanDefinitionRegistryPostProcessor
的bean,然后存储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
}
并在禁用headless模式的情况下启动应用程序-
@SpringBootApplication
public class DesktopApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(DesktopApplication.class).headless(false).run(args);
}
}
https://stackoverflow.com/questions/67116657
复制相似问题