亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? spring aop+

?? 世界知名IT公司的JAVA面試題
??
字號:
6.3 Spring AOP面向方面編程原理:AOP概念(1)

      介紹完IoC之后,我們來介紹另外一個重要的概念:AOP(Aspect Oriented Programming),也就是面向方面編程的技術。AOP基于IoC基礎,是對OOP的有益補充。

AOP將應用系統分為兩部分,核心業務邏輯(Core business concerns)及橫向的通用邏輯,也就是所謂的方面Crosscutting enterprise concerns,例如,所有大中型應用都要涉及到的持久化管理(Persistent)、事務管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和調試管理(Debugging)等。

AOP正在成為軟件開發的下一個光環。使用AOP,你可以將處理aspect的代碼注入主程序,通常主程序的主要目的并不在于處理這些aspect。AOP可以防止代碼混亂。

Spring framework是很有前途的AOP技術。作為一種非侵略性的、輕型的AOP framework,你無需使用預編譯器或其他的元標簽,便可以在Java程序中使用它。這意味著開發團隊里只需一人要對付AOP framework,其他人還是像往常一樣編程。

6.3.1   AOP概念
讓我們從定義一些重要的AOP概念開始。

— 方面(Aspect):一個關注點的模塊化,這個關注點實現可能另外橫切多個對象。事務管理是J2EE應用中一個很好的橫切關注點例子。方面用Spring的Advisor或攔截器實現。

— 連接點(Joinpoint):程序執行過程中明確的點,如方法的調用或特定的異常被拋出。

— 通知(Advice):在特定的連接點,AOP框架執行的動作。各種類型的通知包括“around”、“before”和“throws”通知。通知類型將在下面討論。許多AOP框架包括Spring都是以攔截器做通知模型,維護一個“圍繞”連接點的攔截器鏈。

— 切入點(Pointcut):指定一個通知將被引發的一系列連接點的集合。AOP框架必須允許開發者指定切入點,例如,使用正則表達式。

— 引入(Introduction):添加方法或字段到被通知的類。Spring允許引入新的接口到任何被通知的對象。例如,你可以使用一個引入使任何對象實現IsModified接口,來簡化緩存。

— 目標對象(Target Object):包含連接點的對象,也被稱作被通知或被代理對象。

— AOP代理(AOP Proxy):AOP框架創建的對象,包含通知。在Spring中,AOP代理可以是JDK動態代理或CGLIB代理。

— 編織(Weaving):組裝方面來創建一個被通知對象。這可以在編譯時完成(例如使用AspectJ編譯器),也可以在運行時完成。Spring和其他純Java AOP框架一樣,在運行時完成織入。

各種通知類型包括:

—  Around通知:包圍一個連接點的通知,如方法調用。這是最強大的通知。Aroud通知在方法調用前后完成自定義的行為,它們負責選擇繼續執行連接點或通過返回它們自己的返回值或拋出異常來短路執行。

—  Before通知:在一個連接點之前執行的通知,但這個通知不能阻止連接點前的執行(除非它拋出一個異常)。

—  Throws通知:在方法拋出異常時執行的通知。Spring提供強制類型的Throws通知,因此你可以書寫代碼捕獲感興趣的異常(和它的子類),不需要從Throwable或Exception強制類型轉換。

—  After returning通知:在連接點正常完成后執行的通知,例如,一個方法正常返回,沒有拋出異常。

Around通知是最通用的通知類型。大部分基于攔截的AOP框架(如Nanning和Jboss 4)只提供Around通知。

如同AspectJ,Spring提供所有類型的通知,我們推薦你使用最為合適的通知類型來實現需要的行為。例如,如果只是需要用一個方法的返回值來更新緩存,你最好實現一個after returning通知,而不是around通知,雖然around通知也能完成同樣的事情。使用最合適的通知類型使編程模型變得簡單,并能減少潛在錯誤。例如,你不需要調用在around通知中所需使用的MethodInvocation的proceed()方法,因此就調用失敗。

