0

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

3 回答 3

0

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

另一种方法(我不是特别喜欢,但可以工作)是让您的域对象注入对持久域的引用以查找数据。从概念上讲,它看起来更干净一些。设置代码将进入一个@PostConstruct方法。

于 2013-09-25T21:44:27.953 回答
0

我想再补充一点:好的代码是可以测试的。并且使用依赖注入来支持“控制反转”总是一个好主意。如果设置是通过内部创建的,请考虑如何测试代码

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

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

于 2013-09-26T08:55:56.887 回答
0

用户应该始终附加一些默认设置,以后可以更改。您会在这里使用 CDI,还是坚持手动创建新对象?

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

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

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

于 2013-09-25T16:33:50.853 回答