我有一个类,有几个方法,类的接口看起来像这样
一些主程序调用方法doSomeOperation,后者又根据业务规则调用类中的其他方法。我有一种情况,我必须在调用此类中的某些方法后填充一些统计信息。
例如,在调用doSomeOperation然后调用doOps1之后,在数据库中填充一些stats表,指示在特定表中插入/更新/删除了多少记录等,以及doOps1方法花了多少时间等。我正在尝试将Spring AOP用于此目的。但是,我面临的问题是没有调用预期的代码。
以下是完整代码(仅供参考)
package spring.aop.exp;
public interface Business {
void doSomeOperation();
void doOps1();
}
package spring.aop.exp;
public class BusinessImpl implements Business {
public void doSomeOperation() {
System.out.println("I am within doSomeOperation");
try {
Thread.sleep(200);
} catch (InterruptedException e) {
System.out.println("Thread interrupted");
}
System.out.println("Done with sleeping.");
doOps1();
}
public void doOps1() {
System.out.println("within Ops1");
}
}
方面类
package spring.aop.exp;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class BusinessProfiler {
@Pointcut("execution(* doOps1*(..))")
public void businessMethods1() { }
@After("businessMethods1()")
public void profile1() throws Throwable {
//this method is supposed to populate the db stats and other statistics
System.out.println("populating stats");
}
}
- 主要课程
package spring.aop.exp;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringAOPDemo {
/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"ExpAOP.xml");
Business bc = (Business) context.getBean("myBusinessClass");
bc.doSomeOperation();
}
}
*和配置文件***
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<!-- Enable the @AspectJ support -->
<aop:aspectj-autoproxy />
<bean id="businessProfiler" class="spring.aop.exp.BusinessProfiler" />
<bean id="myBusinessClass" class="spring.aop.exp.BusinessImpl" />
</beans>
在运行主程序时,我正在获取输出(并且它不是在Aspect类中调用profile1 - BusinessProfiler)。但是,如果我直接从主类调用doOps1,则会调用aspect方法。我想知道如果仅从main方法调用而不是其他方面,方面是否应该工作。
2012年10月26日上午11:56:19 org.springframework.context.support.AbstractApplicationContext prepareRefresh INFO:刷新 org.springframework.context.support.ClassPathXmlApplicationContext@be2358: 显示名称 [org.springframework.context.support.ClassPathXmlApplicationContext@be2358]; 启动日期[Fri Oct 26 11:56:19 EDT 2012];上下文层次结构的根 2012年10月26日上午11:56:19 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions INFO:从类路径加载XML bean定义 资源[ExpAOP.xml] 2012年10月26日上午11:56:19 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory INFO:应用程序上下文的Bean工厂 [org.springframework.context.support.ClassPathXmlApplicationContext@be2358]: org.springframework.beans.factory.support.DefaultListableBeanFactory@1006d75 2012年10月26日上午11:56:19 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons信息:预先实例化单例 org.springframework.beans.factory.support.DefaultListableBeanFactory@1006d75: 定义bean [org.springframework.aop.config.internalAutoProxyCreator,businessProfiler,myBusinessClass]; 工厂层级的根
*我在doSomeOperation中 完成沉睡。 在Ops1 ***
中答案 0 :(得分:0)
Spring AOP
默认为proxy-based
,当您在该calss上的另一个方法中调用同一类的方法时,您的调用不会通过方面代理,而是直接通过方法 - 这就是为什么你的方面代码没有被调用的原因。要更好地理解它,请阅读this chapter上的Understanding AOP proxies Spring文档。