切入點的概念是AOP的關鍵,它使AOP區別于其他使用攔截的技術。切入點使通知獨立于OO的層次選定目標。例如,提供聲明式事務管理的around通知可以被應用到跨越多個對象的一組方法上。 因此切入點構成了AOP的結構要素。

下面讓我們實現一個Spring AOP的例子。在這個例子中,我們將實現一個before advice,這意味著advice的代碼在被調用的public方法開始前被執行。以下是這個before advice的實現代碼。

package com.ascenttech.springaop.test;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

public class TestBeforeAdvice implements MethodBeforeAdvice {

public void before(Method m, Object[] args, Object target)

throws Throwable {

   System.out.println("Hello world! (by "

     + this.getClass().getName()

     + ")");

}

}

接口MethodBeforeAdvice只有一個方法before需要實現,它定義了advice的實現。before方法共用3個參數,它們提供了相當豐富的信息。參數Method m是advice開始后執行的方法,方法名稱可以用作判斷是否執行代碼的條件。Object[] args是傳給被調用的public方法的參數數組。當需要記日志時,參數args和被執行方法的名稱都是非常有用的信息。你也可以改變傳給m的參數,但要小心使用這個功能;編寫最初主程序的程序員并不知道主程序可能會和傳入參數的發生沖突。Object target是執行方法m對象的引用。

在下面的BeanImpl類中,每個public方法調用前,都會執行advice,代碼如下。

package com.ascenttech.springaop.test;

public class BeanImpl implements Bean {

public void theMethod() {

   System.out.println(this.getClass().getName()

     + "." + new Exception().getStackTrace()[0].getMethodName()

     + "()"

     + " says HELLO!");

}

}

類BeanImpl實現了下面的接口Bean,代碼如下。

package com.ascenttech.springaop.test;

public interface Bean {

public void theMethod(); 

}

雖然不是必須使用接口,但面向接口而不是面向實現編程是良好的編程實踐,Spring也鼓勵這樣做。

pointcut和advice通過配置文件來實現,因此,接下來你只需編寫主方法的Java代碼,代碼如下。

package com.ascenttech.springaop.test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.FileSystemXmlApplicationContext;

public class Main {

public static void main(String[] args) {

   //Read the configuration file

   ApplicationContext ctx 

     = new FileSystemXmlApplicationContext("springconfig.xml");

   //Instantiate an object

   Bean x = (Bean) ctx.getBean("bean");

   //Execute the public method of the bean (the test)

   x.theMethod();

}

}

我們從讀入和處理配置文件開始,接下來馬上要創建它。這個配置文件將作為粘合程序不同部分的“膠水”。讀入和處理配置文件后,我們會得到一個創建工廠ctx,任何一個Spring管理的對象都必須通過這個工廠來創建。對象通過工廠創建后便可正常使用。

僅僅用配置文件便可把程序的每一部分組裝起來,代碼如下。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework. org/dtd/spring-beans.dtd">

<beans>

<!--CONFIG-->

<bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean">

<property name="proxyInterfaces">

    <value>com.ascenttech.springaop.test.Bean</value>

   </property>

   <property name="target">

    <ref local="beanTarget"/>

   </property>

   <property name="interceptorNames">

    <list>

     <value>theAdvisor</value>

    </list>

   </property>

</bean> 

<!--CLASS--> 

<bean id="beanTarget" class="com.ascenttech.springaop.test.BeanImpl"/>

<!--ADVISOR-->

<!--Note: An advisor assembles pointcut and advice-->

<bean id="theAdvisor" class="org.springframework.aop.support.RegexpMethod PointcutAdvisor">

   <property name="advice">

    <ref local="theBeforeAdvice"/>

   </property>

   <property name="pattern">

    <value>com\.ascenttech\.springaop\.test\.Bean\.theMethod</value>

   </property>

</bean>

<!--ADVICE-->

