【问题标题】:Dependency Injection With Annotations带注解的依赖注入
【发布时间】:2023-03-09 07:37:01
【问题描述】:

我想基于 Java 注释构建自己的自定义 DI 框架,我需要一些指导才能开始。我知道使用 guice 或 spring 等众多优秀框架之一会更容易,但出于我自己的好奇心,我想构建自己的。

我对注释不是很熟悉,所以我在寻找资源时遇到了一些麻烦,并且非常感谢有人能说明我需要采取的一些步骤。

如前所述,id 喜欢采用工厂方法并以某种方式使用@Resource 或@Injectable 类型注释标记我的getter,然后在我的业务类中能够使用@Inject 注释设置我的变量依赖项并拥有资源自动可用。

有没有人可以传递任何类型的资源来帮助我理解基于注释标记方法的过程,然后根据注释从单独的类中检索值。我只需要一个小方向,让我开始。当然,一旦我开始工作,我很乐意在这里发布一个小代码示例,当然是为了其他人未来的阅读。

编辑

我用来整理这些的资源:

Java Reflection: Annotations

How to find annotations in a given package: Stack Overflow ?

Scanning Annotations at Runtime

我实际上还没有写完,但基本任务列表如下(对于将来可能有兴趣做类似事情的人)

  1. 在类运行时扫描所有@Inject 字段并获取对象类型。

  2. 扫描所有类(或只是特定的类包(我没有 尚未决定))用于带注释的方法@InjectableResource。

  3. 循环所有带注释的方法并找到返回的方法 我正在寻找的对象类型。

  4. 运行方法,获取依赖。

还需要注意的是,在扫描所有类时,我将使用一个名为 Javassist 的库。基本上这样做是允许我在不实际加载类的情况下读取每个类的字节码信息。所以我可以读取注释字符串而不会造成严重的内存问题。

【问题讨论】:

  • 你可以从标准的Oracle Annotation Trail开始。您将需要某种方式来扫描整个类路径以查找资源,其中一种方式是使用像 Google Reflections 这样的工具。最后,您将需要一些操作类的方法,例如使用Javassist

标签: java dependency-injection annotations


【解决方案1】:

有趣的是,您想构建自己的。我喜欢 Google Guice - 它让代码变得如此优雅和简单。

我使用过this guide,在此之前我发现它对于了解注释以及如何将它们从类和方法中提取出来非常有用。

您必须使用@interface 定义您自己的注解。然后你必须定义某种类来进行绑定,例如您在这个具体类中看到一个接口绑定。最后,您将需要一些逻辑来完全提取它,例如遍历每个类,找到每个注解,然后找到合适的绑定。

考虑通过反射和单例进行延迟实例化等事情。例如,Guice 允许您使用单例,因此您只使用具体类的一个实例,或者您可以每次绑定一个新版本。

祝你好运!

【讨论】:

  • 到目前为止的建议很好。您链接的资源很有帮助。关于如何将方法(在我的情况下创建资源的getter)实际绑定到注释的任何见解?我知道如何创建自定义注释并在该注释中设置访问变量,但是如何让@Inject 将我指向工厂类和特定方法?
  • 我还没有建立自己的依赖注入框架,所以我的方法就是去了解 Guice 是如何做到的。您将需要一个带有接口、注释和具体类的绑定方法。 Guice 这样做的方法是拥有一个 AbstractModule,它由定义所有绑定的用户定义的具体模块实例化。见这里:code.google.com/p/google-guice/wiki/BindingAnnotations
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 2012-04-25
  • 1970-01-01
  • 2010-11-23
  • 2019-11-03
  • 1970-01-01
  • 2011-09-15
相关资源
最近更新 更多