Spring是什么?Spring在開發中起什么作用?Spring的實現原理是什么?



   1.Spring是一個輕量級的開源框架,是為解決企業級應用開發的復雜性而創建的,通過核心的Bean factory實現了底層的類的實例化和生命周期的管理。
       Spring的最根本使命是:簡化java開發。
    2.Spring是一個三層架構,也為J2EE應用程序開發提供集成的框架;
            Web層:Spring MVC;
            業務層 :Spring的IoC;
            持久層 :Spring的JDBC、ORM、等持久層框架;

  3.一些重要的Spring Framework模塊是:

  • Spring Core: 基礎,可以說 Spring 其他所有的功能都需要依賴於該類庫。主要提供 IOC 依賴注入功能。
  • **Spring Aspects ** : 該模塊為與AspectJ的集成提供支持。
  • Spring AOP :提供了面向方面的編程實現。
  • Spring JDBC : Java數據庫連接。
  • Spring JMS :Java消息服務。
  • Spring ORM : 用於支持Hibernate等ORM工具。
  • Spring Web : 為創建Web應用程序提供支持。
  • Spring Test : 提供了對 JUnit 和 TestNG 測試的支持。
   
  4.Spring的核心是:控制反轉(IoC)和面向切面編程(AOP);

IoC(Inverse of Control:控制反轉)而是一種設計思想,就是 將原本在程序中手動創建對象的控制權,交由Spring框架來管理。 IoC 在其他語言中也有應用,並非 Spirng 特有。 IoC 容器是 Spring 用來實現 IoC 的載體, IoC 容器實際上就是個Map(key,value),Map 中存放的是各種對象。

將對象之間的相互依賴關系交給 IOC 容器來管理,並由 IOC 容器完成對象的注入。這樣可以很大程度上簡化應用的開發,把應用從復雜的依賴關系中解放出來。 IOC 容器就像是一個工廠一樣,當我們需要創建一個對象的時候,只需要配置好配置文件/注解即可,完全不用考慮對象是如何被創建出來的。 在實際項目中一個 Service 類可能有幾百甚至上千個類作為它的底層,假如我們需要實例化這個 Service,你可能要每次都要搞清這個 Service 所有底層類的構造函數,這可能會把人逼瘋。如果利用 IOC 的話,你只需要配置好,然后在需要的地方引用就行了,這大大增加了項目的可維護性且降低了開發難度。

Spring 時代我們一般通過 XML 文件來配置 Bean,后來開發人員覺得 XML 文件來配置不太好,於是 SpringBoot 注解配置就慢慢開始流行起來。

推薦閱讀:

Spring IOC的初始化過程:

IOC源碼閱讀

                 IoC :控制反轉:
        ①:控制反轉模式(也稱依賴性介入),主要是不創建對象,但是描述創建它們的方式,在代碼中不直接與對象和服務連接,但在配文件中描述哪一組件需要哪一個服務;  
                 ②:IoC的設計目標是與JavaBean組件一起使用;
                 ③:直接作用在功能的底層;
                 ④:Spring里面最高級的抽象是BeanFactory(對應的是工廠模式);
                        BeanFactory有兩種模式:單態、原型;
                        單態:查詢時對具有特定名稱的對象共享實例進行檢索;  eg:Singleton
                        原型:每次檢索都會創建單獨的對象,(在每個用戶都需要自己的對象時,原型模式是最適合的);
 
AOP

AOP(Aspect-Oriented Programming:面向切面編程)能夠將那些與業務無關,卻為業務模塊所共同調用的邏輯或責任(例如事務處理、日志管理、權限控制等)封裝起來,便於減少系統的重復代碼降低模塊間的耦合度,並有利於未來的可拓展性和可維護性

Spring AOP就是基於動態代理的,如果要代理的對象,實現了某個接口,那么Spring AOP會使用JDK Proxy,去創建代理對象,而對於沒有實現接口的對象,就無法使用 JDK Proxy 去進行代理了,這時候Spring AOP會使用Cglib ,這時候Spring AOP會使用 Cglib 生成一個被代理對象的子類來作為代理,如下圖所示:

 

 

當然你也可以使用 AspectJ ,Spring AOP 已經集成了AspectJ ,AspectJ 應該算的上是 Java 生態系統中最完整的 AOP 框架了。

使用 AOP 之后我們可以把一些通用功能抽象出來,在需要用到的地方直接使用即可,這樣大大簡化了代碼量。我們需要增加新功能時也方便,這樣也提高了系統擴展性。日志功能、事務管理等等場景都用到了 AOP 。


AOP :面向切面編程
                  ①:可以說是oop(Object Oriented Programming,面向對象編程)的補充和完善;
                                        (OOP :引入封裝、繼承、多態等概念來建立一種對象層次結構,用於模擬公共行為的集合,OOP允許開發者定義縱向的關系,但並不適合定義橫向的關系,例如日志功能。日志代碼往往橫向地散布在所有對象層次中,而與它對應的對象的核心功能毫無關系對於其他類型的代碼,如安全性,異常處理和透明的持續性也都是如此,這種散布在各處的無關的代碼被稱為橫切(cross cutting),在OOP設計中,它導致了大量代碼的重復,而不利於各個模塊的重用);
                  ②:AOP用的是和oop相反的一種叫"橫切"的技術,打比方,一個類里面同樣實現兩個方法的那一段,就是將那些影響到多個類的公共行為都封裝到一個可重用模塊,這就是AOP中的A (Aspect,切面,與業務無關,主要是減少代碼的復用);
                  ③:橫切把系統分為兩個部分:核心關注點 (業務處理的主要流程) 和 橫切關注點 (在核心關注點里的多出,各處基本相同);
                  ④:AOP的作用在於分離系統中的各種關注點,將核心關注點和橫切關注點分離開來;
                  ⑤ :橫切關注點:eg:對哪些方法進行攔截,攔截后的處理;
                  ⑥ :切面 :類是對物體特征的抽象,切面就是對橫切關注點的抽象;               
                  ⑦ :Spring中AOP代理由Spring的IoC容器負責生成、管理、依賴關系也由IoC容器負責管理(AOP代理可以直接使用容器中的其它bean實例作為目標,這種關系可由IOC容器的依賴注入提供;
                  ⑧:Spring的代理默認使用java動態代理來創建AOP代理,這樣可以為任何接口實例創建代理;
                  ⑨:當需要代理的類不是代理接口的時候,Spring會切換為使用CGLIB代理;
                                CGLIB:就是一個強大的,高性能的代碼生成庫,主要通過 對字節碼的操作為對象引入間接級別,以控制對象的訪問);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM