📅  最后修改于: 2023-12-03 15:20:12.378000             🧑  作者: Mango
AOP (Aspect Oriented Programming) 是面向切面编程的缩写,它是一种编程思想,主要用于将分散在多个类中的横切关注点集中起来,从而提高代码的复用性、可维护性和可扩展性。AOP 通过重用一些共通的逻辑,减少代码的冗余,达到代码的精简和简洁。
几个概念:
Spring AOP 是 Spring 框架提供的一种 AOP 实现方式。它主要利用了 JDK 动态代理和 CGLIB 字节码生成技术来完成 AOP 的功能。Spring AOP 可以用于:
Spring AOP XML 配置主要包含以下几个元素:
<bean id="aspectBean" class="com.example.AspectBean"/>
<!-- before advice -->
<bean id="beforeAdvice" class="org.springframework.aop.MethodBeforeAdvice">
<property name="aspectBean" ref="aspectBean"/>
<property name="methodName" value="beforeMethod"/>
</bean>
<!-- after advice -->
<bean id="afterAdvice" class="org.springframework.aop.AfterReturningAdvice">
<property name="aspectBean" ref="aspectBean"/>
<property name="methodName" value="afterMethod"/>
</bean>
<!-- around advice -->
<bean id="aroundAdvice" class="org.springframework.aop.MethodInterceptor">
<property name="aspectBean" ref="aspectBean"/>
<property name="methodName" value="aroundMethod"/>
</bean>
<!-- throws advice -->
<bean id="throwsAdvice" class="org.springframework.aop.ThrowsAdvice">
<property name="aspectBean" ref="aspectBean"/>
<property name="methodName" value="exceptionMethod"/>
</bean>
<!-- pointcut declaration -->
<bean id="pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="patterns">
<list>
<value>com.example.service.*.*(..)</value>
</list>
</property>
</bean>
<!-- advisor declaration -->
<bean id="advisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="pointcut" ref="pointcut"/>
<property name="advice" ref="beforeAdvice"/>
<property name="advice" ref="afterAdvice"/>
<property name="advice" ref="aroundAdvice"/>
<property name="advice" ref="throwsAdvice"/>
</bean>
上面的配置声明了四种通知,分别是 before advice、after advice、around advice 和 throws advice ,还声明了一个 Pointcut 和一个 Advisor,其中 Pointcut 声明了哪些方法需要被拦截,Advisor 则关联了 Pointcut 和通知。
<bean id="aspect" class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">
<property name="expression" value="execution(* com.example.service..*.*(..))"/>
<property name="advice">
<bean id="myAdvice" class="com.example.MyAdvice"/>
</property>
</bean>
上面的配置声明了一个切面,可以通过 AspectJ 表达式语言来定义 Pointcut,该表达式指定了 execution,即被拦截的方法,该切面会应用 MyAdvice。
Spring AOP XML 配置主要包含通知声明和切面声明两部分。通知声明包括 before advice、after advice、around advice 和 throws advice,切面声明包括切入点和切面两个元素。Spring AOP 提供了很多拦截器,支持 JDK 和 CGLIB 两种代理方式,开发难度较低且易于使用。