其他分享
首页 > 其他分享> > Spring简介以及常见的面试题(五)

Spring简介以及常见的面试题(五)

作者:互联网

切入点表达式

within表达式

通过类名进行匹配,是一种粗粒度的切入点表达式,不可以指定某个方法进行增强,以类作为基本的单位

在Spring的约束文件中配置切入点和切面(within切入点表达式)

    <!--添加Spring AOP相关的约束
    xmlns:aop="http://www.springframework.org/schema/aop"
    http://www.springframework.org/schema/aop/spring-aop.xsd
    -->
    <!--配置包扫描-->
    <context:component-scan base-package="cn.tedu"></context:component-scan>
    <!--注释配置-->
    <context:annotation-config></context:annotation-config>
    <!--配置AOP-->
    <aop:config>
        <!--配置切面类-->
        <aop:aspect ref="firstAspect">
            <!--指定切入点规则,通知方法-->
            <aop:before method="before" pointcut="within(cn.tedu.service.UserServiceImpl)"></aop:before>
        </aop:aspect>
    </aop:config>
</beans>

execution表达式

通过方法进行匹配,是一种细粒度的切入点表达式,以方法作为基本的单元
<aop:config>
        <aop:pointcut id="pc01" expression="execution(* cn.tedu.service..*(..))"/>
        <aop:aspect ref="firstAspect">
            <aop:before method="before" pointcut-ref="pc01"></aop:before>
        </aop:aspect>
    </aop:config>

Spring的五大通知类型

前置通知

  1. 在目标方法执行之前执行的通知

环绕通知

  1. 在目标方法执行之前,执行之后都会执行的通知

后置通知

  1. 在目标方法执行之后的通知

异常通知

  1. 在目标方法抛出异常后执行的通知

最终通知

  1. 无论如何都会在目标方法调用后执行

多个通知执行顺序

未出现异常
前置通知
环绕通知前
目标方法(添加用户cn.tedu.domain.User@710f4dc7)
最终通知
环绕通知后
后置通知
出现异常()
前置通知
环绕通知前
目标方法(添加用户cn.tedu.domain.User@710f4dc7)
最终通知
异常通知

出现多个切面类时,采用了责任链设计模式,切面的配置顺序决定了通知的执行顺序。以两个切面为例:具体执行过程如下:

web层调用service层目标方法时,会经过第一个切面,执行前置通知和环绕前通知,环绕通知调用proceed()时进入下一个切面,执行第二个切面的前置通知,和环绕前通知,进入第二个切面的proceed的方法,放行调用目标方法,下面进入第二个切面的环绕后通知,和后置通知,最终通知,在进入第一个切面层,环绕后通知,和后置通知,最终通知,响应给web层
代码执行结果
    前置通知
    环绕通知前
    second前置通知
    second环绕通知前
    添加用户cn.tedu.domain.User@2de23121
    second最终通知
    second环绕通知后
    second后置通知
    最终通知
    环绕通知后
    后置通知

标签:面试题,Spring,前置,切面,简介,通知,环绕,执行,方法
来源: https://blog.csdn.net/Niklaus1028/article/details/118598959