X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=support%2Fgeneral%2Fsrc%2Fmain%2Fjava%2Forg%2Fwamblee%2Fgeneral%2FThreadSpecificProxyFactory.java;h=51d23abf46fd54484ff002f776c8a93c5f8df384;hb=3bb08537dfc8212645edd99b955995e96f5ec8b6;hp=f7087296796d8a60ae14fc83139aed7603c5ef2e;hpb=e166aef739852408410043333880c2392f925f80;p=utils diff --git a/support/general/src/main/java/org/wamblee/general/ThreadSpecificProxyFactory.java b/support/general/src/main/java/org/wamblee/general/ThreadSpecificProxyFactory.java index f7087296..51d23abf 100644 --- a/support/general/src/main/java/org/wamblee/general/ThreadSpecificProxyFactory.java +++ b/support/general/src/main/java/org/wamblee/general/ThreadSpecificProxyFactory.java @@ -53,8 +53,9 @@ public class ThreadSpecificProxyFactory { } } - private ThreadLocal svc = new ThreadLocal(); + private ThreadLocal svc; private Class clazz; + private T proxy; /** * Constructs the factory. @@ -67,7 +68,9 @@ public class ThreadSpecificProxyFactory { throw new IllegalArgumentException("Class " + aClass.getName() + " is not an interface"); } + svc = new ThreadLocal(); clazz = aClass; + proxy = createProxy(); } /** @@ -81,7 +84,9 @@ public class ThreadSpecificProxyFactory { } /** - * Gets the current thread-specific service. + * Gets the current thread-specific service. + * To get a contextual reference that can be used by any thread but delegates to a thread-specific + * instance, use {@link #getProxy()}. * @return Service. */ public T get() { @@ -95,15 +100,19 @@ public class ThreadSpecificProxyFactory { * @return Proxy. */ public T getProxy() { + return proxy; + } + + private T createProxy() { InvocationHandler handler = new ThreadSpecificInvocationHandler(); Class proxyClass = Proxy.getProxyClass(clazz.getClassLoader(), new Class[] { clazz }); - T proxy; + T proxyObj; try { - proxy = (T) proxyClass.getConstructor( + proxyObj = (T) proxyClass.getConstructor( new Class[] { InvocationHandler.class }).newInstance( new Object[] { handler }); - return proxy; + return proxyObj; } catch (Exception e) { throw new RuntimeException("Could not create proxy for " + clazz.getName(), e);