java - Guice 如何填充带注释的字段

标签 java dependency-injection annotations guice

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

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

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

有没有什么方法可以在加载类之前对其进行反射,预填充特定字段,然后返回该类的实例以供使用?

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

最佳答案

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

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

Guice 不会简单地扫描您的代码以获取注释;所有注入(inject)都从显式请求递归(例如 requestStaticInjection()Injector.getInstance() 等)。现在通常会在某些库代码中提出最初的、明确的请求。

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

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

关于java - Guice 如何填充带注释的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9568514/

相关文章:

java - Java注解的错误使用

javascript - @private 注释在 Google Closure JavaScript 代码中实际上做了什么?

java - 使用 gwt-test-utils 在测试用例中调用 native 函数会导致 UnsatisfiedLinkError

java - 传递国家/地区名称时获取所有州/地区/城市

java - 使用 Dagger 注入(inject)登录 session

c# - 如何使用 CaSTLe Windsor 通过 WPF 应用程序实现正确的 Di

java - 使用 setId 中的数据创建一个数组

java - 在 Windows 上连续删除早于 X 小时的文件的最有效方法是什么?

c# - .Net 核心依赖注入(inject) IdbConnection

java - Spring 3 注释配置选择@Configuration 和@Component 但不是@Controller