java - google guice 内部是如何工作的

标签 java reflection dependency-injection guice

我正在浏览 google guice,然后我想到它可能如何工作。

这就是我关于 property injector 可能如何工作的理论。

Guice 首先要我们创建一个 injector 并将所有 binding 信息传递给它。

Injector injector = Guice.createInjector(new BillingModule());

*来自 google guice page 的代码片段

好的,此时我可以认为有一个类包含binding的所有信息。

当我们这样做的时候

injector.getInstance(RealBillingService.class);

我们来做这个技巧。

injector 将为真正的 RealBillingService 对象返回一个代理实例,当我们调用一个

RealBillingService 对象的方法,代理实例 调用处理程序使用反射

根据注入(inject)器创建过程中传递的信息找出要注入(inject)的属性并填充它。

问题

我想这就是 guice 的工作方式。如果我错了,'Guice' 实现它的实际方式是什么?

如果这是 guice 的工作方式,那么 Guice 总是返回 proxy 对象 并且用户代码总是调用 代理对象。这是真的吗?


我解释的图示

enter image description here

最佳答案

你的理解有点偏差。可以这样想:当您执行 Guice.createInjector(...) 时,就是 Guice 进行所有反射以找出什么取决于什么以及什么需要在哪里注入(inject)。当您执行 injector.getInstance(...) 时,Guice 不需要进行任何反射。它会立即创建 RealBillingService,注入(inject)它的所有(传递性)依赖项,并返回它(不是代理)。

如果您使用 Guice 的 AOP 功能,那么这些对象将是代理,否则 Guice 不会返回代理。它只是调用 @Inject 构造函数,设置 @Inject 注释的字段,调用 @Inject 注释的方法,然后返回该对象。

编辑:另见 MiniGuice ,类 Guice 注入(inject)器的单类实现。

关于java - google guice 内部是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21655720/

相关文章:

java - Spring Boot jdbcAuthentication dataSource 未加载错误

java - 在 Sockets 和 ServerSockets 之间发送和接收信息

java - 远程 OSGI 服务调用

c# - 如何让ServiceProvider对手动创建的对象调用Dispose?

c# - ASP.NET Core 中的 new Task 是如何利用依赖注入(inject)的?

java - 在 Spring 中注册 bean 的更好方法

java - Spring AMQP 手动容器异常缓慢

java - 在运行时动态构建java/scala方法体并执行

c# - Windows 8 应用程序中的反射

Java 反射,类对象