下面的类
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方法都会在同一个实例中结束,因此它的行为就像单例一样。
发布于 2019-12-07 17:48:28
还有一件事我没有提到--代理的行为像单例一样被注入到JacksonJsonProvider子类中。据我所知,JacksonJsonProvider的这个子类在泽西只创建一次,所以注入其中的代理实例不会在不同的请求之间发生变化。
Proxy基本上是一个带有公共方法上的拦截器的MaskHolder的人工子类,但它基本上是带有它的UUID字段的MaskHolder。因此,如果拦截器不提供RequestScope bean,我们将访问“父”MaskHolder。而且因为代理实例只被注入到JacksonJsonProvider一次,所以在不同的请求中是相同的。
将MaskHolder注入资源会导致不同的代理实例(不同的UUID)跨请求。
https://stackoverflow.com/questions/59096350
复制相似问题