AOP是对OOP的补充,它允许开发人员在不改变原来模型的基础上动态的修改模型以满足新的需求。
例如:开发人员可以在不改变原来业务逻辑模型的基础上可以动态的增加日志、安全或异常处理的功能。
给个例子:
1、创建一个接口以及实现这个接口的类。
TestAOPIn.java:
public interface TestAOPIn{public void doSomething();
}
TestAOPImpl.java:
public class TestAOPImpl{public void doSomething(){System.out.println("TestAOPImpl:do something.");}
}
2、配置SpringConfig.xml:
<beans><bean id="testAOPBean" class="org.springframework.aop.framework.ProxyactoryBean"><property name="target"><bean class="testAOPIn" singleton="false"/></property></bean>
</bean>
3、完成配置文件,编写测试代码
public class Test{public static void main(String[]args){ApplicationContext ctx = new FileSystemXmlApplicationContext("SpringConfig.xml");TestAOPIn t = (TestAOPIn)ctx.getBean("testAOPBean");t.dosomething();}
}
运行结果:TestAOPImpl:doSomething
编写完后,开发人员需要增加对doSomething()方法的跟踪,传统的输入输出也可以对其进行跟踪,但采用AOP方式就可以不修改原有模块完成相同功能。
为此需要提供用来跟踪函数调用的类
traceBeforeCall.java:
public class traceBeforeCall implements MethodBeforeAdvice{public void beforeCall(Method arg(),Object[]arg1,Object arg2) throws Throwable{System.out.println(beginCall doSomething);}
}
traceEndCall.java:
public class traceEndCall implements AfterReturingAdvice{public void afterCall(Object arg(),Method arg1,Object[]arg2,Object arg3) throws Throwable{System.out.prontln("endCall doSomething");}
}
只需在配置文件中配置在调用doSomething()方法之前需要调用traceBeforeCall类的方法,之后调用traceEndCall类的方法就可以达到目的。