Dagger 2 生成代码中 proxyProvide 的用途

2023-12-25

我有这个 Dagger 模块。我想了解生成的代码,以便我可以验证我的 Dagger 配置是否最佳。

@Module
public class TypefaceModule {

    @Provides @Singleton @Named("Roboto Light")
    static Typeface provideRobotoLight(AssetManager assets) {
        return Typeface.createFromAsset(assets, "fonts/Roboto-Light.ttf");
    }

}

这是生成的代码(Dagger 2.14.1):

public final class TypefaceModule_ProvideRobotoLightFactory implements Factory<Typeface> {
  private final Provider<AssetManager> assetsProvider;

  public TypefaceModule_ProvideRobotoLightFactory(Provider<AssetManager> assetsProvider) {
    this.assetsProvider = assetsProvider;
  }

  @Override
  public Typeface get() {
    return Preconditions.checkNotNull(
        TypefaceModule.provideRobotoLight(assetsProvider.get()),
        "Cannot return null from a non-@Nullable @Provides method");
  }

  public static TypefaceModule_ProvideRobotoLightFactory create(
      Provider<AssetManager> assetsProvider) {
    return new TypefaceModule_ProvideRobotoLightFactory(assetsProvider);
  }

  public static Typeface proxyProvideRobotoLight(AssetManager assets) {
    return Preconditions.checkNotNull(
        TypefaceModule.provideRobotoLight(assets),
        "Cannot return null from a non-@Nullable @Provides method");
  }
}

有两个函数几乎做同样的事情:实例方法get(),以及静态方法proxyProvideRobotoLight().

为什么 Dagger 生成了该代码的两个版本,它们都调用了模块的provide()静态方法?一个人不能打电话给另一个人吗?

(顺便说一句,我确实意识到我不再需要在我的应用程序资源中捆绑字体。这不是这里的问题。)


首先:Dagger 提前生成此代码,以便在模块化构建中获得更好的构建性能。正因为如此,我们不知道which(或两者,或两者都不需要),因此我们生成两者以防万一,并假设 Proguard 将能够删除任何未使用的内容。

那么两者实际上在做什么呢?

第一个(get()方法)在该工厂表示的绑定被请求为Provider<T>。这可以直接发生,也可以在绑定范围内发生,或者在其他一些情况下发生。

第二种情况就是我们所说的inlining。假设你有一个@Provides模块中的方法,并且您的上有一个方法@Component返回该类型。最理想的生成代码类似于:

@Override
public YourBinding y() {
  return YourModule.yourProvidesMethod();
}

问题是,提供的方法可能无法从与组件相同的包中访问,因此我们生成这个“代理”方法,为 Dagger 提供正确的可访问性。它还可以访问该方法的所有参数,将它们擦除Object如果需要的话。如果它们确实被删除了(将其视为泛型类型删除),我们需要将强制转换插入到正确的类型inside代理方法。

The Provider.get()实现不需要这样,因为在那里,所有类型都应该可以由调用它的代码访问。

总而言之,我们想要生成两个版本,希望您应该只使用一个版本,而 Proguard 应该清理另一个版本。

希望有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dagger 2 生成代码中 proxyProvide 的用途 的相关文章

