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;可以完全控制切入点和通知以及他们的顺序。

优点:

  1. 使用proxyFactoryBean或者其他的Ioc相关类,来处理Aop代理的最重要的好处就是通知和切入点也可以由Ioc来管理。
  2. 被代理的类没有实现任何接口,使用CGLib代理,否则就是使用的JDK代理
  3. 通过设置proxyTargetClass为true,可强制使用CGLib
  4. 如果目标类实现一个或者多个接口,那么创建代理的类型将依赖proxyFactoryBean的配置。
  5. 如果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>

 

 

 

 

 

posted @ 2018-12-03 19:40  轻抚丶两袖风尘  阅读(347)  评论(0编辑  收藏  举报