国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
spring學(xué)習(xí)筆記(夏昕)--干煸四季豆


                                      

 

Spring 基礎(chǔ)語義

1,控制反轉(zhuǎn)(IoC = Inversion of Control) & 依賴注入(DI = Dependency Injection)
   IoC:由容器控制程序之間的關(guān)系,而非傳統(tǒng)現(xiàn)實(shí)中,由程序代碼直接控制??刂茩?quán)由應(yīng)用代碼中轉(zhuǎn)到了外部容器,控制權(quán)的轉(zhuǎn)移,即所謂反轉(zhuǎn)。
   DI:即組件之間的依賴關(guān)系由容器在運(yùn)行期決定,由容器動(dòng)態(tài)的將某種依賴關(guān)系注入到組件之中。

2, 依賴注入的幾種實(shí)現(xiàn)類型
   1)接口注入:
   我們常常借助接口來將調(diào)用與實(shí)現(xiàn)者分離:
   public class ClassA {
     private InterfaceB clzB;
     public doSomething() {
       Ojbect obj = Class.forName(Config.BImplementation).newInstance();
       clzB = (InterfaceB)obj;
       clzB.doIt()
     }
      ......
   }
   在上面的代碼中,ClassA依賴于InterfaceB的實(shí)現(xiàn),如何獲得InterfaceB實(shí)現(xiàn)類的實(shí)例?傳統(tǒng)的方法是在代碼中創(chuàng)建InterfaceB實(shí)現(xiàn)類的實(shí)例,并將其賦予ClzB。
  而這樣一來,ClassA在編譯期即依賴于InterfaceB的實(shí)現(xiàn)。為了將調(diào)用者與實(shí)現(xiàn)者在編譯期分離,于是有了上面的代碼,我們根據(jù)預(yù)先在配置文件中設(shè)定的實(shí)現(xiàn)類的類名(Config.BImplementation),動(dòng)態(tài)加載實(shí)現(xiàn)類,并通過InterfaceB強(qiáng)制轉(zhuǎn)型后為ClassA所用。這就是接口注入的一個(gè)最原始的雛形。
   而對(duì)于一個(gè)接口注入型IoC容器而言,加載接口實(shí)現(xiàn)并創(chuàng)建其實(shí)例的工作由容器完成。如:
   public class ClassA {
     private InterfaceB clzB;
     public Object doSomething(InterfaceB b) {
       clzB = b;
       return clzB.doIt();
     }
      ......
   }
   在運(yùn)行期,InterfaceB實(shí)例將由容器提供。

   2)設(shè)值注入
   即通過類的setter方法完成依賴關(guān)系的設(shè)置。

   3)構(gòu)造子注入
   構(gòu)造子注入,即通過構(gòu)造函數(shù)完成依賴關(guān)系的設(shè)定,如:
   public class DIByConstructor {
     private final DataSource dataSource;
     private final String message;
     public DIByConstructor(DataSource ds, String msg) {
       this.dataSource = ds;
       this.message = msg;
     }
      ......
   }
   在構(gòu)造子注入的依賴注入機(jī)制中,依賴關(guān)系是通過類構(gòu)造函數(shù)建立,容器通過調(diào)用類的構(gòu)造方法,將其所需的依賴關(guān)系注入其中。

   4)幾種依賴注入模式的對(duì)比總結(jié)
   接口注入模式:由于其歷史悠久,在很多容器中都已經(jīng)得到了應(yīng)用。但由于其在靈活性,易用性上不如其它兩種注入模式,因?yàn)樵贗OC的專題世界內(nèi)并不被看好。
  設(shè)值注入的優(yōu)勢(shì):第一,對(duì)于習(xí)慣了傳統(tǒng)JavaBean開發(fā)的程序員而言,通過setter方法設(shè)定依賴關(guān)系顯得更加直觀,更加自然;第二,如果依賴關(guān)系(或繼承關(guān)系)較為復(fù)雜,那么構(gòu)造子注入模式的構(gòu)造函數(shù)也會(huì)相當(dāng)龐大(我們需要在構(gòu)造函數(shù)中設(shè)定所有的依賴關(guān)系),此時(shí)設(shè)值注入模式往往更為簡(jiǎn)潔;第三,對(duì)于某些第三方類庫而演,可能要求我們的組件必須提供一個(gè)默認(rèn)的構(gòu)造函數(shù),此時(shí)構(gòu)造子注入模式的依賴注入機(jī)制就體現(xiàn)出其局限性,難以完成我們期望的功能。
  構(gòu)造子注入的優(yōu)勢(shì):第一,"在構(gòu)造期即創(chuàng)建一個(gè)完整合法的對(duì)象",對(duì)于這條java設(shè)計(jì)原則,構(gòu)造子注入無疑是最好的響應(yīng)者;第二,避免了繁瑣的setter方法的編寫,所有依賴關(guān)系均在構(gòu)造函數(shù)中設(shè)定,依賴關(guān)系集中呈現(xiàn),更加易讀;第三,由于沒有setter方法,所有依賴關(guān)系均在構(gòu)造時(shí)由容器一次性設(shè)定,因此組件在被創(chuàng)建之后即處于相對(duì)"不變"的穩(wěn)定狀態(tài),無需擔(dān)心上層代碼在調(diào)用過程中就執(zhí)行setter方法對(duì)組件依賴關(guān)系產(chǎn)生破壞,特別是對(duì)于Singleton模式的組件而言,這可能對(duì)整個(gè)系統(tǒng)產(chǎn)生重大的影響;第四,同樣,對(duì)于關(guān)聯(lián)關(guān)系僅在構(gòu)造函數(shù)中表達(dá),只有組件創(chuàng)建者需要關(guān)心組件內(nèi)部的依賴關(guān)系。對(duì)于調(diào)用者而言,組件中的依賴關(guān)系處于黑盒之中。對(duì)上層屏蔽不必要的信息,也為系統(tǒng)的層次清晰性提供了保證;第五,通過構(gòu)造子注入,意味著我們可以在構(gòu)造函數(shù)中決定依賴關(guān)系的注入順序,對(duì)于一個(gè)大量依賴外部服務(wù)的組件而言,依賴關(guān)系的獲得順序可能非常重要,比喻某個(gè)依賴關(guān)系注入的先決條件是組件的DataSource及相關(guān)資源已經(jīng)被設(shè)定。

