Spring 配置方式实现aop编程 (八)
Spring生成代理对象的过程?
-
创建容器对象的时候, 根据“切入点表达式”拦截的类,生成代理对象;
-
如果目标对象有实现接口,使用jdk代理!
-
如果目标对象没有实现接口,使用cglib代理!
-
从容器获取代理后的对象
-
执行代理对象的方法,在运行时期,动态植入“切面”类中的“通知”!
xml方式配置更便于维护
步骤:
-
引入aop 相关jar文件
-
bean.xml 引入aop名称空间
-
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>