我知道有很多文章解释了如何在 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;
但为什么这比以前基于工厂的方法更好?我假设还有其他一些我不知道的用例,但我无法确定这一点。
如果我理解了下面的回答,那么这个概念就是 DI 框架充当集中配置的主对象工厂。这是一个合理的解释吗?
更新
从那以后我开始学习 Spring,现在这变得更有意义了。下面的段落取自Spring in Practice,以一个类为例,AccountService
该类又使用AccountDao
. 我为冗长的引用道歉,但我认为这确实是为什么注入的资源提供了超出标准初始化的东西的核心。
您可以使用 new 关键字构造 AccountService,但服务层对象的创建很少如此简单。它们通常依赖于 DAO、邮件发送者、SOAP 代理等等。您可以在 AccountService 构造函数中以编程方式(或通过静态初始化)实例化这些依赖项中的每一个,但这会导致硬依赖项和级联更改,因为它们被换出。
此外,您可以在外部创建依赖项,并通过 setter 方法或构造函数参数在 AccountService 上设置它们。这样做会消除硬的内部依赖关系(只要它们是通过接口在 AccountService 中声明的),但是您会到处重复初始化代码。以下是创建 DAO 并以 Spring 方式将其连接到 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>
如上所述配置了 beans,您的程序现在可以AccountService
从 Spring ApplicationContext 请求一个实例,Spring DI 框架将处理所有需要实例化的实例。