Guice如何填充带注释的字段

rya*_*dlf 5 java annotations dependency-injection guice

为了我自己的教育,我想构建一个简单的依赖注入框架,其功能类似于Google的Guice.因此,当加载类时,它会使用工厂类中的数据预填充带注释的字段.

我在编译时使用Reflections来扫描我的所有工厂类,并将这些类保存在静态列表中,以便在加载我的类时,我可以参考我的工厂,然后我可以扫描方法并返回相应的数据.

我坚持的地方是如何预先填充我的类注释字段,而不实际在实际的类中进行任何工作.换句话说,当加载类时,我需要能够确定是否有任何字段使用特定注释进行注释,如果是,则从工厂类中检索值.

是否有某种方法在加载之前对类执行反射,预先填充特定字段,然后返回要使用的类的实例?

我可以扩展所有需要依赖注入的类和一个完成所有这些工作的基类,但我认为必须有一个更好的方法,以便我可以简单地使用@Inject(或我决定使用的任何注释来说这个领域需要DI)并"神奇地"完成所有工作.

Mar*_*ers 5

Guice接近这个的方式是它只会填充由Guice 1 创建的实例的字段.在创建实例之后,注入器可以使用Reflection API查看其中的字段Class并检查其注释Field.getDeclaredAnnotations().

这也是为什么当您想要注入静态字段时,需要使用Binder.requestStaticInjection()填充静态字段的原因.

Guice不会简单地扫描您的代码以进行注释; 所有注射从显式请求(例如递归requestStaticInjection(),Injector.getInstance()等).现在,通常会在某些库代码中进行初始的显式请求.

例如,如果您正在使用,guice-servlet请让Guice使用serve().with()调用创建servlet的实例.但是如果你没有这样做,而是将你的servlet配置保留在你的中web.xml,那么Guice不会注入你的servlet.

1 - 您也可以使用请求显式注入Binder.requestInjection().