2012-03-03 387 views
6

我想构建自己的基于Java注释的自定义DI框架,我需要一个小小的方向开始。我知道使用诸如guice或spring之类的许多精彩框架中的一个会容易得多,但为了我自己的好奇心,我想构建自己的框架。依赖注入与注解

我对注释不是很熟悉,所以我在查找资源时遇到了一些问题,并且非常感谢某人解释了我需要采取的一些步骤来开始。

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

有没有人有任何资源可以传递,以帮助我理解基于注释标记方法的过程,然后从基于注释的单独类中检索值。我需要一个小小的方向,让我开始。当然,一旦我走了,我会很高兴在这里发布一些代码示例,为了其他人今后的阅读。

编辑

我使用的资源放在了一起:

Java Reflection: Annotations

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

Scanning Annotations at Runtime

我还没有真正完成还没有写这个,但基本任务李ST将是如下(的人谁可能有兴趣做,今后类似的东西)

  1. 在类运行时扫描所有@Inject领域,并得到对象类型。

  2. 对注释方法@InjectableResource扫描所有类(或只是一个特定的类包(我还没有确定 )))。

  3. 循环所有带注释的方法,并找到返回我要查找的对象类型的 方法。

  4. 运行该方法并获得依赖关系。

注意到在扫描所有类时我将使用一个名为Javassist的库也会很有帮助。基本上,这样做可以让我在不实际加载类的情况下读取每个类的字节码信息。所以我可以读取注释字符串而不会产生严重的内存问题。

+0

可以与标准甲骨文注释步道】开始(http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html)。您需要一些方法来扫描整个类路径中的资源,一种方式是使用像[Google Reflections](http://code.google.com/p/reflections/)这样的工具。最后,您将需要一些操作类的方法,例如[Javassist](http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/)。 – Perception 2012-03-03 17:18:10

回答

0

有趣的是,你想建立自己的。我爱谷歌Guice - 它使代码如此优雅和简单。

我已经使用this guide之前我发现它对于了解注释以及如何将它们从类和方法中拉出来非常有用。

您将不得不使用@interface定义您自己的注释。那么你将不得不定义一些类来进行绑定,例如你可以在这个具体的类中看到一个接口绑定。最后,您需要一些逻辑来将其完全拉回,例如遍历每个类,找到每个注释,然后找到合适的绑定。

考虑通过Reflections和singletons进行懒惰实例化等操作。例如,Guice允许你使用单例,所以你只能使用具体类的一个实例,或者你可以每次绑定一个新的版本。

祝你好运!

+0

迄今为止的重要建议。您链接的资源很有帮助。任何有关如何实际绑定一个方法(一个创建资源的getter,在我的案例中)到注释的见解?我得到了如何创建自定义注释并在该注释中设置访问变量,但是如何让@Inject指向工厂类和特定方法? – ryandlf 2012-03-03 17:27:30

+0

我还没有构建自己的依赖注入框架,所以我的方法只是去了解Guice如何实现它。您将需要一个绑定方法,它接受接口,注释和具体类。 Guice这样做的方法是创建一个AbstractModule,它由定义所有绑定的用户定义的具体模块实例化。请参阅此处:http://code.google.com/p/google-guice/wiki/BindingAnnotations – christophmccann 2012-03-03 17:32:15