2010-01-25 2 views
7

В моем классе обслуживания мне нужен сеанс спящего режима. Я в настоящее время сделать это в beans.xml:Использовать весенние аннотации для автоматического применения перехватчика 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> 

(переписывали от руки, могут быть некоторые опечатки ..)

я двигаюсь с помощью аннотаций над XML, мне было интересно, если там был способ использовать их для настройки прокси-сервера, поскольку у меня выше , включая перехватчик спящего режима? Если нет - есть ли способ уменьшить количество XML (около 7 DAO он делает его очень загроможденным)

ответ

8

Хорошо, пойдем. Вы сказали, что

Я двигаюсь к использованию аннотаций над XML

Включить аспект следующий

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

} 

Но имейте в виде Он просто работает, если инвентарь вашего DAO в некоторых интерфейсах (Например, UserDAOImpl реализует UserDAO). Spring AOP использует JDK динамический прокси в этом случае. Если вы не имеете любой интерфейс, вы можете полагаться на IDE Для рефакторинг кода с помощью интерфейса Extract

Объявить свой XML следующим образом (Имейте в виду, я использую Spring 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> 

не забудьте положить в к тому же пути к классам библиотек Spring

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

Спасибо, это похоже на то, что мне нужно! –

0

Обратите внимание на аннотацию @Autowired.

+1

если я не понял, вы не можете использовать Autowired добавить перехватчики? –

Смежные вопросы