SpringBoot开启多端口探究--基于多ApplicationContext

文章目录

  • 前情提要
  • 一、思路概要
  • 二、具体实现
  • 三、其他问题
    • 父子关系
    • 部分依赖
  • 总结


前情提要

前面探讨了management端口开启,grpc端口开启,本文继续探讨在SpringApplication中开启多个端口的方式之多ApplicationContext, 相比management端口基于多WebServer实例, 多ApplicationContext的颗粒度更大,也会略显粗暴,优点是简单。

一、思路概要

在一个JVM进程中创建两个ApplicationContext各自玩自己的,互不影响,只要两个ApplicationContext share基础的SpringBoot库即可,最终效果大约是下面这个样子。
请添加图片描述

二、具体实现

首先建议以Config对象组织来组织各自的上下文, 一方面可以自定义预期上下文包含的类,以及必要的自定义配置。例子如下

@SpringBootApplication(scanBasePackageClasses = {})
public class ViewContextConfig {@Beanpublic xxx newBeanInstance(){return xxx;}
}

其次,在某个入口函数处基于两个Config对象构造ApplicationContext

@Slf4j
public class ApplicationStarter {public static void main(String[] args) {ConfigurableApplicationContext first = SpringApplication.run(ViewContextConfig1.class, args);log.info("ApplicationContext1 started");ConfigurableApplicationContext second = SpringApplication.run(ViewContextConfig2.class, args);log.info("ApplicationContext2 started");}
}

三、其他问题

很多事情,原理可能无比简单,但能在工程中落地就是另外一个问题。今天的思路也是一样。接下来聊聊个人遇到的问题。比如父子关系,和部分对象依赖。

父子关系

伟大的Spring框架提供了这么个功能,childContext.setParent(parentContext); 在ApplicationContext初始化之前调用,childContext会在依赖注入时将parentContext中的对象作为候选项。

子容器结束,父容器不受影响。但父容器结束,子容器也会一并结束。

部分依赖

父子容器的声明周期,意味着子容器可以在父容器初始化之后,依赖其中的对象,但不构建父子关系。在子容器初始化完成后,再构造父子关系,从而解决部分依赖和生命周期问题。样例如下:

@Slf4j
public class ApplicationStarter {public static void main(String[] args) {ConfigurableApplicationContext parent = SpringApplication.run(ViewContextConfig1.class, args);log.info("ApplicationContext1 started");SpringApplication subApp = new SpringApplication(ViewContextConfig2.class);subApp.addInitializers((ctx) -> {ConfigurableListableBeanFactory beanFactory = ctx.getBeanFactory();beanFactory.registerSingleton(“beanName”, parent.getBean(XX.class));});ConfigurableApplicationContext child = subApp.run("--spring.profiles.active=XX");child.setParent(parent);log.info("ApplicationContext2 started");}
}

回过头来,以上问题的解决方案,可以在扫描解决,差别就是会创建多个对象,并且两者完全解耦合。此处,仅做解决方式的探讨。

总结

本文介绍了SpringBoot下基于多个ApplicationContext开启多端口,并介绍了父子容器的声明周期和依赖关系问题,为读者解决问题提供参考,感谢你的阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1527628.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频)

这是什么系统? 资源获取方式在最下方 java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频) 停车管理信息系统是为了提升停车场的运营效率和管理水平而设计的综合性平台。系统涵盖用户信息管理、车位管理、收费管理、违规车辆处理等多个功能…

基于Spring Boot的火车订票管理系统

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:JAVA语言 Spring Boot框架 工具:IDEA/Eclipse、Navicat、Tomcat 系统展示 首页 管理…

【动手学深度学习】05 线性代数(个人向笔记)

1. 线性代数 向量的一些公式 ∣ ∣ a ∣ ∣ ||a|| ∣∣a∣∣ 表示向量 a 的范数,课上没有讲范数的概念 其中第一条为求向量的二范数 第四条表示如果a为标量,那么向量 ∣ ∣ a ⋅ b ∣ ∣ ||ab|| ∣∣a⋅b∣∣ 的长度等于 ∣ a ∣ ⋅ ∣ ∣ b ∣ ∣…

Ifream实现微前端效果

记得有人曾问过我,老旧的项目内容很多,项目卡,想要改造成类似微前端,领导想要快速,又不想系统重构、而且是不同子系统的协同,要怎么做?对方不想做太大的改造,所以想用ifream的方式动…

编程效率飙升的秘密武器:Cursor编辑器的AI革命

有没有想过,写代码这件事其实可以更加轻松、高效?尤其是对于那些需要频繁修正、调试和优化的开发者们,Cursor编辑器带来的AI赋能,简直让人眼前一亮。相信很多人一提到AI,第一反应就是:“这真的靠谱吗?”今天,我就带你来揭开Cursor这款AI编辑器的神秘面纱,看看它是如何…

