springAOP

作者: 风雪_夜归人 | 来源:发表于2023-11-17 22:17 被阅读0次

    去北京看天安门

    • 起始对象 没有真实存在
    • 目标对象 北京
    • 代理对象 代驾(spring帮助我们创建,责任链模式)
    • 切面对象 中间经过城市(山东、天津)
    • 切入点 目标对象中的方法(看天安门 )
    • 连接点 切面对象中的方法(山东吃饭、天津睡觉 +加油)
    • 建议/通知 连接点中执行的过程(连接点方法中执行的过程,代码)
      before 前置建议/通知
      after-return后置建议/通知
      after-throwing异常建议/通知
      after最终建议/通知
      around环绕建议/通知(前后建议/通知)

    Application.xml配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop.xsd">
    
        <bean id="controller" class="controller.TestController"></bean>
        <bean id="aspect1" class="aspect.Aspect1"></bean>
        <bean id="aspect2" class="aspect.Aspect2"></bean>
    
    <!--    给切面对象一个说明-->
        <aop:config>
    <!--        需要说明哪一个, 哪一些对象是切面对象-->
            <aop:aspect id="a1" ref="aspect1">
    <!--            说明切点  目标对象中的方法-->
                <aop:pointcut id="abc" expression="execution(* controller.TestController.test())"/>
    <!--            切面对象做的建议方式(链接点执行)-->
                <aop:before method="beforeMethod" pointcut-ref="abc"></aop:before>
                <aop:around method="around" pointcut-ref="abc"></aop:around>
                <aop:after-returning method="afterMethod" pointcut-ref="abc"></aop:after-returning>
                <aop:after method="after" pointcut-ref="abc"></aop:after>
                <aop:after-throwing method="afterThrowingMethod" pointcut-ref="abc"></aop:after-throwing>
            </aop:aspect>
    
            <aop:aspect id="a2" ref="aspect2">
                <aop:pointcut id="abca" expression="execution(* controller.TestController.test())"/>
                <aop:before method="beforeMethod" pointcut-ref="abca"></aop:before>
                <aop:around method="around" pointcut-ref="abca"></aop:around>
                <aop:after-returning method="afterMethod" pointcut-ref="abca"></aop:after-returning>
                <aop:after method="after" pointcut-ref="abca"></aop:after>
                <aop:after-throwing method="afterThrowingMethod" pointcut-ref="abca"></aop:after-throwing>
            </aop:aspect>
        </aop:config>
    </beans>
    

    代码如下:

    切面类Aspect1 :

    public class Aspect1 {
    
        public void beforeMethod(){
            System.out.println("快说啊 快说啊 快说啊~~~");
        }
    
        public void afterMethod(){
            System.out.println("已经结束看");
        }
    
        public void after(){
            System.out.println("最终方法 哈哈哈");
        }
    
        public void afterThrowingMethod(){
            System.out.println("出现异常了");
        }
    
    
        public void around(ProceedingJoinPoint pjt) throws Throwable {
            System.out.println("环绕方法before");
            pjt.proceed();
            System.out.println("环绕方法after");
        }
    }
    

    切面类Aspect2 :

    public class Aspect2 {
    
        public void beforeMethod(){
            System.out.println("2快说啊 快说啊 快说啊~~~2");
        }
    
        public void afterMethod(){
            System.out.println("2已经结束看2");
        }
    
        public void after(){
            System.out.println("2最终方法 哈哈哈2");
        }
    
        public void afterThrowingMethod(){
            System.out.println("2出现异常了2");
        }
    
    
        public void around(ProceedingJoinPoint pjt) throws Throwable {
            System.out.println("2环绕方法before2");
            pjt.proceed();
            System.out.println("2环绕方法after2");
        }
    }
    

    切点类TestController:

    public class TestController {
    
        public void test(){
    //        System.out.println(1/0);
            System.out.println("我最帅!!!");
    
        }
    }
    

    写一个测试类:

    public class TestMain {
        public static void main(String[] args) {
    
            BeanFactory beanFactory = new ClassPathXmlApplicationContext("ApplicationContext.xml");
            TestController controller = (TestController) beanFactory.getBean("controller");
            controller.test();
        }
    }
    

    运行程序:

    快说啊 快说啊 快说啊~~~
    环绕方法before
    2快说啊 快说啊 快说啊~~~2
    2环绕方法before2
    我最帅!!!
    2环绕方法after2
    2已经结束看2
    2最终方法 哈哈哈2
    环绕方法after
    已经结束看
    最终方法 哈哈哈
    

    总结:
    <aop:config></aop:config>标签表示对切面对象的说明
    <aop:aspect id="a1" ref="aspect1"> id可有可无,ref属性是给下面标签使用
    <aop:pointcut>告知切点在哪里,目标对象中的方法
    <aop:before>在目标方法执行前执行
    <aop:around>在目标方法执行前和后执行,如果有before执行顺序在before之后
    <aop:after-returning>在目标方法执行后执行
    <aop:after-throwing>在目标方法执行异常时执行

    before after执行中的内存情况
    image.png
    around执行中的内存情况
    image.png

    相关文章

      网友评论

          本文标题:springAOP

          本文链接:https://www.haomeiwen.com/subject/drtswdtx.html