相关疑难解决方法(0)

为什么在Java EE中使用CDI

我知道有很多文章解释了如何在Java EE中使用CDI,但我无法弄清楚它实际带来了什么优势.例如,假设我有一个当前使用Foo实例的类.我也许会这样做

Foo myFoo = new Foo();
Run Code Online (Sandbox Code Playgroud)

要么

// Better, FooFactory might return a mock object for testing    
Foo myFoo = FooFactory.getFoo();
Run Code Online (Sandbox Code Playgroud)

我一直在读CDI,我可以这样做:

@Inject
Foo myFoo;
Run Code Online (Sandbox Code Playgroud)

但为什么这比以前的工厂方法更好?我假设还有一些其他用例,我不知道,但我无法识别这一点.

如果我理解了下面的响应,那么概念就是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>
Run Code Online (Sandbox Code Playgroud)

如上所述配置bean后,您的程序现在可以AccountService从Spring ApplicationContext 请求一个实例,Spring DI框架将实例化需要实例化的所有内容.

java spring java-ee cdi

49
推荐指数
3
解决办法
3万
查看次数

标签 统计

cdi ×1

java ×1

java-ee ×1

spring ×1