3,Spring Bean封裝機(jī)制
   Spring從核心而言,是一個(gè)DI容器,其設(shè)計(jì)哲學(xué)是提供一個(gè)無侵入式的高擴(kuò)展性框架。即無需代碼中涉及Spring專有類,即可將其納入Spring容器進(jìn)行管理。
   作為對(duì)比,EJB則是一個(gè)高度侵入性的框架規(guī)范,它制定了眾多的接口和編碼規(guī)范,要求實(shí)現(xiàn)者必須遵從。侵入性的后果就是,一旦系統(tǒng)基于侵入性框架設(shè)計(jì)開發(fā),那么之后任何脫離這個(gè)框架的企圖都將付出極大的代價(jià)。
   為了避免這種情況,實(shí)現(xiàn)無侵入性的目標(biāo)。Spring大量引入了java的Reflection機(jī)制,通過動(dòng)態(tài)調(diào)用的方式避免硬編碼方式的約束,并在此基礎(chǔ)上建立了其核心組件BeanFactory,以此作為其依賴注入機(jī)制的實(shí)現(xiàn)基礎(chǔ)。
   org.springframework.beans包中包括了這些核心組件的實(shí)現(xiàn)類,核心中的核心為BeanWrapper和BeanFactory類。這兩個(gè)類從技術(shù)角度而言并不復(fù)雜,但對(duì)于Spring框架而言,卻是關(guān)鍵所在。

