Computer.java
package com.wh.spring_aop;
public class Computer {
public void playLOL(){
System.out.println("LOL进行中...");
}
public String result(boolean flag){
System.out.println("公布比赛结果...");
if(flag){
return "您赢了";
}else{
int a=10/0;
return "您输了";
}
}
}
AopProxy.java
package com.wh.spring_aop;
import org.aspectj.lang.JoinPoint;
/**
* 完成AOP的步骤
1、切入点程序。
2、切面程序。
3、通过配置文件将切面程序插入到切入点程序的某个位置上(通知)
*
*/
public class AopProxy {
public void addBefore(JoinPoint jp){
System.out.println("AOP前置通知!");
}
public void addAfterReturn(Object returnResult){
if(returnResult!=null){
System.out.println("AOP后置通知!"+returnResult);
}
System.out.println("AOP后置通知");
}
public void addAfter(){
System.out.println("AOP最终通知");
}
public void addThrow(Throwable e){
System.out.println("AOP异常通知 异常信息是: "+e.getMessage());
}
}
applicationContext.xml
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xmlns:c="http://www.springframework.org/schema/c" xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<bean id="computer" class="com.wh.spring_aop.Computer" />
<bean id="aopProxy" class="com.wh.spring_aop.AopProxy" />
<aop:config>
<!-- 虽然返回值类型可以任意 方法名任意 参数类型任意 ,但是参数个数不是任意的,有几个星号就代表有几个参数,参数个数不匹配,则不会执行aop -->
<aop:pointcut expression="execution(* com.wh.spring_aop.Computer.*(*))" id="computerCut" /><!--此处为切入点 -->
<aop:aspect ref="aopProxy"><!-- 此处为切面 -->
<!-- AOP前置通知 -->
<aop:before method="addBefore" pointcut-ref="computerCut" /><!-- 此处为通知 -->
<!-- AOP后置通知:在目标组件的方法正常执行并返回参数后执行的程序。
切面程序:后置通知的切面程序中可以获取到目标方法返回参数,但需要在配置文件中声明参数名,依赖spring容器注入参数值。
returning="returnResult"里的值要与AopProxy里的方法里的参数名一致,否则报错
-->
<aop:after-returning method="addAfterReturn" pointcut-ref="computerCut" returning="returnResult"/>
<!-- AOP异常通知:在目标组件的方法抛出异常信息后执行的程序。
切面程序:异常通知的切面程序中可以获取到目标组件抛出的异常信息,需要在配置文件上声明异常参数名,依赖spring容器注入参数值。
-->
<aop:after-throwing method="addThrow" pointcut-ref="computerCut" throwing="e"/>
<!-- AOP最终通知:在目标组件的方法正常执行后执行,或在异常通知之前执行。 -->
<aop:after method="addAfter" pointcut-ref="computerCut"/>
</aop:aspect>
</aop:config>
</beans>
TestMVC.java
package com.wh.spring_aop;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestMVC {
@Test
public void test01(){
@SuppressWarnings("resource")
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Computer computer =(Computer)ac.getBean("computer");
//computer.playLOL();
computer.result(false);
}
}
运行结果:
AOP前置通知!
公布比赛结果...
AOP异常通知 异常信息是: / by zero
AOP最终通知