av亚洲精华国产精华精华,校园春色综合网,天天爽天天狠久久久http://www.aygfsteel.com/cjwang-21/category/40983.html我是一只弱小的毛毛蟲,想像有一天可以成為強壯的挖土機, 擁有挖掘夢想的神奇手套。。。zh-cnWed, 22 Jul 2009 15:20:12 GMTWed, 22 Jul 2009 15:20:12 GMT60spring的aop用法個人使用總結http://www.aygfsteel.com/cjwang-21/archive/2009/07/22/287925.html逆水深寒逆水深寒Wed, 22 Jul 2009 14:39:00 GMThttp://www.aygfsteel.com/cjwang-21/archive/2009/07/22/287925.htmlhttp://www.aygfsteel.com/cjwang-21/comments/287925.htmlhttp://www.aygfsteel.com/cjwang-21/archive/2009/07/22/287925.html#Feedback0http://www.aygfsteel.com/cjwang-21/comments/commentRss/287925.htmlhttp://www.aygfsteel.com/cjwang-21/services/trackbacks/287925.html

 AOPAspect-Oriented Programming,面向切面編程),可以說是OOP面向對象編程)的補充和完善。OOP引入封裝、繼承和多態性等概念來建立一種對象層次結構,用以模擬公共行為的一個集合。當我們需要為分散的對象引入公共行為的時候,OOP則顯得無能為力。也就是說,OOP允許你定義從上到下的關系,但并不適合定義從左到右的關系。例如日志功能。日志代碼往往水平地散布在所有對象層次中,而與它所散布到的對象的核心功能毫無關系。對于其他類型的代碼,如安全性、異常處理和透明的持續性也是如此。這種散布在各處的無關的代碼被稱為橫切(cross-cutting)代碼,在OOP設計中,它導致了大量代碼的重復,而不利于各個模塊的重用。

 而AOP技術則恰恰相反,它利用一種稱為“橫切”的技術,剖解開封裝的對象內部,并將那些影響了多個類的公共行為封裝到一個可重用模塊,并將其名為“Aspect”,即方面。所謂“方面”,簡單地說,就是將那些與業務無關,卻為業務模塊所共同調用的邏輯或責任封裝起來,便于減少系統的重復代碼,降低模塊間的耦合度,并有利于未來的可操作性和可維護性。AOP代表的是一個橫向的關系,如果說“對象”是一個空心的圓柱體,其中封裝的是對象的屬性和行為;那么面向方面編程的方法,就仿佛一把利刃,將這些空心圓柱體剖開,以獲得其內部的消息。而剖開的切面,也就是所謂的“方面”了。然后它又以巧奪天功的妙手將這些剖開的切面復原,不留痕跡。

    Spring支持四種攔截類型:目標方法調用前(before),目標方法調用后(after),目標方法調用前后(around),以及目標方法拋出異常(throw)。

    前置攔截的類必須實現MethodBeforeAdvice接口,實現其中的before方法。

    后置攔截的類必須實現AfterReturningAdvice接口,實現其中的afterReturning方法。

    環繞攔截的類必須實現MethodInterceptor接口,實現其中的invoke方法。環繞攔截是唯一可以控制目標方法是否被真正調用的攔截類型,也可以控制返回對象。而前置攔截或后置攔截不能控制,它們不能印象目標方法的調用和返回。
但是以上的攔截的問題在于,不能對于特定方法進行攔截,而只能對某個類的全部方法作攔截。所以下面引入了兩個新概念:切入點引入通知

切入點的定義相當于更加細化地規定了哪些方法被哪些攔截器所攔截,而并非所有的方法都被所有的攔截器所攔截。在ProxyFactoryBean的屬性中,interceptorNames屬性的對象也由攔截(Advice)變成了引入通知(Advisor),正是在Advisor中詳細定義了切入點(PointCut)和攔截(Advice)的對應關系,比如常見的基于名字的切入點匹配(NameMatchMethodPointcutAdvisor類)和基于正則表達式的切入點匹配(RegExpPointcutAdvisor類)。這些切入點都屬于靜態切入點,因為他們只在代理創建的時候被創建一次,而不是每次運行都創建。

下面是spring的配置文件 當然aop的配置方式有許多種,這只是其中一種

 

<!-- 獲取相應的instance對象 并且不被aop攔截 -->
   
<bean id="oaTaskInstanceService4Log" parent="transactionProxy">
        
<property name="target">
            
<bean
                
class="com.oa.task.service.impl.OaTaskInstanceServiceImpl">
                
<property name="oaTaskInstanceDao">
                    
<ref local="oaTaskInstanceDao"/>
                
</property>
            
</bean>
        
