Spring知識總結

来源:https://www.cnblogs.com/xu-cceed3w/archive/2018/05/25/9074313.html
-Advertisement-
Play Games

一、Spring簡述 Spring是一個分層的JavaSE/EEfull-stack(一站式)輕量級開源框架,Spring致力於提供一種方法管理你的業務對象,Spring的主要目的是使JavaEE易用和促進好編程習慣,Spring致力於J2EE應用的各層的解決方案,而不是僅僅專註於某一層的方案,Sp ...


一、Spring簡述
    Spring是一個分層的JavaSE/EEfull-stack(一站式)輕量級開源框架,Spring致力於提供一種方法管理你的業務對象,Spring的主要
目的是使JavaEE易用和促進好編程習慣,Spring致力於J2EE應用的各層的解決方案,而不是僅僅專註於某一層的方案,Spring貫穿表現
層、業務層及持久層。然而,Spring並不想取代那些已有的框架,而是與它們無縫地整合。
二、Spring體繫結構
    Spring框架是一個分層架構,它包含一系列的功能要素並被分為大約20個模塊。這些模塊分為Core Container、Data Access/Integration
Web、AOP(Aspect Oriented Programming)、Instrumentation和測試部分;


  (1)核心容器(Core Container)
    1:Core和Beans模塊提供了Spring最基礎的功能,提供IOC 和依賴註入特性。這裡的基礎概念是BeanFactory,它提供對Factory
  模式的經典實現來消除對程式性單例模式的需要,並真正地允許你從程式邏輯中分離出依賴關係和配置。
    2:Context模塊基於 Core和 Beans來構建,它提供了用一種框架風格的方式來訪問對象,有些像JNDI註冊表。Context封裝包繼
  承了 beans 包的功能,還增加了國際化(I18N),事件傳播,資源裝載,以及透明創建上下文,例如通過servlet容器,以及對大量
  JavaEE特性的支持,如 EJB、JMX。核心介面是ApplicationContext。
    3:Expression Language,表達式語言模塊,提供了在運行期間查詢和操作對象圖的強大能力。支持訪問和修改屬性值,方法調
  用,支持訪問及修改數組、容器和索引器,命名變數,支持算數和邏輯運算,支持從Spring容器獲取Bean,它也支持列表投影、選
  擇和一般的列表聚合等。
 (2)數據訪問/ 集成部分(Data Access/Integration)
    1:JDBC模塊,提供對JDBC的抽象,它可消除冗長的JDBC編碼和解析資料庫廠商特有的錯誤代碼。
    2:ORM模塊,提供了常用的"對象/關係"映射API的集成層。 其中包括JPA、JDO、Hibernate和iBatis 。利用ORM封裝包,可以混
  合使用所有Spring提供的特性進行"對象/關係"映射,如簡單聲明性 事務管理 。
    3:OXM模塊,提供一個支持Object和XML進行映射的抽象層,其中包括JAXB、Castor、XMLBeans、JiBX 和 XStream。
    4:JMS模塊,提供一套"消息生產者、消費者"模板用於更加簡單的使用 JMS,JMS 用於在兩個應用程式之間,或分散式系統中發
  送消息,進行非同步通信。
    5:Transaction模塊,支持程式通過簡單聲明性事務管理,只要是Spring管理對象都能得到Spring管理事務的好處,即使是POJO,
  也可以為他們提供事務。
 (3)Web
    1:Web-Socket模塊,WebSocket protocol是HTML5一種新的協議。它實現了瀏覽器與伺服器全雙工通信,spring支持webSocket通信。
    2:Web模塊,提供了基礎的web功能。例如多文件上傳、集成IOC容器、遠程過程訪問、以及Web Service支持,並提供一個
  RestTemplate類來提供方便的Restful services訪問
    3:Web-Servlet模塊,提供了Web應用的Model-View-ControllerMVC)實現。Spring MVC框架提供了基於註解的請求資源註入、更
  簡單的數據綁定、數據驗證等及一套非常易用的JSP標簽,完全無縫與Spring其他技術協作。
    4: Web-Portlet模塊,提供了在Portlet環境下的MVC實現。
 (4)AOP
    1:AOP模塊,提供了符合AOP聯盟規範的面向方面的編程實現,讓你可以定義如方法攔截器和切入點,從邏輯上講,可以減弱代碼
  的功能耦合,清晰的被分離開。而且利用源碼級的元數據功能,還可以將各種行為信息合併到你的代碼中 。
    2:Aspects模塊,提供了對AspectJ的集成。
    3:Instrumentation模塊, 提供一些類級的工具支持和ClassLoader級的實現,可以在一些特定的應用伺服器中使用。
 (5)Test
    Test模塊,提供對使用JUnit和TestNG來測試Spring組件的支持,它提供一致的ApplicationContexts並緩存這些上下文,它還能
  提供一些mock對象,使得你可以獨立的測試代碼。
