代码之家  ›  专栏  ›  技术社区  ›  Mehran Mastcheshmi

当bean有拦截器或装饰器时,CDI中的代理规则是什么?

  •  1
  • Mehran Mastcheshmi  · 技术社区  · 7 年前

    1) bean没有任何拦截器或装饰器:bean没有代理

    2) bean有一个拦截器:bean被代理

    1) 客户机代理:这个代理覆盖bean类的所有非私有方法,当调用这些被覆盖的方法时,代理查找bean的正确实例(或第二种类型的代理),然后将调用转发到实际的bean实例(基于 this 链接)。对于依赖作用域,不创建此代理

    2) 还有另一个代理用于应用拦截器和decorators,它是在bean具有decorator或拦截器时创建的

    我关于第二类代理的假设正确吗?说明书上有没有说?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Siliarus    7 年前

    你确实做了一个很好的调查,你在很大程度上是对的。 以下是细节。

    @ApplicationScoped , RequestScoped client proxy . 与 @Dependent 不 在普通范围内,基本上每次都要注入新实例,因此不需要对其进行代理。

    拦截器和装饰器

    特定焊缝 虽然我记得,OWB也有类似的情况。不管怎么说,要实现这一目标,真的没有多少选择。

    同样,从用户的角度来看,这没什么区别,你不应该担心。

    代理/子类的额外工具

    有时候, 很少,而且很可能只有在开发CDI库时 ,您可能真的需要查看注入的bean是客户机代理还是子类。 WeldClientProxy 焊接API接口。此接口允许您获取实际实例和一些元数据。 同样,每个被拦截和修饰的bean都在实现 WeldContruct 作为标记接口。