2010-01-25 14 views
7

In meiner Serviceklasse brauche ich die Ruhezustand-Sitzung. Ich tue dies derzeit in der beans.xml:Verwenden Sie Spring-Anmerkungen, um den Hibernate Interceptor automatisch anzuwenden?

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

(von Hand kopiert, können einige Fehler sein ..)

ich mit Anmerkungen über XML bin bewegt, ich frage mich, ob es eine war Möglichkeit, sie zu verwenden, um den Proxy zu konfigurieren, wie ich über einschließlich der Ruhezustand Interceptor? Wenn nicht - gibt es eine Möglichkeit, die Menge an XML zu reduzieren (mit ca. 7 DAOs ist es sehr unübersichtlich)

Antwort

8

Ok, los geht's. Sie sagte

ich mit Anmerkungen über XML

einen Aspekt aktivieren wie folgt im Auge

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

} 

Aber halten bewege Es funktioniert nur, wenn Ihre DAO implementiert einige Schnittstelle (Zum Beispiel implementiert UserDAOImpl UserDAO). Spring AOP verwendet in diesem Fall den dynamischen JDK-Proxy. Wenn Sie keine Schnittstelle hat, können Sie auf Ihrem IDE verlassen, um Ihren Code Refactoring, indem Sie Extract Schnittstelle

Ihre xml erklären wie folgt (Beachten Sie i Spring 2.5 XSD-Schema verwende)

<?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> 

vergessen Sie nicht im classpath setzen neben Feder Bibliotheken

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

Danke - das sieht genau so aus, wie ich es brauche! –

0

Werfen Sie einen Blick auf die @Autowired Annotation.

+1

Wenn ich nicht falsch verstanden haben, können Sie nicht Autowired verwenden Abfangjäger hinzufügen? –

Verwandte Themen