AOP with spring

        近日由于要对业务逻辑层的返回值进行一下处理,所以看看了spring 2.0中关于AOP开发部分的内容,在这里做个笔记,以免过几天又给忘了。如果能对您有帮助,就帮忙顶一下。

一、AOP的基本概念

  1. Aspect(切面),一个横切多个对象的关注点的模块;
  2. Joint point(连接点),程序执行中的一个点,比如执行一个方法或者是处理一个异常;
  3. Advice(建议??),一个aspect在一个特殊的Join point的行为或动作。包括:before, after returning, after throwing, after(finally), around五种;
  4. Pointcut(切入点),匹配连接点一个断言。advice与Pointcut表达式相关联,并且在任何join point与pointcut相匹配时执行。

二、AOP with spring
          spring 2.0引入了一个简单并且功能更加强大的方法来自定义aspect。自定义aspect时有两种风格:schema-based和@aspectJ。

  1. @aspectJ风格指在一个正常的java类上添加java 5的注解来声明一个aspect,它是由AspectJ项目提出的,详细信息请查看http://www.eclipse.org/aspectj,这里不讨论这种方式。
  2. shcema-based风格是指在spring bean的配置文件中通过新的"aop"命名空间标记定义一个aspect。
aop命名空间定义
  1. <beans xmlns="http://www.springframework.org/schema/beans"      
  2.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      
  3.        xmlns:aop="http://www.springframework.org/schema/aop"      
  4.        xsi:schemaLocation="       
  5.         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd       
  6.         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">  

三、schema-based

定义aspect

 

  1. <aop:config>  
  2.   <aop:aspect id="myAspect" ref="aBean">  
  3.   ...   
  4.    aop:aspect>  
  5. >  
  6. <bean id="aBean" class="...">  
  7. ...   
  8. >  

 

 

定义pointcut
  1. <aop:config>  
  2.    <aop:pointcut id="businessService"  
  3. expression="execution(* com.xyz.myapp.service.*.*(..))"/>  
  4. >  

 

定义Advice

 

  1. <aop:aspect id="beforeExample" ref="aBean">  
  2.    <aop:before pointcut-ref="dataAccessOperation" method="doAccessCheck"/>  
  3.   <aop:after-returning pointcut-ref="dataAccessOperation"returning="retVal" method="doAccessCheck"/>  
  4.   <aop:after-throwing pointcut-ref="dataAccessOperation" throwing="dataAccessEx" method="doRecoveryActions"/>  
  5.   <aop:after pointcut-ref="dataAccessOperation" method="doReleaseLock"/>  
  6.   <aop:around pointcut-ref="businessService" method="doBasicProfiling"/>  
  7. ...   
  8. >  

 

四、例子

配置
  1. <aop:config>  
  2.     <aop:pointcut id="pointcut_lazyProcess"    
  3.         expression="this(com.xucons.arch.BusinessLogic) and execution(public !void *(..))"/>  
  4.   
  5.     <aop:aspect id="aspect_lazyProcess" ref="lazyProcess">  
  6.         <aop:around  
  7.             pointcut-ref="pointcut_lazyProcess"  
  8.             method="processUninitializedObject"/>          
  9.     aop:aspect>  
  10. >  
  11.   
  12. <bean id="lazyProcess" class="com.qusiness.arch.rt.LazyProcess" />  

      

实现
  1. public class LazyProcess {   
  2.     static Logger logger = Logger.getLogger(LazyProcess.class.getName());   
  3.        
  4.     public Object processninitializedObject(ProceedingJoinPoint pjp) throws Throwable {   
  5.         Object retVal = pjp.proceed();           if (retVal != null) {   
  6.             logger.info(">>processing uninitialized business object...");   
  7.             if (retVal instanceof Date ) {   
  8.                 retVal = new Date(((Date) retVal).getTime());   
  9.             } else {   
  10.                 process(retVal);   
  11.             }   
  12.         }          
  13.         return retVal;   
  14.     }   
  15. }  

 

  

你可能感兴趣的:(eclipse,spring,AOP,bean)