AOP(Aspect-OrientedProgramming)面向方面編程,與OOP完全不同,使用AOP編程系統被分為方面或關(guān)注點(diǎn),而不是OOP中的對象。
AOP的引入
在OOP面向對象的使用中,無(wú)可避免的會(huì )出現代碼重復,而且使用面向對象的編程方式,這種重復無(wú)法避免,比如用戶(hù)權限判斷中,根據相應的權限執行相應的方法;在servlet中設置編碼格式時(shí),同樣相同的代碼出現很多次,而且還根業(yè)務(wù)無(wú)關(guān),很容易忘記寫(xiě),結果運行的時(shí)候就出現亂碼拉。這種重復代碼不僅使編碼麻煩,而且還不容易維護。而AOP則將這些代碼整理起來(lái),將解決某個(gè)切面問(wèn)題的代碼單獨的放在某個(gè)模塊中,然后再織入到程序中。
AOP中的術(shù)語(yǔ)
Aspect:橫切面的功能,抽象出類(lèi),或接口, AOP編程重要的就是識別出橫切面功能。
(方面,類(lèi)似于字符編碼功能)
Advice: 橫切面功能的具體實(shí)現,需要根據實(shí)際的情況分析,如果在目標對象操作之前是 before在操作之后,就是 after advice。
(增強,類(lèi)似于字符編碼過(guò)濾器)
Pointcut:切入點(diǎn),描述橫切面功能應用的限制,不是所有的流程都需要,那些可以使用的地方就是切入點(diǎn)
(類(lèi)似于過(guò)濾器的匹配規則 /*)
Joinpoint: 連接點(diǎn),或指組件加入流程的時(shí)機,比如設置屬性,調用方法,等,Spring只支持方法調用的連接點(diǎn),而其他的一些框架支持屬性的連接點(diǎn)如:AspectJ,
(類(lèi)似于過(guò)濾器的過(guò)濾規則 REQUEST,FORWARD)
Weave: 縫合,將組件應用到業(yè)務(wù)流程中的這個(gè)過(guò)程,叫縫合或織入。
(類(lèi)似于將過(guò)濾器配置到web.xml文件的過(guò)程)
Proxy,代理,在實(shí)現上,Spring的AOP其實(shí)就是使用JDK的動(dòng)態(tài)代理(使用接口的方式完成代理操作),也可以使用CGLIB(使用繼承的方式完成代理操作)。
Target,目標,業(yè)務(wù)操作的實(shí)際對象
實(shí)例:設置字符編碼格式看作是一個(gè)Aspect方面,而攔截器就是一個(gè)Advice增強。
- <span style="font-size:18px;">
- <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>
- </span>
過(guò)濾器類(lèi)
- <span style="font-size:18px;">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 {}
- }</span>
這樣就不用在每個(gè)servlet中設置編碼拉。。
spring框架中AOP的使用
1,拷貝jar包
2,spring配置文件中增加命名空間和約束文件
啟用aop功能:就把標簽添加進(jìn)來(lái)就可以拉。
3,寫(xiě)被代理的類(lèi)和擴展類(lèi)
4,由配置文件聲明
- <span style="font-size:18px;">
- <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></span>
5,測試
成功的話(huà),執行目標類(lèi)中的目標方法targetmethod()時(shí),會(huì )先執行擴展類(lèi)中的beforemethod()方法,再執行目標方法,最后再執行aftermethod()方法。
也就是我們只需要手動(dòng)調用targetmethod方法,擴展類(lèi)中的兩個(gè)方法框架會(huì )在執行的時(shí)候通過(guò)讀取配置文件,獲取相應信息,自動(dòng)給我們添加上擴展的方法。。
測試肯定成功,不相信的話(huà),可以自己試試。
Spring框架中使用AOP的優(yōu)點(diǎn)
Aop與spring的IOC容器整合,增強,切入點(diǎn)都是javabean,可以在同一文件中配置
和spring的其他部分一樣,可以在不同應用服務(wù)器之間任意移植
spring實(shí)現Aop的攔截接口,使得用戶(hù)不必綁定在特定的攔截器接口上
aop面向切面的編程思想,打破面向對象的思維方式,我們要學(xué)習的不僅是aop的使用,更要學(xué)習面向切面的這種思想。