我正在努力了解依赖注射。
我阅读了很多文章但是,我读的越多,我就越感到困惑。
所以,我所做的是尝试理解the Google Guice page上发布的一些源代码。
我知道我们必须创建一个模块(例如:BillingModule
),其中接口与其实现之间的绑定已经完成:
bind(BillingService.class).to(RealBillingService.class);
在实现类中,我们必须inject
构造函数。
问题在于我无法理解the field injection:
@Inject Connection connection;
问题很简单:这是什么意思?
答案 0 :(得分:4)
这意味着您不像通常那样实例化对象:
Connection connection = //someConstructor
但你宁愿通过其他方式获得它。该
@Inject
注释定义了注入点,您希望应用程序服务器根据配置为您实例化Connection对象。基本上这意味着您可以解除实例化Connection对象的复杂性,并且只能处理功能。
当然,如果您的应用程序服务器不支持字段注入或由于某种原因它失败,则@Inject注释不会有任何意义,您将最终得到一个空连接对象。
答案 1 :(得分:1)
注释Injector应注入值的实现类(构造函数,方法和字段)的成员。注射器满足以下注射要求:
它构造的每个实例。正在建造的班级必须具备
它的一个构造函数标有@Inject
或必须有一个
构造函数不带参数。然后注射器继续进行
执行方法和现场注射。
传递给injectMembers(Object)
的预构建实例,
toInstance(Object)
和toProvider(Provider)
。在这种情况下全部
当然,构造函数被忽略了。
requestStaticInjection(Class...)
。在所有情况下,无论Java访问说明符(私有,默认,受保护,公共)如何,都可以注入成员。