4,Bean Wrapper
   所謂依賴注入,即在運(yùn)行期由容器將依賴關(guān)系注入到組件之中。講得通俗點(diǎn),就是在運(yùn)行期,由Spring根據(jù)配置文件,將其他對(duì)象的引用通過組件提供的setter方法進(jìn)行設(shè)定。
   我們知道,如果動(dòng)態(tài)設(shè)置一個(gè)對(duì)象屬性,可以借助Java的Reflection機(jī)制完成:
   Class cls = Class.forName("net.xiaxin.beans.User");
   Method mtd = cls.getMethod("setName",new Class[]{String.class});
   Object obj = (Object)cls.newInstance();
   mtd.invoke(obj,new Object[]{"Erica"});
   return obj;
  上面我們通過動(dòng)態(tài)加載了User類,并通過Reflection調(diào)用了User.setName方法設(shè)置其name屬性。對(duì)于這里的例子而言,處于簡(jiǎn)潔,我們將類名和方法名都以常量的方法硬編碼。假設(shè)這些常量都是通過配置文件讀入,那我們就實(shí)現(xiàn)了一個(gè)最簡(jiǎn)單的BeanWrapper。這個(gè)BeanWrapper的功能很簡(jiǎn)單,提供一個(gè)設(shè)置JavaBean屬性的通用方法(ApacheBeanUtils類庫中提供了大量針對(duì)Bean的輔助工具,如果有興趣可以下載一份源代碼加以研讀)。
   Spring BeanWrapper基于同樣的原理,提供了一個(gè)更加完善的實(shí)現(xiàn)。看看如何通過Spring BeanWrapper操作一個(gè)JavaBean:
   Object obj = Class.forName("net.xiaxin.beans.User").newInstance();
   BeanWrapper bw = new BeanWrapperImpl(obj);
   bw.setPropertyValue("name", "Erica");
   System.out.println("User name=>"+bw.getPropertyValue("name"));
   對(duì)比之前的代碼,相信大家已經(jīng)知道BeanWrapper的實(shí)現(xiàn)原理。
   誠然,通過這樣的方式設(shè)定JavaBean屬性實(shí)在繁瑣,但它卻提供了一個(gè)通用的屬性設(shè)定機(jī)制,而這樣的機(jī)制,也正是Spring依賴注入機(jī)制所依賴的基礎(chǔ)。
   通過BeanWrapper,我們可以無需在編碼時(shí)就指定JavaBean的實(shí)現(xiàn)類和屬性值,通過在配置文件加以設(shè)定,就可以在運(yùn)行期動(dòng)態(tài)創(chuàng)建對(duì)象并設(shè)定其屬性(依賴關(guān)系)。
  上面的代碼中,我們僅僅指定了需要設(shè)定的屬性名"name",運(yùn)行時(shí),BeanWrapper將根據(jù)JavaBean規(guī)范,動(dòng)態(tài)調(diào)用對(duì)象的"setName"方法進(jìn)行屬性設(shè)定。屬性名可以包含層次,如對(duì)于屬性名"address.zipcode",BeanWrapper會(huì)調(diào)用"getAddress().setZipcode"方法。

5,Bean Factory
   顧名思義,負(fù)責(zé)創(chuàng)建并維護(hù)Bean實(shí)例。
   Bean Factory負(fù)責(zé)根據(jù)配置文件創(chuàng)建Bean實(shí)例,可以配置的項(xiàng)目有:
   1)Bean屬性值以及依賴關(guān)系(對(duì)其他Bean的引用)
   2)Bean創(chuàng)建模式(是否Singleton模式,即是否只針對(duì)指定類維持全局唯一的實(shí)例)
   3)Bean初始化和銷毀方法
   4)Bean的依賴關(guān)系
   下面是一個(gè)較為完整的Bean配置示例:

  Spring Bean Configuration Sample

  id="TheAction" ⑴
  class="net.xiaxin.spring.qs.UpperAction" ⑵
  singleton="true" ⑶
  init-method="init" ⑷
  destroy-method="cleanup" ⑸
  depends-on="ActionManager" ⑹
