1. 案例结构
2. 配置文件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:util="http://www.springframework.org/schema/util"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="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/util
http://www.springframework.org/schema/util/spring-util-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
">
<!--扫描MyAspect -->
<context:component-scan base-package="com.zhq.aspect"/>
<!--配置一个MyCalc -->
<bean class="com.zhq.aspect.MyCalc"/>
<!-- 配置切面类 -->
<bean id="myAspect" class="com.zhq.aspect.MyAspect"/>
<bean id="myLoggin" class="com.zhq.aspect.MyLoggin"/>
<!--切面配置 -->
<aop:config>
<!--切点表达式 -->
<aop:pointcut expression="execution(* com.zhq.aspect.MyCalc.*(..))" id="cut"/>
<!--配置切入点通知 -->
<aop:aspect ref="myAspect" order="2">
<aop:before method="beFore" pointcut-ref="cut"/>
<aop:after method="beAfter" pointcut-ref="cut"/>
<aop:after-throwing method="afterThrowing" pointcut-ref="cut"/>
<aop:after-returning method="afterReturning" pointcut-ref="cut" returning="r"/>
</aop:aspect>
<aop:aspect ref="myLoggin" order="1">
<aop:before method="beginLoggin" pointcut-ref="cut"/>
</aop:aspect>
</aop:config>
</beans>
2. 其他类
package com.zhq.aspect;
import java.util.Arrays;
import org.aspectj.lang.JoinPoint;
/**
* 切面类,存放切面
* */
public class MyAspect {
//通告,用于织入到某个指定的切入点。@Before表示此切面是一个前置通知,它会在方法执行前执行。
public void beFore(JoinPoint jp) {
//取所有参数
Object args[]=jp.getArgs();
//获取方法名
String name=jp.getSignature().getName();
System.out.println(name+"方法准备执行...");
System.out.println("输入参数:"+Arrays.toString(args));
}
public void beAfter() {
System.out.println("方法执行结束。");
}
//返回通知
public void afterReturning(JoinPoint jp,Object r) {
//获取方法名
String name=jp.getSignature().getName();
System.out.println(name+"开始返回结果...");
System.out.println("结果是:"+r);
}
//异常通知
public void afterThrowing(JoinPoint jp) {
//获取方法名
String name=jp.getSignature().getName();
System.out.println(name+"出现异常...");
}
}
package com.zhq.aspect;
public class MyCalc {
//连接点,织入点
public int add(int a,int b) {
return a+b;
}
public int div(int a,int b) {
return a-b;
}
public int chu(int a,int b) {
return a/b;
}
}
package com.zhq.aspect;
/**
* 切面类,存放切面
* */
public class MyLoggin {
public void beginLoggin() {
System.out.println("开始日志....");
}
}
package com.zhq.aspect;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext cxt=new ClassPathXmlApplicationContext("config/applicationContext.xml");
MyCalc ca=(MyCalc) cxt.getBean(MyCalc.class);
//普通测试
System.out.println(ca.add(10, 20));
System.out.println(ca.div(10, 20));
//异常测试
/*System.out.println(ca.chu(10,0));*/
}
}
3. 测试效果