1. 程式人生 > >spring宣告事務失效問題(二)

spring宣告事務失效問題(二)

上次談到spring的aop無法攔截內部方法呼叫時,解決方案之一是重新獲取代理類呼叫B方法。

下面說一下如何獲取到代理bean。

1、如果知道beanName直接通過上下文獲取到bean。

2、如果不知道beanName,則可以放線上程變數中,如下:

     在action中呼叫時可以先呼叫spring提供的介面AopContext.setCurrentProxy(proxy)。

     該介面原理就是將代理bean放到執行緒變數中

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;
	}

}

  當需要呼叫時,則呼叫介面((BeanClass) AopContext.currentProxy()).B();

  如果在配置中將expose-proxy設定為true,則直接獲取就可以了:

<aop:config expose-proxy="true"><!—xml風格支援-->