三、Spring的優點
    方便解耦,簡化開發
      Spring就是一個大工廠,可以將所有對象創建和依賴關係維護,交給Spring管理;
    AOP 編程的支持
      Spring提供面向切麵編程,可以方便的實現對程式進行許可權攔截、運行監控等功能
    聲明式事務的支持
      只需要通過配置就可以完成對事務的管理,而無需手動編程
    方便程式的測試
      Spring對Junit4支持,可以通過註解方便的測試Spring程式方便集成各種優秀框架Spring不排斥各種優秀的開源框架,其內部
    提供了對各種優秀框架(如:Struts、Hibernate、MyBatis、Quartz 等)的直接支持;
    降低JavaEE API的使用難度  
      Spring對 JavaEE開發中非常難用的一些API(JDBC、JavaMail、遠程調用等),都提供了封裝,使這些API應用難度大大降低。
四、ApplicationContext文件與BeanFactory類


    1. ApplicationContext它是擴展BeanFactory介面;
    2. BeanFactory它採取延遲載入的方案,只有真正在getBean時才會實例化Bean在開發中我們一般使用的是 ApplicationContext,
   真正使用的是其實現類,FileSystemXmlAppliCationContext根據文件路徑獲取,ClassPathXmlApplicationContext 根據類路徑獲
   取;
    3. AppliCationContext它會在配置文件載入時,就會初始化Bean並且ApplicationContext它提供不同的應用層的Context實現。
五、Bean的作用域
    在bean聲明時它有一個scope(作用域)屬性,它是用於描述bean的作用域。
        可取值有:
        singleton:單例 代表在spring ioc容器中只有一個Bean實例(預設的scope)
        prototype 多例 每一次從spring容器中獲取時,都會返回一個新的實例
        request 用在web開發中,將bean對象request.setAttribute()存儲到request域中
        session 用在web開發中,將bean對象session.setAttribute()存儲到session域中
    在開如常用的值是singleton與prototype。
六、Bean的生命周期


    1. instantiate bean 對象實例化;
    2. populate properties 封裝屬性;
    3. 如果 Bean 實現 BeanNameAware 執行 setBeanName;
    4. 如果 Bean 實現 BeanFactoryAwar 或 ApplicationContextAwar 設置工廠 setBeanFactory 或上;
       下文對象 setApplicationContext;
    5. 如果存在類實現 BeanPostProcess(後處理 Bean),執行 postProcessBeforeInitialization;
    6. 如果 Bean 實現 InitializingBean 執行 afterPropertiesSet;
    7. 調用自定義的 init-method 方法;
    8. 如果存在類實現 BeanPostProcessor(處理 Bean),執行 postProcessAfterInitialization;
    9. 執行業務處理;
    10. 如果 Bean 實現 DisposableBean 執行 destroy;
    11. 調用自定義的 destroy-method;
