--监控com.zte..hibernate3impl.*Impl 这个包下面的所有文件的所有方法,配置了一个事物
<aop:advisor pointcut="execution(* com.zte..hibernate3impl.*Impl.*(..))" advice-ref="txAdvice" />
<bean id="dbCallMonitor" class="com.zte.frame.web.servlet.DbCallMonitor" />
<aop:config>
<aop:pointcut id="around"
expression="execution(* com.zte..hibernate3impl.*Impl.*(..))" />
<aop:aspect ref="dbCallMonitor">
<aop:around method="around" pointcut-ref="around" /> --这个around是对上面的around的引用
</aop:aspect>
</aop:config>
<property name="proxyTargetClass" value="false" />
public class DbCallMonitor {
protected final Logger log = Logger.getLogger(DbCallMonitor.class);
public Object around(ProceedingJoinPoint pjp) throws Throwable {
synchronized (this) {
Class<?> targetClass = pjp.getTarget().getClass();
MethodSignature sign = (MethodSignature) pjp.getSignature();
String method = sign.getMethod().getName();
String clazz = targetClass.getName();
StopWatch stopWatch = new Log4JStopWatch(clazz + "."
+ method);
// 构建数据入库
Object obj = null;
try {
long begin = System.currentTimeMillis();
obj = pjp.proceed();
long end = System.currentTimeMillis();
// 构建数据
DbCallMonitorSingleton.getInstance().buildData(clazz, method, end - begin);
} catch (Throwable ex) {
log.error("DbCallMonitor Exception : ", ex);
throw ex;
}
stopWatch.stop();
return obj;
}
// 将查询出的对象剔除事务,已确保不会被Hibernate事务自动更新
if(null != d) {
this.getSession().evict(d);
}