>
 
    HeLLo ⑺
 
 
   
 
 
    ⑻
 


 
    java:comp/env/jdbc/sample
 


  (1)id:Java Bean在BeanFactory中的唯一標(biāo)識(shí),代碼中通過BeanFactory獲取JavaBean實(shí)例時(shí)需以此作為索引名稱。
  (2)class:Java Bean類名。
 (3)singleton:指定此JavaBean是否采用單例(singleton)模式,如果設(shè)置為"true",則在BeanFactory作用范圍內(nèi),只維護(hù)此JavaBean的一個(gè)實(shí)例,代碼通過BeanFactory獲得此JavaBean實(shí)例的引用。反之,如果設(shè)為"false",則通過BeanFactory獲取此JavaBean實(shí)例時(shí),BeanFactory每次都將創(chuàng)建一個(gè)新的實(shí)例返回。
  (4)init-method:初始化方法,此方法將在BeanFactory創(chuàng)建JavaBean實(shí)例之后,在向應(yīng)用層返回引用之前執(zhí)行。一般用語一些資源的初始化工作。
  (5)destroy-method:銷毀方法。此方法將在BeanFactory銷毀的時(shí)候執(zhí)行,一般用于資源釋放。
 (6)depends-on:Bean依賴關(guān)系。一般情況下無需設(shè)定。Spring會(huì)根據(jù)情況組織各個(gè)依賴關(guān)系的構(gòu)建工作(這里示例中的depends-on屬性非必須)。只有在某些特殊情況下,如JavaBean中的某些靜態(tài)變量需要進(jìn)行初始化(這是一種BadSmell,應(yīng)該在設(shè)計(jì)上避免)。通過depends-on指定其依賴關(guān)系可以保證在此Bean加載之前,首先對(duì)depends-on所指定的資源進(jìn)行加載。
  (7):通過節(jié)點(diǎn)可指定屬性值。BeanFactory將自動(dòng)根據(jù)JavaBean對(duì)應(yīng)的屬性類型加以匹配。上面的"desc"屬性提供了一個(gè)null值的設(shè)定示例,需要注意的是代表一個(gè)空字符串,如果需要將屬性值設(shè)定為null,必須使用節(jié)點(diǎn)。
 (8):指定了屬性對(duì)BeanFactory中其他Bean的引用關(guān)系。示例中,TheAction的dataSource屬性引用了id為dataSource的Bean。BeanFactory將在運(yùn)行期創(chuàng)建dataSource bean實(shí)例,并將其引用傳入TheActionBean的dataSource屬性中。
   下面的代碼演示了如何通過BeanFactory獲取Bean實(shí)例:
   InputStream is = new FileInputStream("bean.xml");
   XmlBeanFactory factory = new XmlBeanFactory(is);
   Action action = (Action) factory.getBean("TheAction");
   此時(shí)我們獲得的Action實(shí)例,由BeanFactory進(jìn)行加載,并根據(jù)配置文件進(jìn)行了初始化和屬性設(shè)定。

  聯(lián)合上面關(guān)于BeanWrapper的內(nèi)容,我們可以看到,BeanWrapper實(shí)現(xiàn)了針對(duì)單個(gè)Bean的屬性設(shè)定操作。而BeanFactory則是針對(duì)多個(gè)Bean的管理容器,根據(jù)給定的配置文件,BeanFactory從中讀取類名,屬性名/值,然后通過Reflection機(jī)制進(jìn)行Bean加載和屬性指定。

