鍏堢湅涓涓嬌鐢═hreadLocal鐨勫疄渚嬨?br />
package org.springframework.aop.framework;
import org.springframework.core.NamedThreadLocal;
public abstract class AopContext {
private static final ThreadLocal<Object> currentProxy = new NamedThreadLocal<Object>("Current AOP proxy");
public static Object currentProxy() throws IllegalStateException {
Object proxy = currentProxy.get();
if (proxy == null) {
throw new IllegalStateException(
"Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available.");
}
return proxy;
}
static Object setCurrentProxy(Object proxy) {
Object old = currentProxy.get();
if (proxy != null) {
currentProxy.set(proxy);
}
else {
currentProxy.remove();
}
return old;
}
}
涓婁緥灞曠ず鐨勬槸spring妗嗘灦涓幏鍙栧綋鍓嶇嚎紼嬬殑浠g悊瀵硅薄鐨勬柟娉曪紝AopContext.currentProxy()錛屽湪鏈嚎紼嬬殑紼嬪簭璋冪敤鏍堜腑鍙璋冪敤AopContext鐨勯潤鎬佹柟娉曞氨鍙互鑾峰彇鏈嚎紼嬬浉鍏崇殑浠g悊瀵硅薄銆傚鏋滀笉鐢═hreadLocal錛岄偅涔堣繖涓唬鐞嗗璞″湪鍒涘緩鍚庯紝灝辮涓灞傚眰浼犻掍笅鍘伙紝鎵嶈兘鍦ㄥ悗闈㈣幏鍙栧埌騫朵嬌鐢ㄣ?br />
閫氳繃榪欎釜渚嬪瓙錛屾垜浠彲浠ョ煡閬揫b]ThreadLocal涓昏鏄彁渚涗簡涓縐嶄繚鎸佸璞$殑鏂規硶浠ュ強閬垮厤浜嗗璞″湪紼嬪簭璋冪敤涓紶閫掔殑綆渚胯闂柟娉曘俆hreadLocal涓庡叡浜暟鎹拰鍚屾娌℃湁鏄庢樉鍏崇郴銆俒/b]
涓嬮潰鐪嬬湅鐩稿叧鐨勬簮鐮佷互浜嗚В鍏蜂綋鐨勭粨鏋勩?br />
public class Thread implements Runnable {
// ThreadLocalMap鏄竴涓互ThreadLocal涓簁ey錛孫bject涓哄肩殑map錛岀敱ThreadLocal緇存姢
ThreadLocal.ThreadLocalMap threadLocals = null;
}
浠嶵hread鐨勬簮鐮佷腑鍙互寰楃煡錛屾槸姣忎竴涓猅hread鎸佹湁涓涓嚜宸辯殑map錛屽茍涓嶆槸涓涓猅hreadLocal鎸佹湁涓涓猰ap銆?br />
public class ThreadLocal<T> {
public T get() {
// 鑾峰彇褰撳墠綰跨▼
Thread t = Thread.currentThread();
// 鑾峰彇褰撳墠綰跨▼鐨則hreadLocals鍙橀噺
ThreadLocalMap map = getMap(t);
// 浠庡綋鍓嶇嚎紼嬬殑threadLocals鍙橀噺涓彇寰楁湰threadLocal涓簁ey鐨勫?/span>
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null)
return (T)e.value;
}
return setInitialValue();
}
private T setInitialValue() {
T value = initialValue();
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
return value;
}
public void set(T value) {
// 鑾峰彇褰撳墠綰跨▼
Thread t = Thread.currentThread();
// 鑾峰彇褰撳墠綰跨▼鐨則hreadLocals鍙橀噺
ThreadLocalMap map = getMap(t);
// 浠ユ湰threadLocal涓簁ey鐨勪繚瀛樺煎埌褰撳墠綰跨▼鐨則hreadLocals鍙橀噺涓幓
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
}
}
浣跨敤ThreadLocal榪囩▼錛?瀵逛簬姣忎竴涓渶瑕佺嚎紼嬩繚瀛樿嚜韜疄渚嬬殑鍙橀噺錛岄渶瑕佸畾涔変竴涓潤鎬佺殑ThreadLocal瀹炰緥銆傜劧鍚庡皢涓涓叡鐢ㄧ殑ThreadLocal闈欐佸疄渚嬩綔涓簁ey錛屽皢涓嶅悓瀵硅薄鐨勫紩鐢ㄤ繚瀛樺埌涓嶅悓綰跨▼鐨凾hreadLocalMap涓紝鐒跺悗鍦ㄧ嚎紼嬫墽琛岀殑鍚勫閫氳繃榪欎釜闈欐乀hreadLocal瀹炰緥鐨刧et()鏂規硶鍙栧緱鑷繁綰跨▼淇濆瓨鐨勯偅涓璞°?br />
姝ゅ錛屾瘡涓嚎紼嬩繚瀛樼殑鑷韓鏁版嵁騫朵笉鏄氳繃澶囦喚鎴栧鍒剁殑錛岃屾槸new鍒涘緩鍑烘潵鐨勩?br />
閫氳繃ThreadLocal鍚勪釜綰跨▼鍙兘鑾峰彇鑷韓瀵瑰簲鐨勬暟鎹紝涓嶈兘璁塊棶鍏朵粬綰跨▼鐨勬暟鎹紝浣嗘槸濡傛灉涓や釜綰跨▼鍦╯et鏃跺紩鐢ㄤ簡鍚屼竴涓暟鎹紝浠嶇劧瀛樺湪鍚屾闂銆?

]]>