随机推荐

  • 在 Cuda 中减少任意数量的元素

    如何实现以下链接中给出的代码的版本 7 http www cuvilib com Reduction pdf http www cuvilib com Reduction pdf对于大小为任意数字 即不是 2 的幂 的输入数组 版本 7 已
  • gdb 退出而不是生成 shell

    我正在尝试利用 SUID 程序 该计划是 include
  • 如何设置SQL Server / IIS 7.0以允许ASP.NET MVC网站访问数据库?

    我已经构建了一个 ASP NET MVC 2 网站 并使用 IIS 7 0 通过 Rackspace 云服务器托管该网站 当我尝试在服务器上使用 IIS 7 0 测试 localhost 下的网站时 出现错误页面 这来自 SQL 日志 我使
  • java fx 的 webview 中的 JSException?

    我的 java Fx webview 抛出以下代码的 JS 异常 谁能解释一下为什么 WebView webview new WebView WebEngine webengine webview getEngine newtab setT
  • Angular MatTableDataSource 错误

    我收到这样的错误 ts Company 类型的参数不可分配给类型的参数 公司 公司 类型中缺少属性 包括 当我想将数组对象插入 MatTableDataSource 时 这是我的 TypeScript 文件 import Component
  • 如何从 Github(企业)获取我本地没有的提交?

    我不小心做了一个push force在错误的存储库上 打开太多终端 有效地将主分支重置回较早的提交 查看我的构建系统 我可以看到提交曾经指向 XYZ 但是我在本地没有该提交 因为我最近没有进行拉取或获取 该存储库位于 Github 中 我可
  • 在 Mac M1 中安装 pod 时出现“LoadError -dlopen...”

    我有 Mac M1 在使用时遇到以下错误pod install在 iOS 中构建 flutter 项目 我已经安装了 homebrew 使用卸载 安装cocoapodssudo arch x86 64 gem install cocoapo
  • jQuery 如何完成命令链接?

    我认为自己 充其量 是一个中级 JavaScript 人员 当然 我想了解一些事情是如何完成的 这样我就可以编写更好的代码 因此 我一直在研究 jQuery 的底层 试图更多地了解它是如何完成某些事情的 例如 jQuery 通过执行以下操作
  • a4j:ajax 不会渲染 h:panelgrid

    这是代码
  • 使用 Application 对象存储数据和全局变量

    在 Xamarin 中 我想使用 Application 对象存储数据和全局变量 我查看了此资源中的代码 http www helloandroid com tutorials maintaining global application
  • 运行 selenium IDE 脚本时用户手动输入

    用户可以在运行 selenium IDE 脚本时手动输入吗 对于前 如果有名称字段 那么我们是否可以在每次脚本运行时打开输入框 以便用户可以为名称字段提供输入 让我知道是否可能 如果是 请建议我一个解决方案 提前致谢 您可以使用以下脚本调用
  • 在 ORMLite 中持久化 HashMap

    我在我的 Android 应用程序中使用 ORMLite 我需要持久化这个类 它有一个 HashMap 有什么好的方法可以坚持呢 这是我第一次尝试持久化 HashMap 也是第一次使用 ORMLite 所以任何建议将不胜感激 Edit 如果
  • 将附加参数传递给 Javascript 回调函数[重复]

    这个问题在这里已经有答案了 我需要监视 Node JS 应用程序中的少量目录 function updated event filename log CHANGED t share channels filename for i in ch
  • 如何克服对 ASP.Net MVC 标记中 <% %> 的恐惧?

    所以我完全相信 ASP NET 的基本原则 可测试性 SoC HTML 控制 这太棒了 然而 作为新手 我对标记有很大的困扰 我知道这来自于我对经典 ASP 的厌恶 当我我看到这个 http www flickr com photos we
  • 如何将自定义数据传递到模板

    一般来说 我对 OOP 框架很陌生 尤其是 Silverstripe 我确信我错过了一些重要的东西 我目前正在尝试为我的主页创建一个 Twitter feed 在我的 Page controller 中我有 public function
  • Maven使用SSH将本地文件复制到远程服务器

    Maven可以使用SSH将本地文件复制到远程服务器吗 我想在 Maven 配置文件中指定位置 并在每次执行部署阶段时将该文件 或多个文件 复制到服务器 maven deploy plugin 允许您配置部署阶段以使用 scp 部署到服务器
  • Jaxb 在解组时忽略命名空间

    我使用 Jaxb2 和 Spring 我正在尝试解组我的 2 个客户发送的一些 XML 到目前为止 我只需要处理一位发送了如下 xml 的客户
  • java web 应用程序分析器就像这样

    阅读一篇文章http code google com p mvc mini profiler http code google com p mvc mini profiler 有没有像这样适用于 Java Web 应用程序的开源分析器 有人
  • 如何从 NetBeans 运行所有 JUnit 测试用例?

    我已经创建了几个文件 其中包含对 NetBeans 项目中现有类的单元测试 我使用菜单 文件 新文件 JUnit 测试现有类 来创建测试文件 我可以通过右键单击一个文件并选择 运行文件 来运行一个带有单元测试的文件 但我想通过单元测试运行所
  • Dagger 2 生成代码中 proxyProvide 的用途

    我有这个 Dagger 模块 我想了解生成的代码 以便我可以验证我的 Dagger 配置是否最佳 Module public class TypefaceModule Provides Singleton Named Roboto Ligh