[英]How to register RouterFunction in @Bean method in Spring Boot 2.0.0.M2?
[英]How to register bean dynamically in Spring Boot?
我希望在运行时覆盖 Spring 的 SSLContext。 因此,我试图找到将以下方法动态注册为 bean 的方法。
对于 Ex 。 当调用 GetMapping 端点时,以下方法应作为 bean 注入 Spring IoC。
public static SSLContext getSSLContext() throws Exception {
TrustManager[] trustManagers = new TrustManager[] {
new ReloadableX509TrustManager(truststoreNewPath)
};
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustManagers, null);
return sslContext;
}
我怎样才能做到这一点?
您可以使用 ConfigurableBeanFactory 在运行时手动注册 bean。
@Service
public class RegisterBeansDynamically implements BeanFactoryAware {
private ConfigurableBeanFactory beanFactory;
public <T> void registerBean(String beanName, T bean) {
beanFactory.registerSingleton(beanName, bean);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = (ConfigurableBeanFactory) beanFactory;
}
}
但请记住:必须刷新您的上下文,使其他 bean 能够自动注入您的新 bean,否则它们必须从应用程序上下文动态访问它们。
BeanFactory 也可以通过应用程序上下文直接访问,请参阅此答案。
您应该使用@bean 和类使用@configuration 注释方法,请参阅文档https://docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/ch02s02.html
@Bean
public static SSLContext getSSLContext() throws Exception {
TrustManager[] trustManagers = new TrustManager[] {
new ReloadableX509TrustManager(truststoreNewPath)
};
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustManagers, null);
return sslContext;
}
这是演示。
public class Demo implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
ConfigurableApplicationContext context = (ConfigurableApplicationContext)applicationContext;
DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory)context.getBeanFactory();
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(YourClass.class);
beanDefinitionBuilder.addPropertyValue("property1", "propertyValue");
beanDefinitionBuilder.addPropertyValue("property2", applicationContext.getBean(AnotherClass.class));
beanFactory.registerBeanDefinition("yourBeanName", beanDefinitionBuilder.getBeanDefinition());
}
}
您可以将注册部分移动到您的方法中(从BeanDefinitionBuilder
开始)。 我想这将满足您的需求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.