当前位置: 首页 > news >正文

实现SpringBoot项目嵌入其他项目

很多时候我们需要在项目里面嵌入其他项目或者被其他项目嵌入,如我们开发一个开源项目b,用户需要在自己的项目a嵌入b项目,使用b项目的功能,而且要实现a项目工作最小化,最好实现引入即用。

1.定义b项目的自定义配置
        (1).将你的application.properties或yml配置文件改个名,如我改成了application-project.properties,这样做是为了b项目被a项目嵌入引用的时候,配置不会被覆盖和冲突。

        (2).既然改了名,就要让springboot知道你有这份配置,可以用@Configuration和@PropertySource注解。

        (3).将一些常用配置改成自定义名称配置,避免a项目引用时冲突覆盖,并且在配置文件中加载到springboot中,如我这里的数据库配置把前缀改成了自定义。

2.配置自动注册类,确保你的b项目的配置能在a项目中自动配置

        (1).引入spring boot自动配置包

      <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency>

        (2). 定义自动配置类,创建自动配置类:编写一个或多个配置类来定义项目 A 提供的服务、控制器以及 FreeMarker 配置等,让a项目在引用b项目的时候会自动加载这些配置,如我这里自定义了一些需要自动配置的组件。

import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.List;@Configuration
@Import(DataSourceConfig.class)
@ConditionalOnProperty(prefix = "project.datasource", name = "enabled", havingValue = "true", matchIfMissing = true)
@EnableConfigurationProperties(ProjectProperties.class)
@MapperScan(basePackages = "com.missyoubug.easyjtest.dao")
public class ProjectAutoConfiguration {@Bean(name = "bprojectSqlSessionFactory")public SqlSessionFactoryBean bprojectSqlSessionFactory(@Qualifier("projectDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(dataSource);sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml"));return sessionFactory;}@Beanpublic ContentNegotiatingViewResolver contentNegotiatingViewResolver(FreeMarkerViewResolver freeMarkerViewResolver) {ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();List<ViewResolver> viewResolvers = new ArrayList<>();viewResolvers.add(freeMarkerViewResolver);resolver.setViewResolvers(viewResolvers);return resolver;}@Beanpublic FreeMarkerViewResolver freeMarkerViewResolver() {FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();resolver.setPrefix("");resolver.setSuffix(".ftl");resolver.setContentType("text/html;charset=UTF-8");resolver.setOrder(0); // 设置最高优先级return resolver;}@Beanpublic FreeMarkerConfigurer freemarkerConfig() {FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();configurer.setTemplateLoaderPath("classpath:/templates/");return configurer;}
}
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "project.datasource")
public class ProjectProperties {private String url;private String driverClassName;private String username;private String password;// Getters and Setters
}

        (3).让Spring boot加载我们的自定义自动配置,创建 spring.factories 文件:在 src/main/resources/META-INF/ 目录下创建 spring.factories 文件,并在其中声明自动配置类。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.missyoubug.easyjtest.config.ProjectAutoConfiguration

3.配置maven打包

        (1).使用maven-compiler-plugin和maven-resources-plugin插件处理java源代码和静态资源打包,注意不要用spring-boot-maven-plugin打包。
        (2).在<resource>详细列明你需要打进去哪些资源(这里踩坑很久,开始以为只要有<directory>src/main/resources</directory>,就会把resources下的资源全打进去,然而并不是这样,需要详细列明)。


        (3).运行mvn clean install命令将b项目打成jar到本地maven仓库,或者是远程仓库。

 4.b项目类托管,a项目让springboot扫描到b项目的资源文件

(1) 写一个配置类,把b项目所有非静态的类都进行spring容器托管,否则a项目不知道要接管b项目的这些类

(2)让spring知道你托管的这些类,在spring.factortes中配置上面的bean托管类,这样b项目被a项目嵌入引用时就会自动加载托管这些类。

5.a项目引用及使用被嵌入的b项目
        (1).a项目maven引入b项目的maven坐标,如我这里:

        <dependency><groupId>com.missyouBUG</groupId><artifactId>Easy-JTest</artifactId><version>0.0.1-SNAPSHOT</version></dependency>

 

         (2)如此上,a项目就能完全嵌入b项目使用b项目的资源及功能,如还有问题可以打出a项目详细spring加载过程日志,看看有什么没有加载的在解决。