</property>
    
</bean>
   
<!-- instance日志所需DAO -->
   
<bean id="oaTaskInstanceLogDao" class="com.oa.task.dao.OaTaskInstanceLogDao">
      
<property name="sessionFactory" ref="sessionFactory"></property>
   
</bean>
   
<!-- instance日志所需Service  此接口為 日志的業務操作接口-->
    
<bean id="oaTaskInstanceLogService" parent="transactionProxy"> 
        
<property name="target">
            
<bean
                
class="com.oa.task.service.impl.OaTaskInstanceLogServiceImpl">
                
<property name="oaTaskInstanceLogDao">
                    
<ref local="oaTaskInstanceLogDao"/>
                
</property>
                
<property name="sysOperDao">
                    
<ref bean="sysOperDao" />
                
</property>
                
<property name="ibatisBase">
                    
<ref bean="ibatisBase" />
                
</property>
            
</bean>
        
</property>
    
</bean>
   
<!-- instance日志AOP攔截類 -->
   
<bean id="oaTaskInstanceLogOper" class="com.oa.task.log.OaTaskInstanceLogOper">
           
<property name="oaTaskInstanceLogService">
            
<ref local="oaTaskInstanceLogService" />
        
</property>
        
<property name="oaTaskInstanceService">
            
<ref local="oaTaskInstanceService4Log" />
        
</property>
   
</bean>
   
   
<!-- instance日志AOP配置綁定 -->
   
<bean id="oaTaskInstanceLogAutoProxy" 
          
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
          
<property name="beanNames">
             
<list>
               
<value>oaTaskInstanceService</value>  //攔截的業務接口 oaTaskInstanceService內所有方法都進行攔截
             </list>
          
</property>
          
<property name="interceptorNames">
             
<list>
                
<value>oaTaskInstanceLogOper</value>  //攔截器
             
</list>
          
</property>
    
</bean>
   下面是 攔截器oaTaskInstanceLogOper類,采用的是環繞攔截的方式。
public class OaTaskInstanceLogOper  implements MethodInterceptor{
    /**
     * 當更新動作發生時的記錄
     
*/
    
public Object invoke(MethodInvocation invocation) throws Throwable {
        String method 
= invocation.getMethod().getName();
        Object result 
= null;
        
if(MODIFY_INSTANCE.equals(method)){//修改日志(業務邏輯 判斷方法)
            ......//業務操作,進行日志的記錄
            result
=invocation.proceed(); 
        }
else {//不做任何日志
            result=invocation.proceed();//調用原來的方法
        }
        
return result;
    }


}




逆水深寒 2009-07-22 22:39 發表評論
]]>
struts2.0幾種標簽用法http://www.aygfsteel.com/cjwang-21/archive/2009/07/21/287642.html逆水深寒逆水深寒Tue, 21 Jul 2009 06:21:00 GMThttp://www.aygfsteel.com/cjwang-21/archive/2009/07/21/287642.htmlhttp://www.aygfsteel.com/cjwang-21/comments/287642.htmlhttp://www.aygfsteel.com/cjwang-21/archive/2009/07/21/287642.html#Feedback0http://www.aygfsteel.com/cjwang-21/comments/commentRss/287642.htmlhttp://www.aygfsteel.com/cjwang-21/services/trackbacks/287642.html設置變量
<s:set name="maxRowIndex" value="%{formInfo.maxRowIndex}"/>

for 循環
<s:bean name="org.apache.struts2.util.Counter" id="counter">
  <s:param name="first" value="0" />
  <s:param name="last" value="#maxRowIndex" />
  <s:iterator>
  </s:iterator>
</s:bean>

迭代<s:iterator>用于將List、Map、ArrayList等集合進行循環遍歷
<s:iterator value="#rowList">
</s:iterator>

if語句
<s:if test="#rowList==null">
</s:if>

生成html代碼
<s:property value="%{formInfo.jsCode}" escape="false"/>
escape="false" 不進行轉義



逆水深寒 2009-07-21 14:21 發表評論
]]>
主站蜘蛛池模板: 永和县| 会同县| 鲁甸县| 孟连| 丰都县| 旌德县| 都江堰市| 休宁县| 丰顺县| 南通市| 双流县| 郴州市| 司法| 盐池县| 布拖县| 什邡市| 老河口市| 南澳县| 临高县| 商丘市| 德庆县| 菏泽市| 商都县| 陆良县| 永吉县| 丰原市| 焦作市| 台安县| 阿瓦提县| 河源市| 香港| 平阳县| 赫章县| 于田县| 松原市| 临猗县| 枞阳县| 永康市| 新巴尔虎左旗| 彭山县| 安阳县|