当前位置: 首页 > 面试题库 >

不调用抽象祖先的@PostConstruct

司马念
2023-03-14
问题内容

我正在编写一个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()被调用,而祖先中定义的那些方法不会被html" target="_blank">调用。注意,在类中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因此在该级别可能会出现问题。



 类似资料:
  • 主要内容:向上遍历 DOM 树,jQuery parent() 方法,实例,jQuery parents() 方法,实例,实例,jQuery parentsUntil() 方法,实例祖先是父、祖父或曾祖父等等。 通过 jQuery,您能够向上遍历 DOM 树,以查找元素的祖先。 向上遍历 DOM 树 这些 jQuery 方法很有用,它们用于向上遍历 DOM 树: parent() parents() parentsUntil() jQuery parent() 方法 parent() 方法返回被

  • 在顶级“foo”的范围内找到具有类“bar”的div,其祖先没有类“foo”。例如,

  • 问题内容: 我有几个这样的Java枚举 如您所见,这里有很多代码重复。如果有一种方法可以引入诸如抽象的共同祖先类之类的东西,那就太好了。但是java枚举不能固有。最好的方法是什么?谢谢。 编辑:我已经制定出一个类似于ŁukaszBachman和missingfacktor的版本 我看到了一些推理。但是,它仍然不是很令人满意。 由于返回类型不同,因此很难为其定义接口 我可以理解,不是真正的重复,而是

  • 这似乎是一个基本问题。但在采访前需要澄清。 我在抽象类中有一个非抽象方法。它的具体类重写了该方法。但我想调用父类的原始方法来调用,而不是重写方法。有什么办法吗? 据我所知,没有办法调用原始方法?

  • 我的问题是树中有大量的节点和许多查询。是否有一种算法,它进行预处理,使查询能够在恒定的时间内得到答复。 我研究了使用RMQ的LCA,但我不能使用该技术,因为我不能对树中的这么多节点使用数组。 如果知道它是满二叉树,节点之间的关系如上所示,那么有人能给我一个高效的实现来快速回答许多查询。 但是当有很多查询时,这种算法非常耗时,因为在最坏的情况下,我可能必须遍历30的高度(树的最大高度)才能到达根(最

  • 问题内容: 我知道这是在黑暗中拍摄的,但是有没有办法仅使用CSS,CSS2,没有jquery,没有javascript来选择和设置元素祖先的样式?我已经遍历了选择器,但是发布了它,以防万一我错过了一些东西或者有一个聪明的解决方法。 例如,假设我有一个嵌套在div中的类名称为“ test”的表。是否有某种: 问题答案: CSS2或CSS3中没有父选择器之类的东西。实际上,可能永远不会存在,因为一旦开