求解:Spring AOP拦截hibernateDAO FindByID 对象中的方法

GlobalFree 2010-08-10 02:16:39
ctx.getBean("Player");出来的对象可以拦截。

但从 hibernate DAO FindByID 出来的对象。就没有反应。

applicationContext.xml :
<?xml version="1.0" encoding="UTF-8"?>

<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

<aop:aspectj-autoproxy proxy-target-class="true" />

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation"
value="file:src/hibernate.cfg.xml">
</property>
</bean>

<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>

<bean id="PlayerDAO" class="user.hibernate.PlayerDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>

<bean id="PlayerDAOProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

<!-- 注意这个属性, 详细意义请参考文章开头的参考资料, 必须为 true 使用CGLIB才不用强制编写DAO接口 -->
<property name="proxyTargetClass">
<value>true</value>
</property>

<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="PlayerDAO" />
</property>
<property name="transactionAttributes">
<props>
<!-- 这里的方法签名可以精确到方法, 先懒惰一下全配置上 -->
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>

<bean id="Player" class="user.Player"
scope="prototype">

</bean>

<bean id="PlayerAOP" class="user.PlayerAOP"/>

</beans>


PlayerAOP切面:


package user;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;


@Aspect
public class PlayerAOP {

/**
* 定义一个切入点,切入点的名称:allAddMethod(该方法的返回值需要是void,该
* 方法只是一个标识),切入点的内容是一个表达式,以描述需要横切那些对象的那些方法
* 的调用
*/

@Pointcut("execution(* user.Player.trigger*(..)) || execution(* user.Player.save(..))")
public void playerSave(){}

/**
* 定一个advice,标识在那些切入点的何处插入本方法
*/
@Around("playerSave()")
public void checkSecurity(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("playerSave impl...");
//打印所有方法的参数,您也可以在这里自定义您自己的权限检查行为
for(Object p : pjp.getArgs()){
System.out.println(p);
}
System.out.println(pjp);
pjp.proceed();
}

public void triggerLogin(){

}
}



谢谢大家回复任何文字!
...全文
71 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
GlobalFree 2010-08-13
  • 打赏
  • 举报
回复
大家帮个忙u-p

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