我正在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
?
根据在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] 删除。
我来说两句