域对象是否意味着被注入?

时间:2013-09-25 16:24:41

标签: java java-ee cdi

我已经使用 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;
}

3 个答案:

答案 0 :(得分:0)

  

用户应始终附加一些默认设置,即可   后来改变了。你会在这里使用CDI,还是坚持使用手册   创建一个新对象?

如果您的应用程序已启用CDI,则应使用CDI,而不是手动创建新对象。

  

在哪里使用CDI一般意义上的?哪里没有?

CDI具有更广泛的用途,允许开发人员以松散耦合但类型安全的方式集成各种组件的灵活性。因此,CDI应该用于所有Java EE 6EE 7应用程序。如果您的应用程序不支持CDI,那么您不应该使用它。

答案 1 :(得分:0)

可以注入域对象。您可能不希望注入默认域对象,而是希望为其提供生产者。这个生产者基本上会根据一些设置创建域对象。您可以使用“管理器”类型类,根据某些内容(如当前登录用户)加载具有必要属性的对象。现在我做了类似的事情,拿着委托人并使用它来查找登录用户的信息,创建像UserSettings这样的东西。您只需确保UserSettings不能注射,使用否决扩展或甚至不安装。

替代方案(我不是特别喜欢,但可以工作)是您的域对象注入持久性域的引用来查找数据。从概念上讲,它看起来更清洁。设置代码将采用@PostConstruct方法。

答案 2 :(得分:0)

我想补充一点:可以测试好的代码。使用依赖注入来支持“控制反转”总是一个好主意。如果通过

内部创建设置,请考虑如何测试代码

private final UserSettings s = new UserSettings(); ...

使其可注射,然后在测试范围内使用注射框架(提示:使用针(https://github.com/akquinet/needle))要容易得多。