logging.level.org.springframework.boot.autoconfigure=DEBUG
logging.level.org.springframework.jdbc=DEBUGlogging.level.org.springframework.web=DEBUG
logging.level.org.springframework.boot.autoconfigure.web.servlet=DEBUG
#com替换成自己的路径
logging.level.com.missyoubug.easyjtest.config=DEBUG

这两天在搞一个帮助自测的开源项目,踩了这里的坑所以记录下,也希望各位开发者多发扬开源及写原创博客的优良传统,这样自己遇到问题,也最大可能的有前人写下的经验,大家都才能更快的解决,不要抄过去抄过来的,保持严谨的开发态度。

对照参考:开源Java快速自测工具,可以调用系统内任意一个方法-CSDN博客

相关文章:

实现SpringBoot项目嵌入其他项目

很多时候我们需要在项目里面嵌入其他项目或者被其他项目嵌入&#xff0c;如我们开发一个开源项目b&#xff0c;用户需要在自己的项目a嵌入b项目&#xff0c;使用b项目的功能&#xff0c;而且要实现a项目工作最小化&#xff0c;最好实现引入即用。 1.定义b项目的自定义配置 …...

朗致面试---IOS/安卓/Java/架构师

朗致面试---IOS/安卓/Java/架构师 一、面试概况二、总结三、算法题目参考答案 一、面试概况 一共三轮面试&#xff1a; 第一轮是逻辑行测&#xff0c;25道题目&#xff0c;类似于公务员考试题目&#xff0c;要求90分钟内完成。第二轮是技术面试&#xff0c;主要是做一些数据结…...

数字信号处理:FIR滤波器

FIR&#xff08;Finite Impulse Response&#xff0c;有限脉冲响应&#xff09;滤波器是一种数字滤波器&#xff0c;其输出信号是输入信号的加权线性组合。FIR滤波器以其线性相位特性和易于设计的优势&#xff0c;广泛应用于信号处理、通信、音频处理等领域。 FIR滤波器的特点…...

鲲鹏麒麟安装Kafka-v1.1.1

因项目需要在鲲鹏麒麟服务器上安装Kafka v1.1.1&#xff0c;因此这里将安装配置过程记录下来。 环境说明 # 查看系统相关详细信息 [roottest kafka_2.12-1.1.1]# uname -a Linux test.novalocal 4.19.148 #1 SMP Mon Oct 5 22:04:46 EDT 2020 aarch64 aarch64 aarch64 GNU/Li…...

群控系统服务端开发模式-应用开发-操作记录功能开发

一、开放路由 在根目录下route文件夹下修改app.php文件&#xff0c;代码如下&#xff1a; // 操作日志Route::get(token/get_list,permission.Token/getList);// 获取操作日志列表Route::post(token/get_all,permission.Token/getAll);// 获取操作日志所有数据Route::post(toke…...

昇思25天学习打卡营第33天|共赴算力时代

文章目录 一、平台简介二、深度学习模型2.1 处理数据集2.2 模型训练2.3 加载模型 三、共赴算力时代 一、平台简介 昇思大模型平台&#xff0c;就像是AI学习者和开发者的超级基地&#xff0c;这里不仅提供丰富的项目、模型和大模型体验&#xff0c;还有一大堆经典数据集任你挑。…...

Vue 让视图区域滑到指定位置、回到顶部

滑倒指定位置&#xff1a;获取指定的dom&#xff0c;然后用scrollIntoView使dom出现在视图区域 回到顶部&#xff1a;操作父级dom的scrollTop 0&#xff0c;让该父级下的列表回到顶部 代码如下 <template><div class"testDemo"><div><el-bu…...

EasyGBS点对点穿透P2P远程访问技术在安防视频监控中的应用

随着信息技术的快速发展&#xff0c;安防视频监控系统在公共安全领域的应用变得越来越广泛。传统的视频监控系统多依赖于中心服务器进行视频流的集中处理和分发&#xff0c;这不仅增加了网络带宽的负担&#xff0c;还可能成为系统性能瓶颈。为了解决这些问题&#xff0c;P2P&am…...

Android 使用 Gson + OkHttp 实现 API 的常规使用(个人心得)

学习笔记 一、依赖和权限的添加 网络权限: 在 Android 中进行网络请求时,必须声明权限,确保应用具有访问互联网的能力。 <uses-permission android:name="android.permission.INTERNET"/> 依赖项: 确保在 build.gradle 中添加以下依赖: dependencies …...

