2010-01-25 23 views
7

En mi clase de servicio, necesito la sesión de hibernación disponible. Actualmente hago esto en el beans.xml:¿Utiliza anotaciones de primavera para aplicar automáticamente el interceptor Hibernate?

<bean id = "userDao" class="org.springframework.aop.framework.ProxyFactoryBean"> 
<property name="target"> 
    <ref bean="userDaoTarget" /> 
</property> 

<property name="proxyInterfaces"> 
    <value>com.app.dao.UserDao</value> 
</property> 

<property name="interceptorNames"> 
    <list> 
    <value>hibernateInterceptor</value> 
    </list> 
</property> 

<qualifier value="proxy" /> 
</bean> 

... 

<bean id="hibernateInterceptor" 
    class="org.springframework.orm.hibernate3.HibernateInterceptor"> 
<property name="sessionFactory"> 
    <ref bean="sessionFactory" /> 
</property> 
<bean> 

(copiado a mano, puede haber algunos errores tipográficos ..)

estoy en movimiento a la utilización de las anotaciones más de XML, me preguntaba si había una forma de usarlos para configurar el proxy como tengo arriba incluyendo el interceptor de hibernación? Si no, ¿hay alguna manera de que pueda reducir la cantidad de XML (con alrededor de 7 DAOs lo hace muy desordenado)

Respuesta

8

Ok, vamos. Usted ha dicho

Me voy a mudar a usar anotaciones sobre XML

Habilitar un aspecto de la siguiente manera

package br.com.ar.aop; 

@Aspect 
public class HibernateInterceptorAdvice { 

    @Autowired 
    private HibernateInterceptor hibernateInterceptor; 

    /** 
     * I suppose your DAO's live in com.app.dao package 
     */ 
    @Around("execution(* com.app.dao.*(..))") 
    public Object interceptCall(ProceedingJoinPoint joinPoint) throws Throwable { 
     ProxyFactory proxyFactory = new ProxyFactory(joinPoint.getTarget()); 
     proxyFactory.addAdvice(hibernateInterceptor); 

     Class [] classArray = new Class[joinPoint.getArgs().length]; 
     for (int i = 0; i < classArray.length; i++) 
      classArray[i] = joinPoint.getArgs()[i].getClass(); 

     return 
      proxyFactory 
       .getProxy() 
       .getClass() 
       .getDeclaredMethod(joinPoint.getSignature().getName(), classArray) 
       .invoke(proxyFactory.getProxy(), joinPoint.getArgs()); 
    } 

} 

Pero hay que tener en cuenta Sólo funciona si los implementos de su DAO alguna de las interfaces (Por ejemplo, UserDAOImpl implementa UserDAO). Spring AOP usa el proxy dinámico JDK en este caso. Si usted no tiene un interfaz, que puede confiar en su IDE refactorizar su código mediante el uso de la interfaz Extracto

Declarar el código XML de la siguiente manera (Tenga en cuenta que estoy usando primavera esquema 2.5 xsd)

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
         http://www.springframework.org/schema/context 
         http://www.springframework.org/schema/context/spring-context-2.5.xsd 
         http://www.springframework.org/schema/aop 
         http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> 
    <!--SessionFactory settings goes here--> 
    <bean class="org.springframework.orm.hibernate3.HibernateInterceptor"> 
     <property name="sessionFactory" ref="sessionFactory"/> 
    <bean> 
    <!--To enable AspectJ AOP--> 
    <aop:aspectj-autoproxy/> 
    <!--Your advice--> 
    <bean class="br.com.ar.aop.HibernateInterceptorAdvice"/> 
    <!--Looks for any annotated Spring bean in com.app.dao package--> 
    <context:component-scan base-package="com.app.dao"/> 
    <!--Enables @Autowired annotation--> 
    <context:annotation-config/> 
</beans> 

no se olvide poner en la ruta de clase además de las bibliotecas de la primavera

<SPRING_HOME>/lib/asm 
<SPRING_HOME>/lib/aopalliance 
<SPRING_HOME>/lib/aspectj 
+0

Gracias, ¡esto se ve exactamente como lo que necesito! –

0

Eche un vistazo a la anotación @Autowired.

+1

a menos que yo he entendido bien, no se puede utilizar para agregar Autowired interceptores? –

Cuestiones relacionadas