【Shiro】Shiro 的学习教程(二)之认证、授权源码分析

目录 1、背景2、相关类图3、解析3.1、加载、解析阶段3.2、认证阶段3.3、授权阶段 1、背景 继上节代码,通过 debug 进行 shiro 源码分析。 2、相关类图 debug 之前,先了解下一些类的结构图: ①:SecurityManager:安全…

AIGC简化文件管理:Python自动重命名Word和PDF文件

1.背景 大家应该也有遇到,自己电脑有很多文件命名不合理的文件,比如:文件1、想法3 ,当你长时间再看到这个文件的时候,已经很难知道文件内容。 今天我们将借助AIGC的编码能力,帮我们生成一个批量改文件名的…

营养作用的对象是有区别的 第八篇

除了7大营养素 还需要补充其他营养素 食品营养学 临床营养学 大众营养学 食品营养学 你要早点就开始预防

【超级干货】2天速成PyTorch深度学习入门教程,缓解研究生焦虑

3、cnn基础 卷积神经网络 输入层 —输入图片矩阵 输入层一般是 RGB 图像或单通道的灰度图像,图片像素值在[0,255],可以用矩阵表示图片卷积层 —特征提取 人通过特征进行图像识别,根据左图直的笔画判断X,右图曲的笔画判断圆 卷积操作 激活层 —加强特征 池化层 —压缩数据…

qt多线程的两种方法run和movetothread

qt多线程的有什么用? 将耗时长的操作丢入专属线程执行,这样就不会影响主线程的界面操作,操作完再用信号槽等的方式返回结果 1.界面和部件相关都必须在主界面运行,不要用子线程调用或者操作,会引起奇怪的bug&#xff…

【Python 千题 —— 算法篇】字符统计

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目背景 在编程中,对字符串的字符统计是一个常见任务。这在文本处理、数据分析、词频统计、自然语言处理等领域有广泛应用。无论…

AI周报(9.1-9.7)

AI应用-Tidal 引领海洋养殖革命 Tidal团队,一个源自Alphabet X的创新项目,今年七月顺利从X实验室毕业,成为一家独立的公司。Tidal正在通过人工智能技术改变海洋养殖,特别是鲑鱼养殖。Tidal的总部位于挪威特隆赫姆,他们…

微信小程序和公众号的区别

微信小程序和公众号都是基于微信平台的两种不同应用形态,它们在展现形式、主要功能以及技术要求等方面存在显著区别。具体分析如下: 微信小程序和公众号的区别 展现形式 小程序:类似于APP的应用体验,用户可以通过扫一扫或者搜索…

数据结构——单链表实现和注释浅解

关于单链表的基础部分增删查改的实现和一点理解&#xff0c;写在注释里~ SList.h #pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h>//定义节点的结构 //数据 指向下一个节点的指针 typedef int SLTDataType;typedef struct SListNo…

如何限制与管控员工上网行为?五个管控方法让员工效率倍增!

在现代企业中&#xff0c;互联网是工作中不可或缺的工具&#xff0c;但与此同时&#xff0c;员工在工作时间浏览与工作无关的网站、进行网络娱乐等行为&#xff0c;也成为了影响企业生产力和效率的主要因素之一。如何有效限制和管控员工的上网行为&#xff0c;从而提升工作效率…

解决ubuntu系统无法与FinalShell无法连接问题

问题 解决方案 先下载ubuntu网络工具 sudo apt install net-tools输入密码 下载完成后进入管理员模式查看密码 sudo -ihostname -I查看IP 得到ip地址后再继续安装 openssh-server 插件 sudo apt-get install openssh-server问题解决 尝试连接FinalShell

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中&#xff0c;不同电脑的配置和操作系统&#xff08;如Win11与Win7&#xff09;可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行&#xff0c;需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下&a…

每日OJ_牛客_骆驼命名法(递归深搜)

目录 牛客_骆驼命名法&#xff08;简单模拟&#xff09; 解析代码 牛客_骆驼命名法&#xff08;简单模拟&#xff09; 骆驼命名法__牛客网 解析代码 首先一个字符一个字符的读取内容&#xff1a; 遇到 _ 就直接跳过。如果上一个字符是 _ 则下一个字符转大写字母。 #inclu…

从0开始深度学习(4)——线性回归概念

1 线性回归 回归&#xff08;regression&#xff09;指能为一个或多个自变量与因变量之间的关系进行建模。 1.1 线性模型 线性假设是指目标可以表示为特征的加权和&#xff0c;以房价和面积、房龄为例&#xff0c;可以有下面的式子&#xff1a; w称为权重&#xff08;weigh…

Centos7.9部署Gitlab-ce-16.9

一、环境信息 软件/系统名称版本下载地址备注Centos77.9.2009https://mirrors.nju.edu.cn/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.isogitlab-cegitlab-ce-16.9.1https://mirror.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-16.9.1-ce.0.el7.x86_64.rpm…