Estamos utilizando el TransactionInterceptor
de Spring para establecer cierta información de partición de base de datos usando ThreadLocal
siempre que se ejecute un método DAO marcado con la anotación @Transactional
. Necesitamos esto para poder enrutar nuestras consultas a diferentes particiones de base de datos.¿Cómo puede un Spring Bean detectar si se ha envuelto en un proxy AOP?
Esto funciona bien para la mayoría de los métodos de 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 {
El problema es cuando tenemos que hacer referencia a la DAO proxy de objeto en sí mismo dentro de la DAO. Por lo general tenemos que tener la persona que llama pase en el proxy-DAO:
public Pager<Foo, Long> getPager(FooDao proxyDao) {
Esto se parece a la siguiente en el código que es obviamente bruto.
fooDao.getPager(fooDao);
El problema es que cuando estamos dentro de FooDao, la this
es no la DAO proxy que necesitamos.
¿Hay un mejor mecanismo para que un frijol descubra que tiene un envoltorio de proxy a su alrededor? Miré Spring AOPUtils pero no veo forma de encontrar el proxy para un objeto. No quiero isAopProxy(...)
por ejemplo. También he leído el Spring AOP docs pero no veo una solución allí a menos que implemente mi propio código nativo AOP que esperaba evitar.
Sospecho que podría inyectar el DAO en él con un ApplicationContextAware
y un método setProxyDao(...)
, pero eso también parece un truco. ¿Alguna otra idea de cómo puedo detectar el proxy para poder usarlo desde dentro del mismo bean? Gracias por cualquier ayuda.
¿El uso de Aspectj original carga/tiempo de compilación no es una opción en absoluto, entonces el consejo se integrará en el proxy y no debería tener un problema de proxy y esta referencia dentro del proxy? –
'this' no hará @ Thorbjørn porque como dice la publicación, necesito el proxy _no_ el bean en sí. – Gray
Escribir mi propio AOP nativo puede ser mi única solución @Biju. Esperaba evitarlo si puedo. Gracias también. – Gray