新泽西州2中被代理对象的奇怪行为调用程序包专用方法

问题描述 投票:0回答:1

上课

public class MaskHolder {

    private Mask mask;
    private UUID id = UUID.randomUUID()

    void store() {
        System.out.println(id);
    }

    public void get() {
        System.out.println(id);
    }

}

像这样绑定到HK2

bind(MaskHolder.class).to(MaskHolder.class)
            .proxy(true).proxyForSameScope(false).in(RequestScoped.class);

使用@Context注入到bean的代理的行为与公共方法一样,但也执行package-private方法。问题在于,包私有方法不会触发MethodInterceptor,因此它实际上不会达到get()实例所能达到的效果。问题是代理将程序包专用方法调用转发到的“默认”实例是什么。调用get()方法会在不同的请求上到达不同的实例,但是每次调用store方法都会在同一实例中结束,因此它的行为类似于单例。

java jersey-2.0 hk2 dynamic-proxy
1个回答
0
投票

[我没有提到的另一件事-代理的行为就像将singleton注入到JacksonJsonProvider子类中。据我了解,JacksonJsonProvider的此子类在Jersey中仅创建一次,因此注入到其中的代理实例在请求之间不会更改。

代理基本上是MaskHolder的人为子类,带有公共方法上的拦截器,但基本上是MaskHolder,带有UUID字段。因此,如果拦截器不提供RequestScope bean,我们将访问“父” MaskHolder。而且因为代理实例仅注入一次JacksonJsonProvider,所以在请求中是相同的。

MaskHolder注入资源会导致跨请求的不同代理实例(不同的UUID)。

© www.soinside.com 2019 - 2024. All rights reserved.