Spring六:Spring AOP API 上
PointCut
PointCut是依靠NameMatchMethodPointCut实现,根据方法名字进行匹配;成员变量有:mappedNames,匹配方法名的集合。
Before Advice
- 是一个简单的通知类型
- 只有在进入方法之前被调用,不需要MethodInvocation对象
- 前置通知可以在连接点执行前插入自定义行为,但不能改变返回值。
- 实现方式是:实现MethodBeforeAdvice抽象类。
Throws Advice
- 如果连接点抛出异常,throw advice 在连接点返回后被调用。
- 如果throws-advice本身方法抛出异常,那么他将覆盖原有的异常。
- 接口org.springframework.aop.ThrowsAdvice不包含任何方法,仅仅是一个申明,实现类需要实现下面的方法。
- 实现方式是实现ThrowsAdvice接口类。
如下是Throws Advice的声明:
After Returning Advice
- 是一个后置通知,他必须实现org.springframework.aop.AfterReturningAdvice接口。
- 可以访问返回值(但是不能修改返回值),被调用的方法,方法参数,和目标。
- 如果抛出异常,将抛出拦截器链,替代返回值。
Advice APi inspring:Advisor是仅包含一个切入点表达式关联的单个通知方面,除了Introduction是,Advice可以用于任何通知。
ProxyFactoryBean
创建Spring Aop代理的基本方法是使用org.springframework.aop.framework.proxyFactoryBean;可以完全控制切入点和通知以及他们的顺序。
优点:
- 使用proxyFactoryBean或者其他的Ioc相关类,来处理Aop代理的最重要的好处就是通知和切入点也可以由Ioc来管理。
- 被代理的类没有实现任何接口,使用CGLib代理,否则就是使用的JDK代理
- 通过设置proxyTargetClass为true,可强制使用CGLib
- 如果目标类实现一个或者多个接口,那么创建代理的类型将依赖proxyFactoryBean的配置。
- 如果proxyFactoryBean的proxyInterFaces属性被设置为一个或者多个限定接口名,基于JDK代理将被创建。
XMl配置如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 6 xsi:schemaLocation="http://www.springframework.org/schema/beans 7 http://www.springframework.org/schema/beans/spring-beans.xsd 8 9 http://www.springframework.org/schema/aop 10 http://www.springframework.org/schema/aop/spring-aop-4.0.xsd"> 11 12 13 <bean id="xinAfterReturningAdvice" class="Aop_Class.XinAfterReturningAdvice"></bean> 14 15 <bean id="xinBeforeAdvice" class="Aop_Class.XinBeforeAdvice"></bean> 16 17 <bean id="xinMethodInterceptor" class="Aop_Class.XinMethodInterceptor"></bean> 18 19 <bean id="xinThrowsAdvice" class="Aop_Class.XinThrowsAdvice"></bean> 20 21 <bean id="bizLogicImpleTarget" class="Aop_Class.BizLogicImpl"></bean> 22 23 <!-- 以上是将所有的class导入容器中 --> 24 25 <bean id="pointCutBean" class="org.springframework.aop.support.NameMatchMethodPointcut"> 26 <property name="mappedNames"> 27 <list> 28 <value>sa*</value> 29 <!-- 以sa开始的函数 --> 30 </list> 31 </property> 32 </bean> 33 34 <bean id="defaultAdvice" class="org.springframework.aop.support.DefaultPointcutAdvisor"> 35 <property name="advice" ref="xinBeforeAdvice"/> 36 <property name="pointcut" ref="pointCutBean"/> 37 </bean> 38 39 <bean id="bizLogicImpl" class="org.springframework.aop.framework.ProxyFactoryBean"> 40 41 <property name="proxyInterfaces"> 42 <value>Aop_Class.BizLogic</value> 43 </property> 44 <property name="target"> 45 <ref bean="bizLogicImpleTarget"></ref> 46 </property> 47 48 <property name="interceptorNames"> 49 <list> 50 <!-- <value>defaultAdvice</value> --> 51 <value>xinAfterReturningAdvice</value> 52 <value>xinBeforeAdvice</value> 53 <value>xinMethodInterceptor</value> 54 <value>xinThrowsAdvice</value> 55 </list> 56 </property> 57 </bean> 58 59 60 </beans>