我已经使用 CDI @Inject
在我的某些课程中获得了一些无状态服务。
我想知道注入域对象是否也有意义,如下例所示:
class UserSettings;
class User {
//@Inject
private UserSetttings settings = new UserSettings();
}
用户应始终附加一些默认设置,以后可以更改。你会在这里使用CDI,还是只是坚持手动创建一个新对象?
或者更一般地说:在一般意义上使用CDI的地方是什么?哪里没有?
更新制片人:
class Preferences {
@Produces @DefaultSettings
public UserSettings getDefaultSettings() {
UserSettings settings = new UserSettings();
//configure default
return settings;
}
}
class User {
@Inject @DefaultSettings
private UserSettings settings;
}
答案 0 :(得分:0)
用户应始终附加一些默认设置,即可 后来改变了。你会在这里使用CDI,还是坚持使用手册 创建一个新对象?
如果您的应用程序已启用CDI
,则应使用CDI
,而不是手动创建新对象。
在哪里使用CDI一般意义上的?哪里没有?
CDI
具有更广泛的用途,允许开发人员以松散耦合但类型安全的方式集成各种组件的灵活性。因此,CDI应该用于所有Java EE 6
和EE 7
应用程序。如果您的应用程序不支持CDI
,那么您不应该使用它。
答案 1 :(得分:0)
可以注入域对象。您可能不希望注入默认域对象,而是希望为其提供生产者。这个生产者基本上会根据一些设置创建域对象。您可以使用“管理器”类型类,根据某些内容(如当前登录用户)加载具有必要属性的对象。现在我做了类似的事情,拿着委托人并使用它来查找登录用户的信息,创建像UserSettings
这样的东西。您只需确保UserSettings
不能注射,使用否决扩展或甚至不安装。
替代方案(我不是特别喜欢,但可以工作)是您的域对象注入持久性域的引用来查找数据。从概念上讲,它看起来更清洁。设置代码将采用@PostConstruct
方法。
答案 2 :(得分:0)
我想补充一点:可以测试好的代码。使用依赖注入来支持“控制反转”总是一个好主意。如果通过
内部创建设置,请考虑如何测试代码 private final UserSettings s = new UserSettings();
...
使其可注射,然后在测试范围内使用注射框架(提示:使用针(https://github.com/akquinet/needle))要容易得多。