为了我自己的教育,我想构建一个简单的依赖注入(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/