欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring面向切面编程AOP

程序员文章站 2022-07-12 14:10:53
...

感谢zejian_大佬的分享:

关于 Spring AOP (AspectJ) 你该知晓的一切
大佬的分享让我受益匪浅!

首先学习AOP前,弄清楚为什么要使用AOP?

AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。——取自百度百科

举个栗子有助于理解(一个支付转账的小栗子):
我们每次使用手机支付时,不管转账还是支付都需要验证支付信息密码。
Spring面向切面编程AOP
这时AOP的好处就体现出来了,我们可以将验证支付这部分内容分离出来,然后告诉Spring,你计划将它放在何处,什么时候使用它。

下面Spring总结知识

spring切面可以应用的五种通知:

前置通知(Before):在目标方法被调用之前调用通知功能;

后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;

返回通知(After-returning):在目标方法成功执行之后调用通知 ,可以获取方法返回值;

异常通知(After-throwing):在目标方法抛出异常后调用通知;

环绕通知(Around):通知报过了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为

  • 写一个类,我想在调用test方法前,做一点其它事情:
  `public class AopBean {
    public int i;
    public int test() {
        System.out.println("AopBean-->test");
        return 0;
    }

    public int test1() {
        System.out.println("AopBean-->test");
        return i;
    }

}

xml文件:

  <bean id="aopAspect" class="aop.AopAspect"></bean>
    <bean id="aopBean" class="aop.AopBean"></bean>
    <aop:config>
        <aop:aspect ref="aopAspect">
            <!--<aop:pointcut id="aop" expression="execution(* aop.AopBean.*(..))"></aop:pointcut>-->
            <aop:pointcut id="aop" expression="execution(* aop.AopBean.*(..))"></aop:pointcut>//设置一个切入点
            <aop:before method="before" pointcut-ref="aop"></aop:before>
            <aop:after method="doAfter" pointcut-ref="aop"></aop:after>
            <aop:after-returning method="doAfterReturning" pointcut-ref="aop" returning="returnVal"></aop:after-returning>
            <aop:after-throwing method="doAfterThrowing" pointcut-ref="aop"></aop:after-throwing>
        </aop:aspect>
    </aop:config>

切面类及切面方法:

public class AopAspect {
    public void before() {
        System.out.println("AopAspect--->before");
    }

    public void doAfter(){
        System.out.println("执行了after");
    }

    public void doAfterReturning(Object returnVal){
        System.out.println("方法结束调用可以获取返回值"+returnVal);
    }

    public void doAfterThrowing(){
        System.out.println("抛出异常时调用");
    }
}

测试代码:

    @Test
    public void test1() {
        ApplicationContext ctx=new ClassPathXmlApplicationContext("Spring-aop.xml");
        AopBean bean=(AopBean) ctx.getBean("aopBean");
        bean.test();
        System.out.println("-----------------------------------");
        bean.test1()
    }
}