<bean id="theBeforeAdvice" class="com.ascenttech.springaop.test.TestBefore Advice"/>

</beans>

4個bean定義的次序并不重要。我們現在有了一個advice、一個包含了正則表達式pointcut的advisor、一個主程序類和一個配置好的接口,通過工廠ctx,這個接口返回自己本身實現的一個引用。

BeanImpl和TestBeforeAdvice都是直接配置。我們用一個惟一的ID創建一個bean元素,并指定了一個實現類,這就是全部的工作。

advisor通過Spring framework提供的一個RegexMethodPointcutAdvisor類來實現。我們用advisor的第一個屬性來指定它所需的advice-bean,第二個屬性則用正則表達式定義了pointcut,確保良好的性能和易讀性。

最后配置的是bean,它可以通過一個工廠來創建。bean的定義看起來比實際上要復雜。bean是ProxyFactoryBean的一個實現,它是Spring framework的一部分。這個bean的行為通過以下的3個屬性來定義。

— 屬性proxyInterface定義了接口類。

— 屬性target指向本地配置的一個bean,這個bean返回一個接口的實現。

— 屬性interceptorNames是惟一允許定義一個值列表的屬性,這個列表包含所有需要在beanTarget上執行的advisor。注意,advisor列表的次序是非常重要的。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品福利视频| 91福利精品视频| 日韩国产欧美视频| 一区二区三区 在线观看视频| 中文字幕一区二区三区视频| 国产精品拍天天在线| 欧美国产日本视频| 亚洲丝袜制服诱惑| 亚洲综合在线视频| 亚洲bt欧美bt精品| 天天色 色综合| 久久精品国产久精国产| 捆绑调教一区二区三区| 国产精品一区二区x88av| 国产**成人网毛片九色 | 7777女厕盗摄久久久| 欧美日韩一区中文字幕| 欧美一区二区三区成人| 久久久久免费观看| 亚洲区小说区图片区qvod| 亚洲观看高清完整版在线观看| 婷婷综合在线观看| 国产麻豆精品在线观看| a级高清视频欧美日韩| 在线精品视频一区二区三四| 欧美精品 国产精品| 久久看人人爽人人| 亚洲一区二区三区四区在线免费观看 | 欧美午夜精品一区二区蜜桃| 欧美一级爆毛片| 日本一区免费视频| 亚洲成人av电影| 老司机精品视频一区二区三区| 风间由美性色一区二区三区| 日本高清成人免费播放| 欧美xxxx老人做受| 一区二区三区在线看| 精品中文字幕一区二区| 一本色道久久综合亚洲91| 日韩欧美国产高清| 亚洲日本在线天堂| 精品综合免费视频观看| 欧美日韩在线播放| 自拍av一区二区三区| 免费成人av资源网| 欧美性一区二区| 国产日韩高清在线| 青青草视频一区| 91国产免费看| 中文字幕乱码久久午夜不卡 | 欧美午夜片在线观看| 欧美激情资源网| 久久精品国产网站| 在线不卡一区二区| 一区二区三区精品久久久| 夫妻av一区二区| 日韩精品一区二区三区在线播放 | 91精品国产91久久久久久一区二区 | 欧美日韩国产成人在线免费| 国产精品久久久久永久免费观看| 日本不卡免费在线视频| 欧美精品一卡两卡| 亚洲国产你懂的| 色哟哟一区二区在线观看| 国产人妖乱国产精品人妖| 另类调教123区| 欧美大片国产精品| 美女国产一区二区三区| 7777精品伊人久久久大香线蕉经典版下载 | 94-欧美-setu| 国产精品国产三级国产aⅴ入口| 韩国理伦片一区二区三区在线播放| 欧美色精品在线视频| 亚洲一区欧美一区| 色网站国产精品| 亚洲图片自拍偷拍| 欧美四级电影在线观看| 一区二区三区.www| 欧美妇女性影城| 视频一区二区三区中文字幕| 欧美人妖巨大在线| 日本欧美一区二区三区| 日韩精品一区在线观看| 韩国av一区二区三区在线观看| 欧美大胆一级视频| 国产乱对白刺激视频不卡 | 成人污视频在线观看| 国产精品激情偷乱一区二区∴| 97aⅴ精品视频一二三区| 亚洲免费在线播放| 在线观看视频91| 三级久久三级久久| 欧美v日韩v国产v| 高清国产一区二区三区| 亚洲人妖av一区二区| 欧美三级电影在线观看| 久久精品国产久精国产| 欧美国产综合一区二区| 欧美色图免费看| 国内外成人在线| 亚洲日本va午夜在线影院| 欧美亚洲动漫制服丝袜| 久久99精品久久久久久国产越南 | 91精品国产一区二区三区蜜臀| 久久av资源站| 亚洲四区在线观看| 日韩免费视频一区| 成人激情电影免费在线观看| 亚洲第一综合色| 国产调教视频一区| 欧美视频日韩视频| 国产一区在线不卡| 亚洲小说春色综合另类电影| 久久一区二区三区国产精品| 色视频成人在线观看免| 国精产品一区一区三区mba视频| 中文字幕日韩一区二区| 日韩免费高清av| 欧美午夜在线一二页| 国产精品一级黄| 亚洲成av人片在线观看无码| 久久精品网站免费观看| 欧美精品欧美精品系列| 91在线观看一区二区| 美女视频一区在线观看| 一区二区三区视频在线观看 | 色综合天天综合| 精品一区二区久久久| 亚洲一区二区av电影| 国产日韩精品久久久| 日韩欧美亚洲国产另类| 欧美亚男人的天堂| 91免费版pro下载短视频| 国产一区二区主播在线| 日本系列欧美系列| 亚洲第一主播视频| 亚洲一区日韩精品中文字幕| 日韩理论片网站| 久久精品男人的天堂| 日韩欧美高清dvd碟片| 欧美日韩精品一区二区在线播放| 91美女福利视频| 成人动漫视频在线| 国产很黄免费观看久久| 狂野欧美性猛交blacked| 热久久国产精品| 免费一区二区视频| 免费日本视频一区| 秋霞电影网一区二区| 日本不卡免费在线视频| 免费观看一级特黄欧美大片| 亚洲成人免费在线观看| 亚洲国产日韩精品| 爽好多水快深点欧美视频| 天天色 色综合| 免费久久精品视频| 精彩视频一区二区三区| 国产资源在线一区| 国产成人一区在线| 成人在线一区二区三区| 粉嫩在线一区二区三区视频| 成人免费黄色大片| 色婷婷久久综合| 欧美日韩国产小视频在线观看| 欧美日韩成人综合在线一区二区| 欧美日本在线观看| 欧美一区二区三区四区久久| 日韩女优制服丝袜电影| 欧美—级在线免费片| 一区二区三区91| 奇米精品一区二区三区在线观看 | 国产精品美女一区二区三区 | 亚洲午夜一区二区三区| 日韩国产欧美在线播放| 国产一区二区三区蝌蚪| 99re视频精品| 欧美日韩电影在线| 久久久精品tv| 亚洲一区中文日韩| 国产一区不卡精品| 欧美影片第一页| 久久久久久久久久久久电影| 亚洲欧洲日韩综合一区二区| 亚洲国产一区在线观看| 精品午夜一区二区三区在线观看| 99热在这里有精品免费| 欧美日本在线看| 中文字幕在线观看一区| 日韩精品三区四区| 国产91精品精华液一区二区三区| 色94色欧美sute亚洲线路二| 日韩一卡二卡三卡国产欧美| 日本一区二区成人在线| 青青国产91久久久久久| 99精品视频在线播放观看| 欧美tickling网站挠脚心| 亚洲色欲色欲www| 国产尤物一区二区| 91麻豆精品国产自产在线观看一区 | 国产欧美日韩不卡免费|