Spring生成代理对象的过程?

  1. 创建容器对象的时候, 根据“切入点表达式”拦截的类,生成代理对象;

  2. 如果目标对象有实现接口,使用jdk代理!

  3. 如果目标对象没有实现接口,使用cglib代理!

  4. 从容器获取代理后的对象

  5. 执行代理对象的方法,在运行时期,动态植入“切面”类中的“通知”!

xml方式配置更便于维护

步骤:

  1. 引入aop 相关jar文件

  2. bean.xml 引入aop名称空间

  3. Aop配置

<?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:context="http://www.springframework.org/schema/context"
    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/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- dao实例加入容器 -->
    <bean id="userDao" class="cn.itcast.f_aop_xml.UserDao"></bean>

    <!-- 实例化切面类 -->
    <bean id="aop111" class="cn.itcast.f_aop_xml.TransactionAop"></bean>

    <!-- Aop相关配置 -->
    <aop:config>
        <!-- 切入点表达式定义 -->
        <aop:pointcut expression="execution(* com.matrix42.f_aop_xml.UserDao.*(..))" id="pt"/>

        <!-- 切面配置 -->
        <aop:aspect ref="aop111">

            <!-- 【环绕通知】 -->
            <aop:around method="arroud" pointcut-ref="pt"/>

            <!-- 【前置通知】 在目标方法之前执行 -->
            <aop:before method="beginTransaction" pointcut-ref="pt" />

            <!-- 【后置通知】 -->
            <aop:after method="commit" pointcut-ref="pt"/>

            <!-- 【返回后通知】 -->
            <aop:after-returning method="afterReturing" pointcut-ref="pt"/>

            <!-- 异常通知 -->
            <aop:after-throwing method="afterThrowing" pointcut-ref="pt"/>

        </aop:aspect>
    </aop:config>

</beans>