gpt4 book ai didi

java - 是否可以在 Dagger 和 CDI 之间共享通用的 JSR 330 代码?

转载 作者:行者123 更新时间:2023-11-30 06:23:01 25 4
gpt4 key购买 nike

我是 Agorava 的技术主管,一个有助于使用社交网络数据的框架。

如今,Agorava 构建在 CDI 之上,以简化其在 Java EE 堆栈中的使用,但我们希望提供一个带有 Dagger 的实现,以获得适用于 Android 的更轻量级解决方案。

我的问题是:我们可以在 CDI 和 Dagger 实现之间共享通用的 JSR 330 兼容代码吗?换句话说,Dagger 是否有可能在带有 JSR 330 注释的 jar 中编译代码,并在 Dagger 特定的 Jar 中扩展或使用此代码的源代码(使用 @Provides@Modules 和其他 Dagger 特定项目)?

如果答案是否定的,使用 Dagger 编译器编译我的通用 JSR 330 jar 并在我的 CDI 实现中使用它是否有任何问题?更准确地说,@Inject、限定符和其他 JSR 330 细节在运行时仍然可用,并且带有这些注释代码的类是否会被 Dagger 编译器保持不变?最后,Dagger 生成的代码(类名、注释)上是否有一种跟踪器可以让 CDI 检测到它并忽略它?

最佳答案

您可以在 Dagger 和任何其他 JSR-330 实现之间共享客户端代码,只要您的代码不实现与 Dagger 不兼容的行为。例如,Dagger 1.0 不支持方法注入(inject)。 Dagger 2.0 使用组件接口(interface)而不是注入(inject)器,因此您的代码不必关心这一点。

@Inject 和其他 JSR-330 API 元素仍将在运行时出现。 Dagger 不会在运行时访问它们,而是在编译时创建生成的代码以在运行时解释这些注释。但是这些类对于任何 JSR-330 应用程序仍然是有效的符合 JSR-330 的可注入(inject)类。

可能有问题的是 Dagger 会生成这些额外的类,您必须对 jar 进行后处理,或者重新配置您的构建系统以去除生成的代码,并将它们移动到补充 jar。但这是一个构建系统配置问题,dagger 对其不可知,只要生成的代码在运行时在使用 dagger 的应用程序中可用。

一个构建时选项是使用 -proc:none 运行编译器,在第二个配置中使用 -proc:only,并将后者的输出通过管道传输到另一个输出文件夹,并将其打包。这可以在 maven 中通过执行不同的 maven-compiler-plugin 来完成。

Dagger 生成的类应该都带有 @Generated(即将推出),但也都来自 dagger.internal.ModuleAdapter、dagger.internal.Binding 或 dagger.internal.StaticInjection。这些的子类都可以被非 Dagger 框架安全地忽略。事实上,他们可以亲守着走。

关于java - 是否可以在 Dagger 和 CDI 之间共享通用的 JSR 330 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18636579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com