本文由 Qwen3 Max 翻译,原文:https://jerrydata.dev/2024/02/07/dependency-injection-in-flink/
TL;DR
使用 Guice 构建依赖图:
1 | public class DatabaseModule extends AbstractModule { |
创建单例注入器:
1 | public class AppInjector { |
在 Flink 函数中使用:
1 | public class UserMapper extends RichMapFunction<Long, User> { |
动机
依赖注入(Dependency Injection,简称 DI)是 Java 编程中的常见实践,尤其当你有 Spring 背景时更是如此。最直接的好处是可测试性,即你可以用测试桩(stub)替换类的实现。其他好处还包括关注点分离、更好的类层次结构、控制反转等。组件通过类构造函数或带注解的成员声明其依赖,而 DI 框架则创建一个容器(或上下文)来正确地连接这些组件。该上下文通常在应用启动时创建,并贯穿整个应用生命周期。一些例子包括 Spring 的 ApplicationContext 和 Guice 的 Injector。
Flink 是一个分布式计算框架,通过依赖注入将业务逻辑与框架解耦是有利的。然而,Flink 应用由函数式类组成,这些类在驱动类(即 main 方法)中实例化、序列化后发送到分布式任务管理器。除非我们所有的组件都是可序列化的,否则无法将依赖注入到这些类中。幸运的是,Flink 提供了一个生命周期钩子 open,它在作业启动时被调用。结合另一种常见模式——单例模式,我们可以让 DI 框架与 Flink 良好协作。




