Java 使用Spring注释自动应用Hibernate拦截器?
在我的服务类中,我需要可用的hibernate会话。我目前在beans.xml中执行此操作: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
<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