【问题标题】:How does Guice Populate Annotated FieldsGuice 如何填充带注释的字段
【发布时间】:2012-03-05 14:41:51
【问题描述】:

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

我正在使用反射在编译时扫描我的所有工厂类并将这些类保存在静态列表中,以便在加载我的类时,我有一个对我的工厂的引用,然后我可以扫描方法并返回适当的数据。

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

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

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

【问题讨论】:

标签: java dependency-injection annotations guice


【解决方案1】:

Guice 解决这个问题的方式是,它只会填充由 Guice 创建的实例的字段1。注入器在创建实例后,可以使用反射 API 查看Class 的字段并使用Field.getDeclaredAnnotations() 检查它们的注释。

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

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

例如,如果您使用guice-servlet,则让Guice 通过使用serve().with() 调用来创建您的servlet 实例。但是如果你不这样做,而是将你的 servlet 配置留在你的 web.xml 中,Guice 就不会注入到你的 servlet 中。

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

【讨论】:

  • 所以目前我使用一个在我的 servlet 配置类中定义的注入器对象(我自己的,我只是想复制一个最小版本的 Guice 作为学习体验)。它使用反射扫描所有标记为工厂的类,并将这些类存储在静态变量中。然后我会定义像 String testString = Injector.getDependencyInstance("testString") 这样的变量吗?
  • 不,您可以使用 Field.set() 设置值
猜你喜欢
  • 2016-07-19
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 2023-03-16
  • 2013-11-13
相关资源
最近更新 更多