知识卡片
Java SPI机制实现可插拔扩展
内容
Service Provider Interface(SPI)是一种把服务接口和服务的具体实现彻底解耦的机制:调用方只依赖一个接口,不在代码里写死具体用哪个实现类,而是在资源目录下放一个约定路径的文件(如META-INF/services/下以接口全限定名命名的文件),文件内容写明具体实现类的全限定名;运行时框架会自动扫描这个约定路径,读出里面写的类名,通过反射加载并实例化,从而找到真正要用的实现。Flink自定义外部连接器(如自定义TableSink)正是靠这套机制被框架发现的:开发者只需要按约定放好这个注册文件,无需修改框架源码或在代码里显式注册,新增一种连接器实现就相当于新增一个独立的、可拔插的模块。这是”约定优于配置”思路的一个具体应用:牺牲一点点隐式性(不容易一眼看出运行时到底加载了哪个实现),换来对扩展开放、对已有代码修改关闭的能力。
参考来源
《Flink入门与实战》第10章《Flink项目实战》