在@PostConstruct之后初始化子类

夸萨茨

我正在WildFly 8.2应用程序服务器中使用JavaEE 7中的上下文依赖注入CDI 1.1框架

我想@PostConstruct在超类的a之后初始化子

所以我会那样做

// case 1: it's working but it's not simple to understand

public class A {

    @PostConstruct
    protected void init() {
        System.out.println("A");
        afterInit();
    }

    protected void afterInit() {}

}

public class B extends A {

    @Override
    protected void afterInit() {
        System.out.println("B");
    }

}


public class C extends B {

    @Override
    protected void afterInit() {
        super.afterInit();
        System.out.println("C");
    }

}

因此该init()方法将按此顺序打印A,B,C

@AfterPostconstruct可以做同样注释会很好,但我不知道

// case 2: dream code

public class A {

    @PostConstruct
    protected void init() {
        System.out.println("A");
    }

}

public class B extends A {

    @AfterPostConstruct  // pseudocode
    protected void afterInitB() {
        System.out.println("B");
    }

}


public class C extends B {

    @AfterPostConstruct // pseudocode
    protected void afterInitC() {
        System.out.println("C");
    }

}

我尝试通过覆盖来实现,init()但是它不起作用(init()容器未调用)

// case 3 : code that is not working but it would be better than case 1

public class A {

    @PostConstruct
    protected void init() {
        System.out.println("A");
    }

}

public class B extends A {

    @Override
    protected void init() {
        super.init();
        System.out.println("B");
    }

}


public class C extends B {

    @Override
    protected void init() {
        super.init();
        System.out.println("C");
    }

} 

之后是否有更好的(更简单的)方法来初始化子类@PostConstruct

安东宁·斯特法诺蒂(Antonin Stefanutti)

根据JSR 318的目标类声明的拦截器的调用顺序-拦截器1.2(同样适用于CDI 1.1)规范:

在目标类或其父类上声明的拦截器方法按以下顺序调用:

  • 如果目标类具有超类,则将调用在这些超类上定义的所有拦截器方法,首先是最常规的超类。
  • 目标类本身上的拦截器方法(如果有的话)被调用。

如果拦截器方法被另一个方法覆盖(无论该方法本身是否为拦截器方法),则将不会调用该方法。

因此,在您的用例中,您可以编写:

public class A {

    @PostConstruct
    private void initA() {
        System.out.println("A");
    }
}

public class B extends A {

    @PostConstruct
    private void initB() {
        System.out.println("B");
    }
}

public class C extends B {

    @PostConstruct
    private void initC() {
        System.out.println("C");
    }
} 

并按此顺序打印:A,B,C。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在@PostConstruct之后初始化子类

来自分类Dev

初始化子类字段

来自分类Dev

用父类初始化子类

来自分类Dev

初始化子类不起作用

来自分类Dev

如何使用super()在python中初始化子类参数

来自分类Dev

使用Parent构造函数初始化子类

来自分类Dev

从超类初始化子类的类实例变量

来自分类Dev

用基类对象C ++初始化子类?

来自分类Dev

初始化子类时可访问超类的变量

来自分类Dev

使用Parent构造函数初始化子类

来自分类Dev

从超类初始化子类的类实例变量

来自分类Dev

如何从抽象母类上的指针初始化子类?

来自分类Dev

初始化子类时基类如何初始化

来自分类Dev

在Swift中初始化子类时调用父构造函数

来自分类Dev

静态变量的值甚至在Java中初始化子类后未改变

来自分类Dev

是否有一种设计模式可以强制初始化子类实现的方法?

来自分类Dev

Python类继承:如何使用不在父类中的值初始化子类

来自分类Dev

调用基类构造函数与初始化子类中的成员变量

来自分类Dev

使用python中父类的魔术方法__init__初始化子类

来自分类Dev

子类的延迟初始化

来自分类Dev

子类的参数初始化

来自分类Dev

子类初始化的模式

来自分类Dev

加载演示文稿后初始化子

来自分类Dev

父后如何初始化子组件?

来自分类Dev

加载演示文稿后初始化子

来自分类Dev

Rails def初始化子弹解释

来自分类Dev

静态指针初始化在“初始化”之后重置

来自分类Dev

强制子类初始化变量

来自分类Dev

UIViewController的子类所需的初始化程序