java - 我们如何在春季刷新 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;
}
}
解决方案
在刷新期间,春季会发生以下情况:
它扫描配置的所有“资源”(XML、java @Config 文件、用 @Component 注释的类及其派生类等等)并创建 Bean 定义,它是每个 bean 的元数据。注意,bean 定义是一个元对象,它不是 bean 对象本身。
调用称为“BeanFactoryPostProcessor”-s 的钩子。这些允许更改 bean 定义注册表 - 一个聚合步骤中解析的所有“信息”的对象
初始化 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");
}
}
}
推荐阅读
- go - 使用 Golang 客户端库对 GCP Compute 的批量请求
- php - Apache 无法在 Mojave 上加载 PHP 扩展
- javascript - 使用 node-sass 编译 CSS 时格式无效
- javascript - 检查当前时间是否在 Javascript 中通过 AM/PM
- python - python中的Horner规则和直接方法
- python-3.x - 如何在没有检查功能的情况下从网页中抓取数据?
- node.js - 当您有两条不同的主要路线时,如何在 ejs 文件中加载资产?
- javascript - 用于删除 Google 表格的书签
- c - 从位操作创建条件
- android - 带 FCM 的 WakefulBroadcastReceiver