gpt4 book ai didi

java - 使用Spring注解自动应用Hibernate Interceptor?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:21:41 26 4
gpt4 key购买 nike

在我的服务类中,我需要可用的 hibernate session 。我目前在 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>

(手抄,可能有错别字..)

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

最佳答案

好吧,我们走吧。你说

I am moving to using annotations over 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 实现了某些接口(interface)时它才有效(例如,UserDAOImpl 实现了 UserDAO)。 Spring AOP 在这种情况下使用 JDK 动态代理。如果你没有任何接口(interface),你可以依靠你的 IDE 来重构你的代码,使用Extract interface

如下声明您的 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

关于java - 使用Spring注解自动应用Hibernate Interceptor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2132151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com