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的五大通知类型
前置通知
- 在目标方法执行之前执行的通知
环绕通知
- 在目标方法执行之前,执行之后都会执行的通知
后置通知
- 在目标方法执行之后的通知
异常通知
- 在目标方法抛出异常后执行的通知
最终通知
- 无论如何都会在目标方法调用后执行
多个通知执行顺序
未出现异常
前置通知
环绕通知前
目标方法(添加用户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