七、AOP
    1. 簡述
        AOP(面向切麵編程)通過預編譯方式和運行期動態代理實現程式功能的統一維護的一種技術。AOP是(面向對象編程)的延續,
    是軟體是Spring框架中的一個重要內容,是函數式編程的一種衍生範型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使
    得業務邏輯各部分之間的耦合度降低,提高程式的可重用性,同時提高了開發的效率。
        AOP是一個概念,並沒有設定具體語言的實現,它能剋服那些只有單繼承特性語言的缺點,spring2.0之後整合AspectJ第三
    方AOP技術。AspectJ是一個面向切麵的框架,它擴展了Java語言。AspectJ定義了AOP語法所以它有一個專門的編譯器用來生成遵
    守Java位元組編碼規範的Class文件。
      1.1 主要功能
          日誌記錄,性能統計,安全控制,事務處理,異常處理等等
      1.2 主要意圖
          將日誌記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中劃分出來,通過對這些行為的分離,我
      們希望可以將它們獨立到非指導業務邏輯的方法中,進而改變這些行為的時候不影響業務邏輯的代碼。
    2. AOP與OOP區別
       OOP針對業務處理過程的實體及其屬性和行為進行抽象封裝,以獲得更加清晰高效的邏輯單元劃分。而AOP則是針對業務處理過
    程中的切麵進行提取,它所面對的是處理過程中的某個步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果。這兩種
    設計思想在目標上有著本質的差異。
    3. 相關術語
      3.1 目標對象(target)
          指的是需要被增強的對象,由於aop是通過代理模式實現,從而這個對象永遠是被代理對象。
      3.2 連接點(join point)
          所謂連接點是指那些被攔截到的點,在spring中這些點指的是方法,spring只支持方法類型的連接點。
      3.3 切入點(pointcut)
          表示一組joint point,這些joint point或是通過邏輯關係組合起來,或是通過通配、正則表達式等方式集中起來,它定
      義了相應的Advice將要發生的地方簡單說切入點是指我們要對哪些連接點進行攔截的定義。
      3.4 通知(advice)
          所謂通知是指攔截到連接點之後所要做的事情就是通知,通知分為前置通知,後置通知,異常通知,最終通知,環繞通知
      Advice定義了在pointcut裡面定義的程式點具體要做的操作。
      3.5 引介(introduction)
          引介是一種特殊的通知,在不修改類代碼的前提下,introduction可以在運行期為類動態地添加一些方法或屬性。
      3.6 切麵(aspect)
          是切入點和通知的結合。
      3.7 織入(weaving)
          織入是一個過程,是將切麵應用到目標對象從而創建出AOP代理對象的過程,織入可以在編譯期,類裝載期,運行期進行。
      Spring採用動態織入,而aspectj採用靜態織入。
      3.8 代理(Proxy)
          一個類被AOP織入增強後,就產生一個結果代理類。
    4.AOP的動態代理
        AOP的底層實現就是動態代理,一般AOP分為靜態AOP和動態AOP。靜態AOP是指AspectJ實現的AOP,他是將切麵代碼直接編譯到
    Java類文件中。動態 AOP是指將切麵代碼進行動態織入實現的AOP。Spring的AOP為動態AOP,實現的技術為:JDK提供的動態代理
    技術和CGLIB(動態位元組碼增強技術)。
      4.1 JDK動態代理
          在JVM運行時,內部動態生成class位元組碼對象(即Class 對象),註:JDK動態代理只針對於介面操作。
      4.2 CGLIB動態代理
          CGLIB是一個開源項目是一個高性能,高質量的Code生成類庫,它可以在運行期擴展Java類與實現Java介面。CGLIB包的底
      層是通過使用一個小而快的位元組碼處理框架ASM,來轉換位元組碼並生成新的類,單獨使用CGLIB,那麼需要導入CGLIB的jar包還
      需要一個asm相關jar包,但是spring框架的spring-core.jar 包中已經集成了CGLIB與asm。
          註意:JDK動態代理只可以為介面去完成操作,而CGLIB動態代理可以為沒有實現介面的類去做代理,也可以為實現介面的類
      去做代理。CGLIB動態代理它可以為沒有實現介面的類做代理,也可以為介面類做代理。
      如果目標對象,有介面,優先使用:JDK動態代理只,如果目標對象,無介面,使用CGLIB動態代理。
    5.AOP的傳統編程
        在傳統的Spring AOP開發中它支持增強(advice)有五種:
            1. 前置通知 目標方法執行前增強org.springframework.aop.MethodBeforeAdvice;
            2. 後置通知 目標方法執行後增強org.springframework.aop.AfterReturningAdvice;
            3. 環繞通知 目標方法執行前後進行增強org.aopalliance.intercept.MethodInterceptor;
            4. 異常拋出通知 目標方法拋出異常後的增強org.springframework.aop.ThrowsAdvice;
            5. 引介通知 在目標類中添加一些新的方法或屬性org.springframework.aop.IntroductionInterceptor;
    6.Spring 整合aspectj框架實現AOP
        Aspect:切麵 =切點+通知(多個切點與多個通知的組合)
        AspectJ它是一個第三方框架,spring 從 2.0 後可以使用 aspectJ 框架的部分語法。
        AspectJ框架它定義的通知類型有六種:
            1. 前置通知 Before相當於BeforeAdvice;
            2. 後置通知 AfterReturning相當於AfterReturningAdvice;
            3. 環繞通知 Around相當於MethodInterceptor;
            4. 拋出通知 AfterThrowing相當於ThrowAdvice;
            5. 引介通知 DeclareParents相當於IntroductionInterceptor;
            6. 最終通知 After不管是否異常,該通知都會執行,相比Spring的傳統AOP Advice多了一個最終通知。
