1. 程式人生 > >spring框架學習(六)AOP

spring框架學習(六)AOP

  AOP(Aspect-OrientedProgramming)面向方面程式設計,與OOP完全不同,使用AOP程式設計系統被分為方面或關注點,而不是OOP中的物件。

 AOP的引入

 在OOP面向物件的使用中,無可避免的會出現程式碼重複,而且使用面向物件的程式設計方式,這種重複無法避免,比如使用者許可權判斷中,根據相應的許可權執行相應的方法;在servlet中設定編碼格式時,同樣相同的程式碼出現很多次,而且還根業務無關,很容易忘記寫,結果執行的時候就出現亂碼拉。這種重複程式碼不僅使編碼麻煩,而且還不容易維護。而AOP則將這些程式碼整理起來,將解決某個切面問題的程式碼單獨的放在某個模組中,然後再織入到程式中。

AOP中的術語


Aspect:橫切面的功能, 抽象出類,或介面, AOP程式設計重要的就是識別出橫切面功能。

       方面,類似於字元編碼功能) 

 Advice: 橫切面功能的具體實現,需要根據實際的情況分析,如果在目標物件操作之前是 before在操作之後,就是 after advice。

       增強,類似於字元編碼過濾器

Pointcut:切入點,描述橫切面功能應用的限制,不是所有的流程都需要,那些可以使用的地方就是切入點

       類似於過濾器的匹配規則 /*

 Joinpoint: 連線點,或指元件加入流程的時機,比如設定屬性,呼叫方法,等,Spring

只支援方法呼叫的連線點,而其他的一些框架支援屬性的連線點如:AspectJ

       類似於過濾器的過濾規則 REQUESTFORWARD

 Weave:縫合,將元件應用到業務流程中的這個過程,叫縫合或織入。

       類似於將過濾器配置到web.xml檔案的過程

 Proxy,代理,在實現上,SpringAOP其實就是使用JDK的動態代理(使用介面的方式完成代理操作),也可以使用CGLIB(使用繼承的方式完成代理操作)。

 Target目標,業務操作的實際物件

例項:設定字元編碼格式看作是一個Aspect方面,而攔截器就是一個Advice增強。

<!-- 字元編碼過濾器-->
<filter>
<filter-name>characterFilter</filter-name>
<filter-class>com.bjpowernode.egov.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>characterFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
 

過濾器

public class CharacterEncodingFilter implements Filter {
 
   @Override
   public void destroy() {}
 
   @Override
   public void doFilter(ServletRequest request, ServletResponse response,
      FilterChainchain) throws IOException, ServletException {
           request.setCharacterEncoding("GB18030");
           chain.doFilter(request,response);
   }
 
   @Override
   publicvoid init(FilterConfig filterConfig) throws ServletException {}
}

這樣就不用在每個servlet中設定編碼拉。。

spring框架中AOP的使用

1,拷貝jar



2spring配置檔案中增加名稱空間和約束檔案

啟用aop功能:就把標籤新增進來就可以拉。

 


3,寫被代理的類和擴充套件類

 

4,由配置檔案宣告

<!--宣告目標類-->
<bean id="targetclass" class="com.spring.aop.TargetClass"></bean>

<!--宣告擴充套件類-->
<bean id="extendsclass" class="com.spring.aop.extendsClass"></bean>


<!--織入擴充套件類,並宣告在哪個方法上執行擴充套件類-->
<aop:config>
	<aop:aspect id="extendAspect" ref="">
		<aop:pointcut expression="execution(public ** (..))" id="extendsPoincat">
		<!--在目標方法執行前執行的方法-->
		<aop:before method="beforemethod" pointcut-ref="extendsPoincat" />
		<!--在目標方法執行後執行的方法-->
		<aop:after method="aftermethod" pointcut-ref="extendsPoincat" />
	</aop:aspect>
</aop:config>


5,測試

 成功的話,執行目標類中的目標方法targetmethod()時,會先執行擴充套件類中的beforemethod()方法,再執行目標方法,最後再執行aftermethod()方法。  也就是我們只需要手動呼叫targetmethod方法,擴充套件類中的兩個方法框架會在執行的時候通過讀取配置檔案,獲取相應資訊,自動給我們新增上擴充套件的方法。。  測試肯定成功,不相信的話,可以自己試試。

Spring框架中使用AOP的優點

   AopspringIOC容器整合,增強,切入點都是javabean,可以在同一檔案中配置

 和spring的其他部分一樣,可以在不同應用伺服器之間任意移植

   spring實現Aop的攔截介面,使得使用者不必繫結在特定的攔截器介面上

 aop面向切面的程式設計思想,打破面向物件的思維方式,我們要學習的不僅是aop的使用,更要學習面向切面的這種思想。