我知道有很多文章解释如何在Java EE中使用CDI,但我现在很难理解这实际上带来了什么优势。例如,假设我有一个类目前使用Foo的一个实例。我可以选择
Foo myFoo = new Foo();
或者// Better, FooFactory might return a mock object for testing
Foo myFoo = FooFactory.getFoo();
我不停地读到,使用CDI可以做到:
@Inject
Foo myFoo;
但是,为什么这比以前基于工厂的方法更好?我想可能还有其他用例我不知道,但我还没有能够确定它们。
如果我正确理解下面的回答,概念是依赖注入框架作为一个集中配置的主对象工厂。这是一个合理的解释吗?
更新
此后,我开始学习Spring,现在这个概念更加清晰了。以下段落摘自 Spring实战的一个例子,讲述了一个AccountService
类,该类又使用AccountDao
的实例。对于这个很长的引文,我表示歉意,但我认为它真正说明了为什么注入资源比标准初始化要好。
您可以使用new关键字构造AccountService,但是服务层对象的创建很少是如此简单的。 它们通常依赖于DAO、邮件发送器、SOAP代理等等。 您可以通过AccountService构造函数(或静态初始化)程序化地实例化每个依赖项,但这会导致硬性依赖和级联变化,因为它们被替换掉了。
此外,您可以在外部创建依赖项,并通过setter方法或构造函数参数设置它们。这样做会消除硬内部依赖项(只要它们在AccountService中通过接口声明),但您将在各处重复初始化代码。以下是如何使用Spring创建DAO并将其与AccountService连接的方法:
<bean id="accountDao" class="com.springinpractice.ch01.dao.jdbc.JdbcAccountDao"/>
<bean id="accountService"
class="com.springinpractice.ch01.service.AccountService">
<property name="accountDao" ref="accountDao"/>
</bean>
按照上面的配置,您的程序现在可以从Spring ApplicationContext请求AccountService
实例,Spring DI框架将负责实例化所有需要实例化的内容。