AOP(Aspect-OrientedProgramming)面向方面編程,與OOP完全不同,使用AOP編程系統被分為方面或關注點,而不是OOP中的對象。
AOP的引入
在OOP物件導向的使用中,無可避免的會出現程式碼重複,而且使用物件導向的程式設計方式,這種重複無法避免,例如使用者權限判斷中,根據對應的權限執行對應的方法;在servlet設定編碼格式時,同樣相同的程式碼出現很多次,而且還根業務無關,很容易忘記寫,結果運行的時候就出現亂碼拉。這種重複程式碼不僅使編碼麻煩,而且還不容易維護。而AOP則將這些程式碼整理起來,將解決某個切面問題的程式碼單獨的放在某個模組中,然後再織入到程式中。
AOP中的術語
Aspect:橫切面的功能,
抽像出類,或介面, AOP程式重要的就是辨識出橫切面功能。
(方面,類似字元編碼功能)
Advice: 橫斷面功能的具體實現,需要根據實際的情況分析,如果在目標物件操作之前是 before在操作之後,就是 after
advice。
(增強,類似字元編碼過濾器)
Pointcut:切入點,描述橫斷面功能應用的限制,不是所有的流程都需要,那些可以使用的地方就是切入點
(類似於過濾器的匹配規則 / *)
Joinpoint: 連接點,或指組件加入流程的時機,例如設定屬性,呼叫方法,等,Spring只支援方法呼叫的連接點,而其他的一些框架支援屬性的連接點如:AspectJ,
(類似過濾器的過濾規則 REQUEST,FORWARD)
Weave: 縫合,將組件應用到業務流程中的這個過程,稱為縫合或織入。
(類似將過濾器配置到web.xml檔案的過程)
Proxy,代理,在實作上,Spring的AOP其實就是使用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包
2,spring配置文件中增加命名空間和約束文件
a
2,spring配置文件中增加命名空間和約束文件。aopop功能:就把標籤添加進來就可以拉。
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>
Spring框架中使用AOP的優點
Aop與spring的IOC容器整合,增強,切入點都是javabean,可以在同一文件中配置
和spring的其他部分一樣,可以在不同應用伺服器之間任意移植
spring實現Aop的攔截接口,使得用戶不必綁定在特定的攔截器接口上
aop面向切面的編程思想,打破面向對象的思維方式,我們要學習的不僅是aop的使用,更要學習面向切面的這種思想。
以上就是spring框架學習(六)AOP的內容,更多相關內容請關注PHP中文網(m.sbmmt.com)!