该简单例子实现方法的前置增强打印日志,简单的来说就是在调用某个方法之前会调用另一个方法
普通类:
Calculator
@Component
public class Calculator {
public int add(int i,int j){
return i+j;
}
public int sub(int i,int j){
return i-j;
}
public int mul(int i,int j){
return i*j;
}
public int div(int i,int j){
return i/j;
}
}
通过@Component注解将该类添加到IOC容器,在IOC容器中可以通过getBean("calculator")获得实例
切面:
LoggingAspect
@Aspect
@Component
public class LoggingAspect {
@Before("execution(public int springAop.Calculator.*(..))")
public void beforMethod(JoinPoint joinPoint){
String methodName=joinPoint.getSignature().getName();
List<Object> s=Arrays.asList(joinPoint.getArgs());
System.out.println(methodName+"方法开始之前,它的参数:"+s);
}
}
指定了Calculator类中的所有发放都有个beforMethod()前置方法
@Aspect;@Before;JoinPoint;都是org.aspectj.lang包下的
@Aspect注解指定了该类为切面
execution(public int springAop.Calculator.*(..))可以换为execution(* springAop.Calculator.add(int,int))表明匹配返回值和修饰符为任意类型的add(int ,int )方法
配置文件:
<context:component-scan base-package="springAop"></context:component-scan>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
有了第一行才能使用注解,有了第二行才能使用AOP
测试方法和结果:
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
Calculator c=(Calculator) ctx.getBean("calculator");
int a=c.add(3, 4);
System.out.println("执行方法后的结果:"+a);
a=c.div(6, 2);
System.out.println("执行方法后的结果:"+a);
}