首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CDI @ Injection and Constructor Injection with @Postconstruct

CDI @ Injection and Constructor Injection with @Postconstruct
EN

Stack Overflow用户
提问于 2015-03-19 10:39:10
回答 1查看 829关注 0票数 1

我有以下课程:

代码语言:javascript
复制
@Named
@ViewScoped
public class BaseClass {
    private SomeDependency dep;

    public BaseClass(){}

    @Inject
    public BaseClass(SomeDependency dep) {
        this.dep = dep;
    }

    @PostConstruct
    private void initialize() {
        dep.doSomething(); // Point "A"
    }

    public String getProperty() {
        return "BaseClass-Property";
}

@Specializes
public class SpecialClass extends BaseClass() {

    @Override
    public String getProperty() {
        return "SpecialClass-Property";
    }
}

现在在一些.xhtml中,我有这样的东西

代码语言:javascript
复制
<h:outputText value="#{baseClass.property}" />

没有SpecialClass,这很好。如果我在项目中包括了NullPointerException,它就会与"A“点处的SpecialClass中断。

好吧,根据符合焊接规范的说法,这或多或少是有意的行为:

当启用的bean专门处理另一个bean时,另一个bean永远不会被容器实例化或调用。

不过,现在我必须确保每个@Specializes bean都实现完整的构造函数,如

代码语言:javascript
复制
public SpecialClass() {}

@Inject
public SpecialClass(SomeDependency dep) { super(dep); }

其中IMHO有点违反直觉,产生了很多重复的样板代码,特别是为每个构造函数设置了5-6个参数。而且,在创建新的专门化bean时,这是永远不会被捕获的,因为项目始终是编译干净的。

我是做错了什么,还是除了一遍又一遍地实现构造函数之外,没有别的选择?

顺便说一句,我确实使用了Constructor注入来创建容易测试的类,在这里我可以使用构造函数“注入”依赖项的虚拟实现。

EN

回答 1

Stack Overflow用户

发布于 2015-03-20 05:05:22

第4.3节的CDI 1.1规范说:

“一个bean在所有注入点上完全覆盖第二个bean的唯一方法是实现所有bean类型并声明第二个bean的所有限定符。”

基类使用命名限定符进行注释,而专门化类则不是。您还应该使用Alternative标记它并在beans.xml中启用它。还有ViewScoped注释。除非是Omnifaces的ViewScoped,否则您似乎将与CDI混为一谈。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29142345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档