6,ApplicationContext
   BeanFactory提供了針對(duì)JavaBean的管理功能,而ApplicationContext提供了一個(gè)更為框架化的實(shí)現(xiàn)(從上面的示例中可以看出,BeanFactory的使用方式更加類似一個(gè)API,而非Framework style)。
   ApplicationContext覆蓋了BeanFactory的所有功能,提供了更為開放式的實(shí)現(xiàn)(如對(duì)于Web應(yīng)用,我們可以在web.xml中對(duì)ApplicationContext進(jìn)行配置)。
   相對(duì)于BeanFactory而言,ApplicationContext提供了以下擴(kuò)展功能:
   1)國際化支持:
      我們可以在Beans.xml文件中,對(duì)程序中的語言信息(如提示信息)進(jìn)行定義,將程序中的提示信息抽取到配置文件中加以定義,為我們進(jìn)行應(yīng)用的各語言版本轉(zhuǎn)換提供了極大的靈活性。
   2)資源訪問
      支持對(duì)文件和URL的訪問
   3)事件傳播
      事件傳播特性為系統(tǒng)中狀態(tài)改變時(shí)的檢測(cè)提供了良好的支持。
   4)多實(shí)例加載
      可以在同一個(gè)應(yīng)用中加載多個(gè)Context實(shí)例。

   下面分別對(duì)這些特性進(jìn)行介紹:
   1)國際化支持
  國際化支持在實(shí)際開發(fā)中可能是最常用的特性。對(duì)于一個(gè)需要支持不同語言環(huán)境的應(yīng)用而言。我們所采取的最常用的策略一般是通過一個(gè)獨(dú)立的資源文件(如一個(gè)properties文件)完成所有語言信息(如界面上的提示信息)的配置。Spring對(duì)這種傳統(tǒng)的方式進(jìn)行了封裝,并提供了更加強(qiáng)大的功能,如信息的自動(dòng)裝配以及熱部署功能(配置文件修改后自動(dòng)讀取,而無需重新啟動(dòng)程序),下面是一個(gè)典型的示例:

  Spring Quick Start
      class="org.springframework.context.support.ResourceBundleMessageSource">
   
     
        messages
     
   
 

  這里聲明了一個(gè)名為messageSource的Bean(注意對(duì)于Message定義,BeanID必須為messageSource,這是目前Spring的編碼規(guī)約),對(duì)應(yīng)類為ResourceBundleMessageSource,目前Spring中提供了兩個(gè)MessageSource接口的實(shí)現(xiàn),即ResourceBundleMessageSource和ReloadableResourceBundleMessageSource,后者提供了無需重啟即可重新加載配置信息的特性。
   在配置節(jié)點(diǎn)中,我們指定了一個(gè)配置名"messages"。Spring會(huì)自動(dòng)在CLASSPATH根路徑中按照如下順序搜尋配置文件并進(jìn)行加載(以Locale為zh_CH為例):
messages_zh_CN.properties
messages_zh.properties
messages.properties
messages_zh_CN.class
messages_zh.class
messages.class
(Spring實(shí)際上調(diào)用了JDK的ResourceBundle讀取配置文件)
   示例中包含了兩個(gè)配置文件,內(nèi)容如下:
messages_zh_CN.properties:
   userinfo=當(dāng)前登陸用戶:[{0}] 登陸時(shí)間:[{1}]
