环境依赖
spring基础包
commons-logging-1.1.3.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
面向切面包
spring-aop-4.0.0.RELEASE.jar
spring-aspects-4.0.0.RELEASE.jar
加强版面向切面包
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.4.RELEASE.jar
计算器日志例
1、定义接口:
public interface Calculator {
public int add(int a,int b);
public int sub(int a,int b);
public int mul(int a,int b);
public int div(int a,int b);
}
2、定义实现类:
@Service
public class MyCalculator implements Calculator{
@Override
public int add(int a, int b) {
return a+b;
}
@Override
public int sub(int a, int b) {
return a-b;
}
@Override
public int mul(int a, int b) {
return a*b;
}
@Override
public int div(int a, int b) {
return a/b;
}
}
3、定义切面类:
@Aspect
@Component
public class LogUtils {
//想在执行目标方法之前
//写切入点表达式 execution(访问权限符 返回值类型 方法签名)
@Before('execution(public int comm.myaop.Calculator.MyCalculator.*(int,int))') //*表示所有方法
public static void LogStart(){
System.out.println('【xxx】方法开始执行');
}
//想在目标方法正常执行之后
@AfterReturning('execution(public int comm.myaop.Calculator.MyCalculator.*(int,int))')
public static void LogReturn(){
System.out.println('【xxx】方法正常执行完成');
}
//想在目标方法异常之后执行
@AfterThrowing('execution(public int comm.myaop.Calculator.MyCalculator.*(int,int))')
public static void LogException(){
System.out.println('【xxx】方法出现异常,异常信息是:');
}
//想在目标方法结束之后执行
@After('execution(public int comm.myaop.Calculator.MyCalculator.*(int,int))')
public static void End(){
System.out.println('【xxx】方法结束了');
}
}
4、配置SpringIOC容器
<!-- 扫描包下的注解(Component Controller Service Repository)-->
<context:component-scan base-package='comm.myaop'></context:component-scan>
<!-- 开启注解对AOP的支持-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
5、测试
public class Test01 {
private static ApplicationContext ioc = new ClassPathXmlApplicationContext('applicationContext.xml');
public static void main(String[] args) {
// 1、从ioc容器中拿到目标对象,注意如果想要用类型,一定用它的接口,不要用它本类
Calculator bean = ioc.getBean(Calculator.class);
bean.add(1,2);
// 2、从ioc容器中拿到目标对象,使用组件id(类名首字母小写)
// Calculator bean2 = (Calculator)ioc.getBean('myCalculator');
// System.out.println(bean2);
// System.out.println(bean2.getClass());
//bean.add(1,2);
}
}
切入点表达式
1、匹配全类下有两个int参数的方法
execution(public int comm.myaop.Calculator.MyCalculator.*(int,int))
2、匹配全类下第一个是Int第二个是任意类型的方法
execution(public int comm.myaop.Calculator.MyCalculator.*(int,*)
3、匹配类名以My开头r结尾的两个Int参数的方法
execution(public int comm.myaop.Calculator.My*r.*(int,int))
4、匹配任意个参数任意类型的方法
execution(public int comm.myaop.Calculator.MyCalculator.*(..))
5、匹配一层路径下的所有带两个int参数的方法
execution(public int comm.myaop.Calculator.*.*(int,int))
6、匹配多层路径下的所有带两个int参数的方法
execution(public int comm.myaop.Calculator..*(int,int))
还支持"&&"、"||"、“|”等逻辑匹配