一、AOP概念:
原理:将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。我们把通用服务具体设计为Advices,这些Advices根据我们的要求(pointCut),将这些Advices具体织入(Weave)到应用的这些可以插入的方法(JointPoint)中去。
(1)、joinpoint(连接点):其实就是插入点,一般对象在执行方法的时候可以被插入其他的功能。在spring中,只支持在Metthod层次上进行插入,而不支持在Field层次上进行插入,因为这样的话实际上已经对对象的状态产生影响了,不适合用来构件应用系统。
(2)、Advice:是你想向别的程序内部不同的地方注入的代码。它对应到Spring当中,就是那些具体执行操作的类。比如说BeforeAdivce之类的这些表示Aspect的类。
(3)、pointcut:定义了需要注入advice的位置,通常是某个特定的类的一个public方法。就是一堆配置信息,它描述了有那些Advices使用到那些JointPoint当中去。它对应到Spring当中,就是对应的ProxyFactoryBean当中的配置信息。Weave就是ProxyFactoryBean,从名字上也知道它是一个代理工厂,生成原方法的代理对象,然后将Aspect定义的这些功能动态增加到对象中去。
(4)、Advisor:是poincut和advice的装备器,是将advice注入主程序中预定义位置的代码。

代码解析:
<beans>
<!--定义了一个Advice,用来织入主程序-->
 <bean id="logBeforeAdvice" class="com.wyq.springAOP.LogBeforeAdvice"></bean>
 <bean id="helloSpeaker" class="com.wyq.springAOP.HelloSpeaker"></bean>
<!--定义了一个Advice,用来织入主程序-->
 <bean id="logAfterAdvice" class="com.wyq.springAOP.LogAfterAdvice"></bean>
<!--
定义了一个Advisor,用来将Advice与Joinpoint粘合在一起
我们用advisor的一个属性来指定它所需的advice-bean。
第二个属性则用正则表达式定义了pointcut,确保良好的性能和易读性。
-->
 <bean id="helloAdvice" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
  <property name="mappedName">
   <value>hello*</value>
  </property>
  <property name="advice">
   <ref bean="logBeforeAdvice"/>
  </property>
 </bean>
<!--
属性proxyInterface定义了接口类。

属性target指向本地配置的一个bean,这个bean返回一个接口的实现。

属性interceptorNames是唯一允许定义一个值列表的属性。这个列表包含所有需要在beanTarget上执行的advisor。注意,advisor列表的次序是非常重要的。
-->
 <bean id="helloProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
  <property name="proxyInterfaces">
   <value>com.wyq.springAOP.Ihello</value>
  </property>
  <property name="target">
   <ref bean="helloSpeaker"/>
  </property>
  <property name="interceptorNames">
   <list>
   <value>helloAdvice</value>
   <value>logAfterAdvice</value>
   </list>
  </property>
 </bean>
</beans>
(二)注意:Advice包括了Aspect(切面)的真正逻辑,由于缝合至Targets(目标)的时机不同,Spring提供了几种不同的Advices.
(1)、Before Advice-----会在目标对象的方法执行之前被呼叫,可以实现org.springframework.aop.MethodBeforeAdvice接口实现BeforeAdvice的逻辑。
(2)、After Advice  -----会在目标对象执行之后被呼叫,可以实现org.springframework.aop.AfterReturningAdvice接口实现AfterAdvice的逻辑。
(3)、Around Advice-----会在目标对象的前后执行,可以实现org.aopalliance.intercept.methodInterceptor接口实现Around Advice的逻辑。

代码:
public class LogInterceptor implements MethodInterceptor{
   public Object invoke(MethodInvocation invocation)throws Throwable{
      System.out.println("开始审核数据...");
      Object rval=invocation.proceed();
      System.out.println("审核数据结束...");
   }
}
(4)、Throw Advice-----在目标对象抛出异常时执行,可以实现org.springframework.aop.ThrowsAdvice接口实现Throw Advice的逻辑。
代码:
public class LogAfterAdvice implements ThrowsAdvice {
 public void afterThrowing(Method method,Object[] args,Object target,Throwable subclass)throws Throwable{
  System.out.print("审核数据出现异常");
 }
(三)、注意:Pointcut定义了Advice的应用时机,在Spring中,使用PointcutAdvisor将Pointcut与Advice结合成一个物件。
(1)、NameMatchMethodPointcutAdvisor-----在applicationContext.xml中实现org.springframework.aop.support.NameMatchMethodPoincutAdvisor,用来指定Advice所要应用目标对象的哪个方法之上。
代码:
<bean id="helloAdvisor"
          class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
       <property name="mappedName">
           <value>hello*</value>
       </property>
       <property name="advice">
           <ref bean="logBeforeAdvice"/>
       </property>
    </bean>
(2)、RegExpMethodPoincutAdvisor-----在applicationContext.xml中实现org.springframework.aop.support.RegexpMethodPointcutAdvisor这个类,可以任意控制所要代理的方法的名字。
.表示任何单一字元
+符合前一个字元一次或多次
*符合前一个字元0次或多次
\Escape任何Regular expression使用到的符号
代码:
<bean id="regExpAdvisor"
          class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
       <property name="pattern">
           <value>.*hello.*</value>
       </property>
       <property name="advice">
           <ref bean="logBeforeAdvice"/>
       </property>
    </bean>
(3)、ControlFlowPointcut-----在applicationContext.xml中实现org.springframework.support.ControlFlowPointcut类,作用是判断在指定的类别中,是否曾经有某个方法中要求您指定的目标物件执行某些动作。

posted on 2007-05-24 10:36  王永庆  阅读(800)  评论(0编辑  收藏  举报