Spring AOP 代理模式和面向切面编程的好处

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();
    }
}

执行结果

这是执行顺序

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值