我們使用Spring的TransactionInterceptor
設置每當執行標有@Transactional
標註一個DAO方法使用ThreadLocal
一些數據庫分區信息。我們需要這樣才能將查詢路由到不同的數據庫分區。Spring bean如何檢測它本身是否被包裝在AOP代理中?
這工作對大多數DAO方法:
// this causes the invoke method to set a thread-local with the host name of
// the database server the partition is on
@Transactional
public int deleteAll() throws LocalDataException {
的問題是,當我們需要引用DAO內的DAO 代理對象本身。通常情況下,我們必須讓代理通過代理服務:
public Pager<Foo, Long> getPager(FooDao proxyDao) {
這看起來像下面的代碼顯然很粗糙。
fooDao.getPager(fooDao);
的問題是,當我們FooDao的內部,this
是不代理DAO,我們所需要的。
有沒有更好的機制,一個bean來發現它周圍有一個代理包裝?我已經看過Spring AOPUtils,但我看不到一個對象的代理。例如,我不想要isAopProxy(...)
。我也讀過Spring AOP docs,但是除非我實現我自己希望避免的AOP本地代碼,否則我不能在那裏看到解決方案。
我懷疑我可能可以通過ApplicationContextAware
實用程序bean和setProxyDao(...)
方法將DAO注入自身,但這看起來也像是黑客攻擊。任何其他的想法如何我可以檢測代理,所以我可以利用它從bean本身?謝謝你的幫助。
正在使用本地Aspectj加載/編譯時編織不是一個選項 - 然後建議將編織到代理,你不應該有一個代理和代理內的此引用的問題? – 2012-07-16 18:19:51
'this'不會做@Thorbjørn,因爲正如帖子所述,我需要代理_not_ bean本身。 – Gray 2012-07-16 18:23:02
寫我自己的本地AOP可能是我唯一的解決方案@Biju。如果可以的話,我希望避免它。感謝壽。 – Gray 2012-07-16 18:24:38