八、Spring的事務管理
    Spring的事務管理的四個優點:
      1. 提供一致的對於不同的事務管理的 API;
      2. 支持聲明式事務管理;
      3. 編程事務管理;
      4. 優秀的整合與Spring的數據訪問:
    Spring的事務管理主要提供了三個介面來完成:
      1. org.springframework.transaction.PlatformTransactionManager
        這是一個事務管理器,可以來選擇相關的平臺(jdbc hibernate jpa…)
      2. TransactionDefinition
        它定義事務的一些相關信息 例如:隔離、傳播、超時、只讀
      3. TransactionStatus
        (1)PlatformTransactionManager
          平臺事務管理器,在不同的持久化層解決技術它的事務代碼不一樣。
          JDBC 開發
           

Connection con=……;
con.setAutoCommit(false);//開啟事務
con.rollback();
con.commit();
              

 


          Hibernate 開發
          

 Session session=….;
 Transaction t=session.beginTransaction();
 t.commit();
 t.rollback();

 


          PlatformTransactionManager 介面API
          DataSourceTransactionManager 主要針對於JdbcTemplate開發MyBatis開發;
          HibernateTransactionManasger 主要針對於Hibernate開發;
          JpaTransactionManager 主要針對於JPA開發。
        (2)TransactionDefinition
          它描述的是事務的定義信息,在TransactionDefinition中定義了大量的常量。
    8.1 隔離
        事務的四個特性:ACID原子性、一致性、隔離性、持久性。
        臟讀,不可重覆讀 虛讀。
            ISOLATION_DEFUALT 它使用後端資料庫的預設隔離級別(spring 中選項)
            ISOLATION_READ_UNCOMMITTED 不能解決問題,會發生臟讀 不可重覆讀 虛讀
            ISOLATION_READ_COMMITTED 可以解決臟讀 會產生不可重覆讀與虛讀。
            ISOLATION_REPEATABLE_READ 可以解決臟讀,不可重覆讀 解決不了虛讀
            ISOLATION_SERIALIZABLE 串列化,可以解決所有問題
        對於不現的資料庫,它的底層預設事務隔離級別不一樣。
            Oracle 資料庫它預設的是 read_committed
            Mysql 資料庫它預設的是 repeatable_read.
    8.2 超時
        預設值是-1它使用的是資料庫預設的超時時間。
    8.3 只讀
        它的值有兩個true/false,如果選擇true一般是在select操作時
    8.4 傳播
        解決的是兩個被事務管理的方法互相調用問題。它與資料庫沒關係,是程式內部維護的問題。其中:
           PROPAGATION_REQUIRED 預設值 兩個操作處於同一個事務,如果之前沒有事務,新建一個事務;
           PROPAGATION_REQUIRES_NEW兩個操作處於不同的事務;
           PROPAGATION_NESTED是一種嵌套事務,它是使用 SavePoint 來實現的。事務回滾時可以回滾到指定的savepoint,
         註意:它只對DataSourceTransactionManager有作用;
           PROPAGATION_SUPPORTS 支持當前事務,如果不存在,就不使用事務;
           PROPAGATION_MANDATORY 支持當前事務,如果不存在,拋出異常;
           PROPAGATION_NOT_SUPPORTED 以非事務運行,如果有事務存在,掛起當前事務;
           PROPAGATION_NEVER 以非事務運行,如果有事務存在,拋出異常;
    8.5 TransactionStatus
        定義了事務狀態信息,在事務運行過程中,得到某個時間點的狀態。
    8.6 聲明式事務管理
     (1)事務管理方式
        1. 編碼方案 不建議使用,它具有侵入性。在原有的業務代碼基礎上去添加事務管理代碼。
        2. 聲明式事務控制,基於 AOP 對目標進行代理,添加 around 環繞通知。
        這種方案,它不具有侵入性,不需要修改原來的業務代碼
     (2)基於xml配置聲明式事務管理方案
        第一步:在applicationContext.xml文件中添加aop與tx的名稱空間
        第二步:在applicationContext.xml件中配置
        Spring提供的advice是傳統的 spring advice
          1. 聲明事務管理器
          2. 配置通知
             Spring為我們提供了一個ransactionInterceptor來完成增強對於這個增強,我們可以使用spring為我們提供的一個標簽
          <tx:advice>來完成操作
          3. 配置切麵
             因為使用的是傳統的Spring的Advice,需要使用<aop:advisor>。
     (3)基於Annotation聲明式事務管理方案
          可以使用@Transaction來在類或方法上添加聲明式事務管理。
            註意:需要在 applicationContext.xml 文件中使用相當於開啟註解事務控制。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 基本思想 每一趟將一個待排序的記錄,按其關鍵字的大小插入到已經排好序的一組記錄的適當位置上,直到所有待排序記錄全部插入為止。 排序過程 1.初始化無序區、有序區,待排序數組的第一個元素為有序區,剩餘元素為無序區; 2.遍歷無序區,將無序區每一個元素插入到有序區的正確位置上; Java演算法實現 /** ...
  • socket.socket() 可以創建一個套接字: 簡單的發送和接收信息的socket程式. 另: 用 struct.pack() 打包 ,用 unpack() 解包. 還可以直接廣播: ...
  • 1 void vBubbleSort(int arr[], int len){ 2 int i, j, temp; 3 for (j = 0; j arr[i + 1]){ //交換兩個數 6 temp = arr[i]; 7 arr[i] = arr[i + 1]; 8 ... ...
  • nginx反向代理與正向代理 1 正向代理 3 正反向代理的區別 4 nginx的正向代理 5 nginx的反向代理配置 參考文章 : https://blog.csdn.net/hiyun9/article/details/51602428 非常感謝 ...
  • 一.變數 1. 首先我們要做的就是申明一個變數例如: name="xiaohua" name是我們的變數名,xiaohua是我們的變數值 變數時我們臨時儲存和調用 對於數字我們直接是:age=24 請註意,在使用變數前,需要對其賦值,不代表任何值得變數沒有意義。 下麵大家看一下麵這張圖片,想一下a, ...
  • "官方文檔 1.11" 配置 簡易文本郵件 連接一次郵件伺服器發送多份不同的郵件 和 發送多媒體郵件 發送html模板郵件 ...
  • 作者: "zyl910" 一、緣由 在項目開發時,因為運行環境的不同,導致有時得分別為不同的環境,切換配置參數打不同war包。但手工切換配置文件的話,不僅費時費力,而且容易出錯。 有些打包工具支持配置切換。這樣我們只要配好有那幾組參數,然後便可分別打war包了。但該辦法還是存在多個war文件易搞錯的 ...
  • 一般地,我們稱C++類聲明中的“函數原型”為介面,它只是提供給了用戶如何使用的具體細節,而隱藏了具體的代碼;類似地,我們稱類的成員函數的具體的代碼為實現。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...