不调用抽象祖先的@PostConstruct

我正在编写一个JAX-RS库(不是应用程序)。

我有:

abstract class A {

@PostConstruct

private void constructed_a() {} // not invoked

@Inject

private Some some;

}

public abstract class B extends A {

@PostConstruct

private void constructed_b() {} // not invoked

}

和测试类:

@Path("c")

public class C extends B {

@PostConstrct

private void constructed_c() {} // invoked

}

我正在使用jersey测试框架v2.17进行测试

我发现只有会constructed_c()被调用,而祖先中定义的那些方法不会被调用。注意,在类中some声明的field()已正确注入。@Inject``A

这正常吗?我该怎么办?


我对嵌入式Glassfish进行了测试,发现正如Antonin Stefanutti所指出的那样,这些回调方法按预期顺序被调用。

constructed_a()

constructed_b()

constructed_c()

回答:

根据在JSR 318-拦截器1.2规范 的目标类声明的拦截器调用顺序

部分:

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

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

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

这意味着在编写库/框架时,可以@PostConstruct在父类和子类中都使用lifecyle回调来实现可扩展性。

该机制在Camel CDI扩展中使用,该扩展@PostConstruct在https://github.com/astefanutti/camel-

cdi/blob/b6f52d91b247e36eefb6f3ecde61016d681d3535/impl/src/main/java/org/apache/中声明带有生命周期回调的默认Camel上下文camel

/ cdi / CdiCamelContext.java#L37

可以由https://github.com/astefanutti/camel-

cdi/blob/b6f52d91b247e36eefb6f3ecde61016d681d3535/envs/se/src/main/java/org/apache/camel/camel/cdi/se/bean/CustomLifecycleCamelContext这样的用户扩展.java#L37声明其自己的@PostConstruct生命周期回调。

两者均按照指定的顺序由容器调用。

从设计的角度来看,这意味着您的方法是正确的。但是,由于Jersey依赖项注入基于HK2而不是CDI,并且依赖于类似的桥梁,jersey-gf-

cdi因此在该级别可能会出现问题。

以上是 不调用抽象祖先的@PostConstruct 的全部内容, 来源链接: utcz.com/qa/406033.html

回到顶部