本篇文章,结合上一个代码实例,来使用感受一下Spring的AOP真正的作用。
作为一个入门的小demo,这里我们使用的所有方法都不涉及传参问题。步骤可以分为如下:
① 将目标类和切面类(封装了通知方法的类)加入到IOC容器中。
② 告诉Spring到底哪个是切面类。使用@Aspect注解。
③ 告诉Spring,切面类里面的每一个方法,都是何时何地运行。
(1)将目标类和切面类加入到IOC容器中。
/*
首先创建一个接口,这也是jdk底层动态代理传入的接口值照应
*/
public interface Calculator {
void add();
}
package com.cn.impl;
/*
实现接口
使用@Service注解,将这个类加入到容器中
*/
import com.cn.service.Calculator;
import org.springframework.stereotype.Service;
@Service
public class Calculatorimpl implements Calculator {
public void add(){
System.out.println("正在使用add方法");
}
}
package com.cn.util;
/*
切面类,使用@Commponent注解,将这个类加入到容器中
*/
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class Logutils {
@Before("execution(public void com.cn.service.Calculator.add())")
public void beforerLog(){
System.out.println("[前置通知]使用add方法完毕");
}
@After("execution(public void com.cn.service.Calculator.add())")
public void afterLog(){
System.out.println("[后置通知]使用add方法完毕");
}
@AfterReturning("execution(public void com.cn.service.Calculator.add())")
public void returnLog(){
System.out.println("[正常返回通知]使用add方法完毕");
}
@AfterThrowing("execution(public void com.cn.service.Calculator.add())")
public void throwLog(){
System.out.println("[异常通知]使用add方法完毕");
}
}
(2) 告诉Spring到底哪个是切面类。使用@Aspect注解。
如上代码所示,在切面类中使用了@Aspect注解
(3)告诉Spring,切面类里面的每一个方法,都是何时何地运行。
分别使用了@Before、@After、@AfterReturning、@AfterThrowing,四个注解对应不同的时刻,使用表达式,绑定对应方法。
这时候在xml文件中开启ioc注解扫描和aop的切面代理即可
<!--开启IOC注解扫描-->
<context:component-scan base-package="com.cn"></context:component-scan>
<!--启动aop切面代理-->
<aop:aspectj-autoproxy/>
运行结果如下