Spring AOP主要目的是为了面向切面编程,它的底层使用了动态代理技术
代理
我们先来看一下什么是代理
public class daili {
public static void main(String[] args) {
Dog dog = new DogProxy(new Dog());
System.out.println(dog.say());
}
}
/**
* 狗类
*/
class Dog{
public String say(){
return "汪汪";
}
}
/**
* 狗的代理类
*/
class DogProxy extends Dog{
private Dog dog;
public DogProxy(Dog dog){
this.dog = dog;
}
@Override
public String say(){
return super.say()+",芜湖~";
}
}
在这个例子中有两个类:狗类和它的代理类,它的代理类持有狗本身这个对象,并且还继承与它,并且覆盖了它的say方法。
那么在main方法中我们通过狗的代理类获得狗,同时把狗这个对象传进去时,我们就获得了一只背代理的狗,但我们使用时,并不知道它是被代理过的。
输出结果:
代理模式有以下几个优点
1、在不改变原有代码情况下对功能进行增强或覆盖
2、对使用方来说,不需要改变代码,就可以享受增强后的功能
Spring AOP是怎样使用的
编写Dog类,实现say方法
@Component
public class Dog {
public void say(){
System.out.println("汪汪");
}
}
编写切面类:
@Aspect
@Component
public class TestAspect {
/**
* 切入点
*/
@Pointcut("execution(public * AopTest.Dog.*())")
public void pointCut(){
}
@Before("pointCut()")
public void before(){
System.out.println("before 汪汪");
}
@After("pointCut()")
public void after(){
System.out.println("after 汪汪");
}
@Around("pointCut()")
public void around(ProceedingJoinPoint point) throws Throwable{
System.out.println("around 汪汪前");
point.proceed();
System.out.println("around 汪汪后");
}
@AfterReturning("pointCut()")
public void afterReturn() throws Throwable{
System.out.println("在你return之后汪汪");
}
}
这些代表什么意思?
public表示方法的所有权,可以省略不写
第一个*代表方法的返回类型, *匹配所有类型
AopTest代表报名
Dog类名,可用D*或D**来模糊匹配
最后一个*,代表方法名,就是say
后的()代表参数列表,空的代表没有传参
Test类
@SpringBootTest
public class DogTest {
@Resource
private Dog dog;
@Test
void say(){
dog.say();
}
}
执行结果
这是执行顺序