SpringBoot 项目 JNI 接口无法注入Bean

问题描述:在SpringBoot项目中,需要用到JNI接口调用一段由 C++写的高性能模块,该模块在执行过程中,需要回调 Java 层的某个业务服务Bean,去注入这些业务Bean的时候报错,空指针注入失败。

原因分析:加载顺序问题。

JNI库加载时机:在 SpringBoot 应用启动时通过System.loadLibrary("xxx") 加载本地库,这个操作往往发生在main方法或某个@Configuration类的静态块中,一旦加载完成,C++代码就可能立即注册回调函数,并在后续被触发。

Spring Bean 的生命周期:Spring 容器是在 SpringApplication.run() 之后才开始初始化 Bean 的,

即使JNI接口本身被标记为 @Component,它的依赖注入也只会在 Spring 上下文完全启动后才完成。

所以,JNI 回调可能在 Spring 容器尚未完成 Bean 注入前就被 C++代码触发。此时,JNI实例虽然存在,但其依赖字段尚未被 Spring填充,导致null引用。

解决方案:利用静态变量 + @PostConstruct 延迟绑定

  1. 将业务Bean以静态变量的形式缓存
  2. 利用@PostConstruct 注解,在 Spring完成依赖注入后,将注入的实例赋值给静态变量
  3. 在 JNI 回调方法中,统一使用该静态变量

代码如下:

java 复制代码
@Component
public class testProxy {

    @Resource
    private TestService testService;
    
    private static TestService staticTestService;

    @PostConstruct
    public void init() {
        staticTestService = testService;
    }
    
    public static void callbackEvent(String data) {
        staticTestService.doSomething(data);
    }
}
相关推荐
学长毕设5 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw6 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号7 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场7 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠7 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David8 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
外收内放8 小时前
Python基础语法练习题(73)
java·前端·python
Wang's Blog8 小时前
Java 项目实战: 交友项目 - 环信后台发送消息测试
java·交友
用户3721574261359 小时前
Java 操作 Word 脚注和尾注:添加、读取与删除
java
小嘉丶学长9 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节