关于用AOP统计service运行时间的有关问题

关于用AOP统计service运行时间的问题,在线等
情况是这样的:

首先写了一个AOP去管理事务:

<!-- 配置事务 -->
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置事务边界,也就是在某一范围内使用事务管理 -->
<aop:config>
<aop:pointcut id="bussinessService"
expression="execution(public * crawler.service.*.*(..))" />
<aop:advisor pointcut-ref="bussinessService" advice-ref="txAdvice" />
</aop:config>
<!-- 配置事务隔离级别 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="list*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="finish*" propagation="REQUIRED" />
<tx:method name="check*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>


又写了一个类去统计运行时间:
public class AopTest {
public void cut(ProceedingJoinPoint point) throws Throwable{
long time=System.currentTimeMillis();
Object retVal=point.proceed();
long time2=System.currentTimeMillis()-time;
System.out.println(point+"方法运行时间:"+time2);
}
}


然后将这个类用AOP插入到service:
<!-- 测试 -->
<bean id="aopTest" class="crawler.utils.AopTest" scope="prototype"></bean>
<aop:config>
  <aop:pointcut expression="execution(public * crawler.service.*.*(..))" id="servicePointcut"/> <!-- 切入点集合,expression是定义在什么地方进行插入 -->
<aop:aspect id="logAspect" ref="aopTest"> <!-- 切面类,需要插入的类-->
<aop:around method="cut" pointcut-ref="servicePointcut"/> <!-- method是插入类中需要插入的方法,pointcut-ref切入点集合,被插入的点-->
</aop:aspect>
</aop:config>


那么问题来了:
1、可以统计出service的运行时间,但是查不出数据库中的数据了,去掉统计时间的AOP后一切正常,应该是2个AOP同时运行的问题,那么有什么更好的办法用AOP来控制事务和运行时间吗?
2、统计时间的时候只能针对service,如果改成action或者dao就报错,这是什么原因呢?

------解决思路----------------------
1、定义2个切入点也是没有问题的。最好可以明确指定顺序,比如你这里的话,记时的那个拦截顺序要优先
2、AOP默认用的是JDK的动态代理,是面向接口的,你的action或dao应该都没有实现接口~
------解决思路----------------------
你这个 <aop:config >  如果只出现一次的话会不会正常呢?试下把它们合并配置到一个地方。那个 tx 的 advice 定义的 advisor 跟后面 <aop:aspect><aop:around> 这种写法有什么不同的?
------解决思路----------------------
引用:
Quote: 引用:

1、定义2个切入点也是没有问题的。最好可以明确指定顺序,比如你这里的话,记时的那个拦截顺序要优先
2、AOP默认用的是JDK的动态代理,是面向接口的,你的action或dao应该都没有实现接口~

1、调整了拦截顺序也还是不行。。。郁闷。。。
2、service也没实现什么接口。。为什么就能用。。。


关于第二点我只想说不可能~除非你用了cglib
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

1、定义2个切入点也是没有问题的。最好可以明确指定顺序,比如你这里的话,记时的那个拦截顺序要优先
2、AOP默认用的是JDK的动态代理,是面向接口的,你的action或dao应该都没有实现接口~

1、调整了拦截顺序也还是不行。。。郁闷。。。
2、service也没实现什么接口。。为什么就能用。。。


关于第二点我只想说不可能~除非你用了cglib


我觉得他说的调整顺序是指aop的执行顺序,不是配置的顺序,可以看看Reference中关于通知顺序方面的章节的说明。再没有实现org.springframework.core.Ordered接口的情况下,执行顺序就是定义在切面中的通知的顺序。