上课
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方法都会在同一实例中结束,因此它的行为类似于单例。
[我没有提到的另一件事-代理的行为就像将singleton注入到JacksonJsonProvider
子类中。据我了解,JacksonJsonProvider的此子类在Jersey中仅创建一次,因此注入到其中的代理实例在请求之间不会更改。
代理基本上是MaskHolder
的人为子类,带有公共方法上的拦截器,但基本上是MaskHolder
,带有UUID字段。因此,如果拦截器不提供RequestScope bean,我们将访问“父” MaskHolder。而且因为代理实例仅注入一次JacksonJsonProvider,所以在请求中是相同的。
将MaskHolder
注入资源会导致跨请求的不同代理实例(不同的UUID)。