WPF+MVVM案例实战与特效(三十九)- 深度剖析一个弧形进度条的实现

文章目录 1、使用 Path 结合 ArcSegment 绘制圆弧1、属性解读2、静态圆弧3、动态圆弧4、运行效果5、圆弧两端点的形状2、总结1、使用 Path 结合 ArcSegment 绘制圆弧 1、属性解读 Path 是 WPF 中的一个标记元素,用于绘制复杂的几何路径形状,而 ArcSegment 用于描述 Path 中…...

opencv——图片矫正

图像矫正 图像矫正的原理是透视变换&#xff0c;下面来介绍一下透视变换的概念。 听名字有点熟&#xff0c;我们在图像旋转里接触过仿射变换&#xff0c;知道仿射变换是把一个二维坐标系转换到另一个二维坐标系的过程&#xff0c;转换过程坐标点的相对位置和属性不发生变换&a…...

前端核心知识总结

‌前端架构知识总结‌主要包括以下几个方面&#xff1a; ‌HTML‌&#xff1a;HTML是构建网页的基础&#xff0c;使用各种标签定义网页的结构&#xff0c;如<html>、<head>、<body>等。HTML5引入了新的语义化标签&#xff0c;如<article>、<section…...

【C语言】五子棋(c语言实现)

这里写目录标题 一、最终效果二、菜单打印函数三、棋盘的初始化和打印四、 人人对战4.1 落子判空函数4.2 悔棋函数4.3 判胜负函数4.4 人人对战 五、人机对战5.1 是将直接调用rand生成随机值&#xff0c;这就不可控5.2 是根据棋子赢面来判断哪里落子最好 六、如果选择退出程序直…...

【数据结构——查找】顺序查找(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;实现顺序查找的算法。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.根据输入数据建立顺序表&#xff0c;2.顺序表的输出&#xff0c;…...

Python的3D可视化库【vedo】2-1 (plotter模块) 绘制器的使用

文章目录 1 相关用语及其关系2 Plotter类的基本使用3 Plotter类具体的初始化设置3.1 全部初始化参数3.2 使用不同的axes vedo是Python实现的一个用于辅助科学研究的3D可视化库。 vedo的plotter模块封装了绘制器类Plotter。 Plotter实例可以用于显示3D图形对象、控制渲染器行为、…...

6.1 初探MapReduce

MapReduce是一种分布式计算框架&#xff0c;用于处理大规模数据集。其核心思想是“分而治之”&#xff0c;通过Map阶段将任务分解为多个简单任务并行处理&#xff0c;然后在Reduce阶段汇总结果。MapReduce编程模型包括Map和Reduce两个阶段&#xff0c;数据来源和结果存储通常在…...

【数模学习笔记】模糊综合评价

声明&#xff1a;以下笔记中的图片均来自“数学建模学习交流”清风老师的课程ppt&#xff0c;仅用作学习交流使用 模糊综合评价 文章目录 模糊综合评价模糊数学经典集合和模糊集合的基本概念经典集合和特征函数模糊集合和隶属函数模糊集合的分类 隶属函数的确定方法方法一 模糊…...

【C语言】库函数常见的陷阱与缺陷(四):内存内容操作函数[1]--memcmp

目录 一、功能与用法 1.1. 功能 1.2. 场景用法 二、陷阱与缺陷 2.1. 比较范围限制问题 2.2. 数据类型兼容性隐患 2.3. 其它 三、安全使用建议 四、代码示例 在 C 语言编程的世界里,内存内容操作函数宛如精密的工具,肩负着操控内存数据的重任。它们能灵活地复制、移动…...

jmeter CLI Mode 传参实现动态设置用户数

一.需求 CLI 运行模式下每次运行想要传入不同的用户数&#xff0c;比如寻找瓶颈值的场景&#xff0c;需要运行多次设置不同的用户数。 二.解决思路 查看官方API Apache JMeter - Users Manual: Getting Started api CLI Mode 一节中提到可以使用如下参数做属性的替换&#…...

数据库和SQL的基本概念

目录 定义数据分类非结构化数据&#xff1a;半结构化数据 :​ 结构化数据 : SQL(Structured Query Language)概念分类 数据库管理概念理解 定义 数据库(Database)是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库。 数据库是长期储存在计算机内、有组织的…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...