为了我自己的教育,我想构建一个简单的依赖注入框架,其功能类似于Google的Guice。因此,当加载类时,它会使用工厂类中的数据预填充带注释的字段。
我正在使用Reflections在编译时扫描我的所有工厂类并将这些类保存在静态列表中,以便在加载我的类时,我有一个对我的工厂的引用,然后我可以扫描方法并返回适当的数据。
我坚持的地方是如何预先填充我的类注释字段而不实际执行实际类中的任何工作。换句话说,当一个类被加载时,我需要能够确定是否有任何字段使用特定注释进行注释,如果是,则从工厂类中检索该值。
是否有某种方法在加载之前对类执行反射,预先填充特定字段,然后返回要使用的类的实例?
我可以扩展所有需要依赖注入的类,并使用一个完成所有这些工作的基类,但我认为必须有一个更好的方法,以便我可以简单地使用@Inject(或我决定使用的任何注释)用来说这个领域需要DI)并“神奇地”完成所有的工作。
答案 0 :(得分: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()
请求显式注入。