messages_en_US.properties:
   userinfo=Current Login user:[{0}] Login time:[{1}]
   我們可以通過下面的語句進(jìn)行測(cè)試:
   ApplicationContext ctx=new
   FileSystemXmlApplicationContext("bean.xml");
   Object[] arg = new Object[]{"Erica", Calendar.getInstance().getTime()};
   //以系統(tǒng)默認(rèn)Locale加載信息(對(duì)于中文WinXP而言,默認(rèn)為zh_CN)
   String msg = ctx.getMessage("userinfo", arg);
   System.out.println("Message is ===> "+msg);
  代碼中,我們將一個(gè)Object數(shù)組arg作為參數(shù)傳遞給ApplicationContext.getMessage方法,這個(gè)參數(shù)中包含了出現(xiàn)在最終文字信息中的可變內(nèi)容,ApplicationContext將根據(jù)參數(shù)中的Locale信息對(duì)其進(jìn)行處理(如針對(duì)不同Locale設(shè)定日期輸出格式),并用其替換配置文件中的{n}標(biāo)識(shí)(n代表參數(shù)數(shù)組中的索引,從1開始)。
  根據(jù)當(dāng)前默認(rèn)Locale"zh_CH",getMessage方法自動(dòng)加載了message_zh_CH.properties文件。JVM會(huì)根據(jù)當(dāng)前系統(tǒng)的Locale設(shè)定進(jìn)行相應(yīng)處理??梢酝ㄟ^在JVM啟動(dòng)參數(shù)中追加"-Duser.language=en"來設(shè)定當(dāng)前JVM語言類型,通過JVM級(jí)的設(shè)定,結(jié)合國際化支持功能,我們可以較為簡(jiǎn)單的實(shí)現(xiàn)多國語言系統(tǒng)的自動(dòng)部署切換。
   getMessage還有一個(gè)中指定Locale參數(shù)的版本,直接指定加載對(duì)應(yīng)的properties文件:
  String msg = ctx.getMessage("userinfo", arg, Locale.US);

 ?。玻┵Y源訪問
  ApplicationContext.getResource方法提供了對(duì)資源文件訪問支持,如:
  Resource rs = ctx.getResource("classpath:config.properties");
  File file = rs.getFile();
  上例從CLASSPATH根路徑中查找config.properties文件并獲取其文件句柄。getResource方法的參數(shù)為一個(gè)資源訪問地址,如:
    file:C:/config.properties
    /config.properties
    classpath:config.properties
    注意getResource返回的Resource并不一定實(shí)際存在,可以通過Resource.exists()方法對(duì)其進(jìn)行判斷。

     3)事件傳播
   ApplicationContext基于Observer模式(java.util包中有對(duì)應(yīng)實(shí)現(xiàn)),提供了針對(duì)Bean的事件傳播功能。通過Application.publishEvent方法,我們可以將事件通知系統(tǒng)內(nèi)所有的ApplicationListener。
    事件傳播的一個(gè)典型應(yīng)用是,當(dāng)Bean中的操作發(fā)生異常(如數(shù)據(jù)庫連接失?。瑒t通過事件傳播機(jī)制通知異常監(jiān)聽器進(jìn)行處理。
    在目前版本的Spring中,事件傳播部分的設(shè)計(jì)還有待改進(jìn)。同時(shí),如果能夠進(jìn)一步支持異步事件處理機(jī)制,無疑更具吸引力。
    org.springframework.context.event.ApplicationEventMulticasterImpl實(shí)現(xiàn)了事件傳播機(jī)制,目前還相當(dāng)簡(jiǎn)陋。
  在運(yùn)行期,ApplicationContext會(huì)自動(dòng)在當(dāng)前的所有Bean中尋找ApplicationListener接口的實(shí)現(xiàn),并將其作為事件接收對(duì)象。當(dāng)Application.publishEvent方法調(diào)用時(shí),所有的ApplicationListener接口實(shí)現(xiàn)都會(huì)被激發(fā),每個(gè)ApplicationListener可根據(jù)事件的類型判斷是否是自己需要處理的事件。

7,Web Context
   對(duì)于Web應(yīng)用,Spring提供了可配置的ApplicationContext加載機(jī)制。
  加載器目前有兩種選擇:ContextLoaderListener和ContextLoaderServlet。這兩者在功能上完全等同,只是一個(gè)是基于Servlet2.3版本中新引入的Listener接口實(shí)現(xiàn),而另一個(gè)基于Servlet接口實(shí)現(xiàn),開發(fā)中可根據(jù)目標(biāo)Web容器的實(shí)際情況進(jìn)行選擇。
   配置非常簡(jiǎn)單,在web.xml中增加:
 
   
        org.springframework.web.context.ContextLoaderListener
   
 
   或:
 
     context
    
         org.springframework.web.context.ContextLoaderServlet
    
     1
 
   通過以上配置,Web容器會(huì)自動(dòng)加載/WEB-INF/applicationContext.xml初始化ApplicationContext實(shí)例,如果需要指定配置文件位置,可通過context-param加以指定:
 
     contextConfigLocation
     /WEB-INF/myApplicationContext.xml
 
  配置完成之后,即可通過:WebApplicationContextUtils.getWebApplicationContext方法在Web應(yīng)用中獲取ApplicationContext引用。

8,Aspect Oriented Programming
   OOP(面向?qū)ο缶幊蹋┽槍?duì)業(yè)務(wù)處理過程的實(shí)體及其屬性和行為進(jìn)行抽象封裝,以獲得更加清晰高效的邏輯單元?jiǎng)澐帧?br>   AOP(面向切面編程)針對(duì)業(yè)務(wù)處理過程中的切面進(jìn)行提取,它所面對(duì)的是處理過程中的某個(gè)步驟和階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果。
  AOP還有另外一個(gè)重要特點(diǎn):源碼組成無關(guān)性。倘若應(yīng)用中通過某個(gè)具體的業(yè)務(wù)邏輯類實(shí)現(xiàn)了獨(dú)立的權(quán)限檢查,而請(qǐng)求調(diào)度方法通過預(yù)編碼調(diào)用這個(gè)權(quán)限模塊實(shí)現(xiàn)權(quán)限管理,那么這也不算是AOP。對(duì)于AOP組件而言,很重要的一點(diǎn)就是源碼組成無關(guān)性,所謂源碼組成無關(guān)性,體現(xiàn)在具體設(shè)計(jì)中就是AOP組件必須與應(yīng)用代碼無關(guān),簡(jiǎn)單來講,就是應(yīng)用代碼可以脫離AOP組件獨(dú)立編譯。
   為了實(shí)現(xiàn)源碼組成無關(guān)性,AOP往往通過預(yù)編譯方式(如AspectJ)和運(yùn)行期動(dòng)態(tài)代理模式(如Spring AOP和JBoss AOP)實(shí)現(xiàn)。
   下面先來看AOP中幾個(gè)比較重要的概念:
   1)切面(Aspect)
     通過切面,我們可以將系統(tǒng)中各個(gè)不同層次上的問題隔離開來,實(shí)現(xiàn)統(tǒng)一集約式處理。各個(gè)切面只需要集中于自己領(lǐng)域內(nèi)的邏輯實(shí)現(xiàn)。這一方面使得開發(fā)邏輯更加清晰,專業(yè)化分工更加易于進(jìn)行;另一方面,由于切面的隔離,降低了偶合性,我們就可以在不同的應(yīng)用中將各個(gè)切面組合使用,從而使得代碼可重用性大大增強(qiáng)。
   2)連接點(diǎn)(JoinPoint)
      程序運(yùn)行過程中的某個(gè)階段點(diǎn)。如某個(gè)方法調(diào)用,或者某個(gè)異常被拋出。
   3)處理邏輯(Advice)
      在某個(gè)連接點(diǎn)所采用的處理邏輯。處理邏輯調(diào)用模式通常有三種:
      第一:Around,在連接點(diǎn)前后插入預(yù)處理過程和后處理過程;
      第二:Before,僅在連接點(diǎn)之前插入預(yù)處理過程;
      第三:Throw,在連接點(diǎn)拋出異常時(shí)進(jìn)行異常處理。
   4)切點(diǎn)(PointCut)
      一系列連接點(diǎn)的集合,它指明處理方式(Advice)將在何時(shí)被觸發(fā)。

9,AOP in Spring
  Spring中提供的內(nèi)置AOP支持,是基于動(dòng)態(tài)AOP機(jī)制實(shí)現(xiàn)。從技術(shù)角度來講,所謂動(dòng)態(tài)AOP,即通過動(dòng)態(tài)Proxy模式,在目標(biāo)對(duì)象的方法調(diào)用前后插入相應(yīng)的處理代碼。Spring AOP中的動(dòng)態(tài)Proxy模式,則是基于Java DynamicProxy(面向Interface)和CGLIB(面向Class)實(shí)現(xiàn)。


 

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
spring的面試題
解析:Spring IoC容器
Spring核心容器 BeanFactory和ApplicationContext 簡(jiǎn)介
Spring中BeanFactory與ApplicationContext的區(qū)別
《Spring3.X企業(yè)應(yīng)用開發(fā)實(shí)戰(zhàn)》學(xué)習(xí)筆記
Java開發(fā)中SSM框架整合開發(fā)之 Spring IoC
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服