Stiamo utilizzando Spring TransactionInterceptor
per impostare alcune informazioni sulla partizione del database utilizzando ThreadLocal
ogni volta che viene eseguito un metodo DAO contrassegnato con l'annotazione @Transactional
. Abbiamo bisogno di questo per poter indirizzare le nostre query a diverse partizioni di database.Come può un bean Spring rilevare se esso stesso è stato avvolto in un proxy AOP?
Questo funziona bene per la maggior parte dei metodi 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 {
Il problema è quando occorre fare riferimento DAO delega oggetto stesso all'interno della DAO. In genere dobbiamo avere passare il chiamante nel proxy-dao:
public Pager<Foo, Long> getPager(FooDao proxyDao) {
Questo è simile al seguente nel codice che è ovviamente lordo.
fooDao.getPager(fooDao);
Il problema è che quando siamo all'interno della FooDao, il this
è non DAO proxy che abbiamo bisogno.
C'è un meccanismo migliore per un bean per scoprire che ha un wrapper proxy attorno ad esso? Ho esaminato lo Spring AOPUtils ma non vedo alcun modo per trovare il proxy per un oggetto. Ad esempio, non voglio isAopProxy(...)
. Ho letto anche lo Spring AOP docs ma non riesco a vedere una soluzione lì a meno che non implementi il mio codice nativo AOP che speravo di evitare.
Ho il sospetto che potrei essere in grado di iniettare il DAO in se stesso con un bean utility ApplicationContextAware
e un metodo setProxyDao(...)
, ma anche quello sembra un hack. Qualche altra idea su come posso rilevare il proxy in modo da poterlo utilizzare dall'interno del bean stesso? Grazie per qualsiasi aiuto.
L'utilizzo di Aspectj nativo carica/compila tempo tessere non un'opzione affatto - quindi il consiglio si intrometterà nel proxy e non si dovrebbe avere un problema di proxy e questo riferimento all'interno del proxy? –
'this' non farà @ Thorbjørn perché, come afferma il post, ho bisogno del proxy _non_ il bean stesso. – Gray
Scrivere il mio AOP nativo può essere la mia unica soluzione @Biju. Speravo di evitarlo se posso. Grazie mille. – Gray