📜  spring aop xml 定义 - Java (1)

📅  最后修改于: 2023-12-03 15:20:12.378000             🧑  作者: Mango

Spring AOP XML 定义

什么是 AOP?

AOP (Aspect Oriented Programming) 是面向切面编程的缩写,它是一种编程思想,主要用于将分散在多个类中的横切关注点集中起来,从而提高代码的复用性、可维护性和可扩展性。AOP 通过重用一些共通的逻辑,减少代码的冗余,达到代码的精简和简洁。

几个概念:

  • Aspect(切面):一个关注点的模块化,这个关注点可能会横切多个对象。
  • Join point(连接点):程序执行过程中能够插入切面的点,比如方法调用前、调用后、抛出异常、方法返回等等。
  • Advice(通知):切面在连接点处执行的操作,包括 Around、Before 和 After 等不同类型。
  • Pointcut(切入点):一组连接点的集合,定义了切面在哪些地方生效。
  • Introduction(引入):在不修改类代码的前提下,为类添加新的方法和属性。
  • Target object(目标对象):被一个或者多个切面通知的对象。
  • AOP proxy(AOP 代理):AOP 框架创建的对象,包含了目标对象和通知。
Spring AOP 的实现方式

Spring AOP 是 Spring 框架提供的一种 AOP 实现方式。它主要利用了 JDK 动态代理和 CGLIB 字节码生成技术来完成 AOP 的功能。Spring AOP 可以用于:

  • 事务管理
  • 安全性检查
  • 日志记录
  • 性能监视
  • 异常处理
  • 缓存
  • 扩展等等
Spring AOP XML 配置

Spring AOP XML 配置主要包含以下几个元素:

1. 通知声明
<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 和通知。

2. 切面声明
<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 两种代理方式,开发难度较低且易于使用。