spring1.x AOP实现(也可称spring AOP经典实现),------12月6日在三楼添加了spring2.xAOP实现
环境准备:创建业务逻辑实现:
接口: package testSpringAOP;
public interface BusinessProcess {
public void someMethod();
public void anotherMethod();
}
实现类:package testSpringAOP;
Public class BusinessProcessImpl implements BusinessProcess{
public void someMethod(){
System.out.println("这是类"+this.getClass() +"中,方法someMethod执行的提示。");
}
@Override
public void anotherMethod() {
System.out.println("这是类"+this.getClass() +"中,方法anotherMethod执行的提示。");
}
}
环境准备好之后,下面开始一步一步实现AOP
第一步,创建切面实现类,该类实现了MethodInterceptor接口
package testSpringAOP;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyFirstAOP implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation arg0) throws Throwable {
System.out.println("新业务开始执行。");
long startTime = System.nanoTime();
Object returnObject = arg0.proceed();
long endTime = System.nanoTime();
System.out.println("新业务执行结束。");
System.out.println("方法" +arg0.getMethod().getName() + "总共执行了"+ (endTime-startTime) + "纳秒。");
return returnObject;
}
}
第二步,配置spring的配置文件,配置bean,加入点(jionpoint),切点(pointcut),织入(weave)等
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.
<!--http://www. - Application context definition for Petclinic on Hibernate.-->
<beans>
<bean id="businessProcess" class="testSpringAOP.SomeClass" />
<bean id="updateBusinessProcess" class="testSpringAOP.MyFirstAOP"></bean>
<bean id="pointCut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="pattern" value=".*someMethod"></property>
</bean>
<bean name="advisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="updateBusinessProcess"></property>
<property name="pointcut" ref="pointCut"></property>
</bean>
<bean id="newBusinessProcess" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="businessProcess"></property>
<property name="interceptorNames">
<list>
<value>advisor</value>
</list>
</property>
</bean>
</beans>
第三步,编写测试类,检验AOP功能:
package testSpringAOP;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class TestClassesAOP implements MethodInterceptor{
public Object invoke(MethodInvocation mi) throws Throwable {
// 前拦截
long begin=System.nanoTime();
// 目标方法执行
Object res=mi.proceed();
// 后拦截
long end=System.nanoTime();
// 获得和目标方法相关信息,都要通过mi
String name=mi.getMethod().getName();
System.out.println("----------------"+name+"执行了"+(end-begin)+"ns");
// 记得把返回值交给调用者
return res;
}
spring的AOP功能对于本人来讲理解起来比较困难,尤其是配置文件的写法。目前还有许多公司在用spring1.x框架,所以这两天花时间做一做实例,重要不在如何使用springAOP,而是学习spring框架的设计思想和巧妙的实现手段。
[ 本帖最后由 西鄙人 于 2010-12-6 11:05 编辑 ]