Java 使用Spring注释自动应用Hibernate拦截器?

Java 使用Spring注释自动应用Hibernate拦截器?,java,spring,Java,Spring,在我的服务类中,我需要可用的hibernate会话。我目前在beans.xml中执行此操作: <bean id = "userDao" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target"> <ref bean="userDaoTarget" /> </property> <property name="proxyI

在我的服务类中,我需要可用的hibernate会话。我目前在beans.xml中执行此操作:

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

com.app.dao.UserDao
冬眠受体
...
(手工复制,可能有一些打字错误)


我正在转向使用XML上的注释,我想知道是否有一种方法可以使用它们来配置代理,就像我上面提到的一样,包括hibernate拦截器?如果没有-是否有一种方法可以减少XML的数量(使用大约7个DAO,它会使XML变得非常混乱)

请查看
@Autowired
注释。

好的,我们开始吧。你说

我开始在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());
     }

}
package br.com.ar.aop;
@面貌
公共类HibernateInterceptorAdvice{
@自动连线
专用HibernateInterceptor HibernateInterceptor;
/**
*我想你的DAO在com.app.DAO包中
*/
@关于(“执行(*com.app.dao.*(..)”)
公共对象侦听调用(ProceedingJoinPoint joinPoint)抛出可丢弃的{
ProxyFactory ProxyFactory=新的ProxyFactory(joinPoint.getTarget());
addAdvice(hibernateInterceptor);
Class[]classArray=新类[joinPoint.getArgs().length];
for(int i=0;i
但是请记住,如果DAO实现了某个接口(例如,UserDAOImpl实现了UserDAO),那么它就是有效的。SpringAOP在这种情况下使用JDK动态代理。如果您没有任何接口,您可以依靠IDE通过使用提取接口来重构代码

声明您的xml如下(请注意,我使用的是Spring2.5XSD模式)


不要忘记在Spring库之外放入类路径

<SPRING_HOME>/lib/asm
<SPRING_HOME>/lib/aopalliance
<SPRING_HOME>/lib/aspectj
/lib/asm
/自由/爱国主义
/lib/aspectj

除非我有误解,否则您不能使用Autowired添加拦截器?谢谢-这看起来正是我需要的!
<SPRING_HOME>/lib/asm
<SPRING_HOME>/lib/aopalliance
<SPRING_HOME>/lib/aspectj