
郝佳編著
《Spring源碼深度解析》從核心實現和企業應用兩個方面,由淺入深、由易到難地對Spring源碼展開了系統的講解,包括Spring的設計理念和整體架構、容器的基本實現、默認標籤的解析、自定義標籤的解析、bean的加載、容器的功能擴展、AOP、數據庫連接JDBC、整合MyBatis、事務、SpringMVC、遠程服務、Spring消息服務等內容。 《Spring源碼深度解析》不僅介紹了使用Spring框架開發項目必須掌握的核心概念,還指導讀者如何使用Spring框架編寫企業級應用,並針對在編寫代碼的過程中如何優化代碼、如何使得代碼高效給出切實可行的建議,從而幫助讀者全面提升實戰能力。 《Spring源碼深度解析》語言簡潔,示例豐富,可幫助讀者迅速掌握使用Spring進行開發所需的各種技能。《Spring源碼深度解析》適合於已具有一定Java編程基礎的讀者,以及在Java平臺下進行各類軟件開發的開發人員、測試人員等。
Spring Bean 的生命週期Spring Bean 的生命週期大致分爲五個階段:創建前準備階段、創建實例階段、依賴注入階段、容器緩存階段、銷燬實例階段 創建準備階段:這個階段主要的作用是, Bean 在開始加載之前,需要從上下文和相關配置中解析並查找 Bean 有關的擴展實現 比如像 init-method 容器在初始化 bean 調用的方法,destory-method 容器在銷燬時調用的方法 以及 BeanFactoryPostProcessor 這類的 bean 加載過程的前置處理和後置處理 這些類或者配置其實是 Spring 提供給開發者,用來實現 Bean 加載過程中的擴展機制,在很多和 Spring 集成的中間件比較常見,比如 Dubbo 創建實例階段:這個階段主要是通過反射來創建 Bean 的實例對象,並且掃描和解析 Bean 聲明的一些屬性 依賴注入階段: 如果被實例化的 Bean 存在依賴其他 Bean 對象的情況,則需要對這些依賴 bean 進行對象注入,比如常見的 @Autowired setter 注入等依賴注入的配置形式 同時,在這個階段會觸發一些擴展的調用,比如常見的擴展類:BeanPostProcessors(用來實現 bean初始化前後的回調)、InitializingBean、BeanFactoryAware 容器緩存階段: 容器緩存階段主要是把 bean 保存到容器以及 Spring 的緩存中,到了這個階段,Bean就可以被開發者使用了 這個階段涉及到的操作,常見的有 init-method 這個屬性配置的方法,會在這個階段調用 以及像 BeanPostProcessors 方法中的後置處理器方法:postProcessorAfterInitialization 也會在這個階段觸發 銷燬實例階段:當 Spring 應用上下文關閉時,該上下文中的所有 bean 都會被銷燬 如果存在bean實現了 DisposableBean 接口,或者配置了 destroy-method 屬性,會在這個階段被調用 Bean 的生命週期掃描Bean:Spring啓動後,掃描@ComponentScan註解配置的掃描路徑下的所有.class文件,類加載器根據類名加載獲取類的Class對象,通過判斷@Component等註解找出Bean;給每個Bean創建BeanDefinition對象存放Class對象、作用域等信息,並放進beanDefinitionMap,映射關係是"Bean名"--->“對應的BeanDefinition”。 遍歷beanDefinitionMap,創建所有Bean,每個Bean的創建過程如下: 推斷構造方法: 根據BeanDefinition得到 Class 對象。 如果BeanDefinition綁定了一個 Supplier,那就調用Supplier的get方法得到一個對象並直接返回。 如果BeanDefinition中存在 factoryMethodName,那麼就調用該工廠方法得到一個bean對象並返回。 如果BeanDefinition已經自動構造過了,那就調用autowireConstructor()自動構造一個對象。 如果有一個構造方法,則使用該構造方法實例化對象; 如果有多個構造方法,有且僅有一個構造方法註解了@Autowired,則選用該構造方法實例化對象。 如果有多個構造方法,並且都沒有註解@Autowired,選用無參構造方法實例化對象。如果都帶參,且有0個或多個構造方法註解了@Autowired”,則報錯“Bean初始化異常”。 實例化:基於反射獲取推斷出的構造器對象,通過這個Constructor對象的newInstance(xx) 方法實例化類,得到原始對象; 存入三級緩存:基於原始對象生成Lambda表達式,並放入三級緩存singletonFactories。以後如果執行這個Lambda表達式,生成的將是代理對象。 屬性填充:推斷和實例化、存入三級緩存、屬性填充(單例池找、判斷循環依賴、二級緩存找、三級緩存找到,生成提前代理對象)、執行三級緩存、存入單例池 按名稱注入;基於反射獲取Bean的所有屬性,將有@Autowired等註解的屬性開啓私有成員訪問限制,通過getBean()方法(解決了單例循環依賴)給該屬性填充它的Bean對象。 按類型注入; 處理Aware回調:如果Bean實例實現了BeanNameAware接口(通過instanceof判斷),調用Bean重寫的setBeanName()方法,給Bean實例的beanName變量賦值。 執行所有BeanPostProcessor的初始化前方法:遍歷所有BeanPostProcessor實現類所在的列表,執行每個BeanPostProcessor對象裏的postProcessBeforeInitialization()方法。本方法可以通過JDK的Proxy.newProxyInstance()實現動態代理返回目標對象的代理對象。 初始化:如果Bean實例實現了InitializingBean接口(通過instanceof判斷),調用Bean重寫的afterPropertiesSet()方法,處理初始化邏輯。afterPropertiesSet譯爲“在屬性填充之後” 執行所有BeanPostProcessor的初始化後方法:遍歷所有BeanPostProcessor實現類所在的列表,執行每個BeanPostProcessor對象裏的postProcessAfterInitialization()方法。本方法可以通過JDK的Proxy.newProxyInstance()實現動態代理返回目標對象的代理對象。 存入單例池:如果是單例,就將最終的代理對象存入單例池(一級緩存,singletonObjects)。 生存期:Bean已就緒,可以被使用,所有Bean將一直駐留在應用上下文中,直到應用上下文被銷燬。 銷燬:如果bean實現了DisposableBean接口,Spring將調用它的destory()接口方法,同樣,如果有方法註解了@PreDestroy,該方法也會被調用。 SpringBoot 的自動裝配原理1. 自動裝配,簡單來說就是自動把第三方組件的 Bean 裝載到 Spring IOC 容器中,不需要開發人員再去寫 Bean 的裝配配置2. 在 Spring Boot 應用裏面,只需要在啓動類加上 @SpringBootApplication 註解就可以實現自動裝配3. @SpringBootApplication 是一個複合註解,真正實現自動裝配的註解是 @EnableAutoConfiguration 1. 引入 Starter 啓動依賴組件的時候,這個組件裏面必須要包含 @Configuration 配置類,在這個配置類裏面通過 @Bean 註解聲明需要裝配到 IOC 容器的 Bean 對象 2. 這個配置類是放在第三方的 jar 包裏面,然後通過 SpringBoot 中的約定優於配置思想,把這個配置類的全路徑放在 classpath:/META-INF/spring.factories 文件中,這樣 SpringBoot 就知道第三方 jar 包裏面的配置類的位置,這個步驟主要是用到了 Spring 裏面的 SpringFactoriesLoader 來完成的 3. SpringBoot 拿到第三方 jar 包裏面聲明的配置類以後,再通過 Spring 提供的 ImportSelector 接口,實現對這些配置類的動態加載 4. 在我看來,SpringBoot 是約定優於配置這一理念下的產物,所以在很多的地方,都會看到這類的思想,它的出現,讓開發人員更加聚焦在業務代碼的編寫上,而不需要關心和業務無關的代碼 5. 其實,自動裝配的思想,在 SpringFramework3.x 版本里面的 @Enable 註解,就有了實現的雛形,@Enable 註解就是模塊驅動的意思,我們只需要增加某個 @Enable 註解,就自動打開某個功能,而不需要針對這個功能去做 Bean 的配置,@Enable 底層也是幫我們去自動完成這個模塊相關 Bean 的注入。
非常垃圾的書。沒有一點點提綱挈領的東西。基本上就是貼了滿篇的源碼加上一點點註釋。源碼不是這麼讀的。好的解析應該詳略得當,挑關鍵點來深入分析,而不是平等地對待所有細節。
作者從核心實現和企業應用兩個方面,由淺入深、由易到難地對Spring源碼展開了系統的講解,具體涉及如下內容: Spring的設計理念和整體架構、 容器的基本實現、 默認標籤的解析、 自定義標籤的解析、 bean的加載、 容器的功能擴展、 AOP、 數據庫連接JDBC、 整合MyBatis、 事務、 SpringMVC、 遠程服務、 Spring消息服務等內容。 Core和Beans模塊是框架的基礎部分,提供IoC(轉控制)和依賴注入特性。 Expression Language模塊提供了一個強大的表達式語言用於在運行時查詢和操縱對象。 ORM模塊爲流行的對象-關係映射API,如JPA、JDO、Hibernate、iBatis等,提供了一個交互層。 OXM模塊提供了一個對Object/XML映射實現的抽象層,Object/XML映射實現包括JAXB、Castor、XMLBeans、JiBX和XStream。 JMS(Java Messaging Service)模塊主要包含了一些製造和消費消息的特性。 Transaction模塊支持編程和聲明性的事物管理,這些事物類必須實現特定的接口,並且對所有的POJO都適用。 Web模塊:提供了基礎的面向Web的集成特性。例如,多文件上傳、使用servlet listeners初始化IoC容器以及一個面向Web的應用上下文。它還包含Spring遠程支持中Web的相關部分。 Web-Servlet模塊web.servlet.jar:該模塊包含Spring的model-view-controller(MVC)實現。 Web-Struts模塊:該模塊提供了對Struts的支持,使得類在Spring應用中能夠與一個典型的Struts Web層集成在一起。注意,該支持在Spring 3.0中是deprecated的。 Web-Porlet模塊:提供了用於Portlet環境和Web-Servlet模塊的MVC的實現。 AOP模塊提供了一個符合AOP聯盟標準的面向切面編程的實現,它讓你可以定義例如方法攔截器和切點,從而將邏輯代碼分開,降低它們之間的耦合性。 對於配置文件的封裝,不同來源的資源文件都有相應的Resource實現:文件(FileSystemResource)、Classpath資源(ClassPathResource)、URL資源(UrlResource)、InputStream資源(InputStreamResource)、Byte數組(ByteArrayResource)等。 獲取器注入是一種特殊的方法注入,它是把一個方法聲明爲返回某種類型的bean,但實際要返回的bean是在配置文件裏面配置的,此方法可用在設計有些可插拔的功能上,解除程序依賴。 循環依賴處理: 創建依賴的時候爲了避免循環依賴,在Spring中創建bean的原則是不等bean創建完成就會將創建bean的ObjectFactory提早曝光加入到緩存中,一旦下一個bean創建時候需要依賴上一個bean則直接使用ObjectFactory。 即Spring處理循環依賴的解決辦法,在B中創建依賴A時通過ObjectFactory提供的實例化方法來中斷A中的屬性填充,使B中持有的A僅僅是剛剛初始化並沒有填充任何屬性的A,而這正初始化A的步驟還是在最開始創建A的時候進行的,但是因爲A與B中的A所表示的屬性地址是一樣的,所以在A中創建好的屬性填充自然可以通過B中的A獲取,這樣就解決了循環依賴的問題。 事務處理: 默認情況下Spring中的事務處理只對RuntimeException方法進行回滾,所以,如果此處將Runtime Exception替換成普通的Exception不會產生回滾效果。 重新複習一遍,還算有收穫。
郝佳編著的Spring源碼深度解析,總體是一本不錯的書,有大量的源碼和對源碼的解讀,主要介紹了spring框架涵蓋了20多個模塊,啓其中最核心的模塊有core container web orm aop。一,首先講了bean factory,它是構建bean的核心,定義了規範和規則。xmlpathresource讀取xml文件,然後變成了document。二,factoryBean是模本bean;三,BeanDifination,包含root child generic。四,解析器,處理器。五,aop,pointcut,aspectj,前置處理器,後置處理器。六,applicationContext繼承了BeanFactory,擴展了子類,監聽器,填充了bean。七,springMVC,servlet,dispatchServlet,handlerMapping,SimpleControllerHandlerAdspter,handler。HttpServletRequest HttpServletResponse HandlerInsterceptor處理攔截器有pre post after。HandlerExceptionInterceptor異常攔截器。八,事務增強器,advisor,取註解和編程式事務,先從方法過去事務增強器,然後生成代理處理。九,RMI,遠程方法調用。十,JMS,java消息服務
完全從函數的角度解析spring,捨本逐末。想了解spring也是首先了解流程,例如解析後的bean,配置存在那裏,之後自己去看。書中對上面兩點一筆帶過,詳細的按照函數講代碼,導致結構零零散散,即使讀完本書還是一頭霧水,不知道哪兒跟哪兒
給兩星吧 書第一版讀過,第二版竟然和第一版高度重合。 舉個例子,3.0之後,開始大量使用純Java開發,到4.0後,基本成爲主流。如今都5.0了,新版還在分析XML,不能把讀者當傻瓜。
Spring是java開發者的春天,它帶來的便利是很大的,看源碼解析,領略大佬的核心思想[耶][耶]書很好很不錯
粗略瀏覽了一遍,前面生成bean definition講述的比較清晰。類圖以及一些設計理念有講到。下面就開始翻譯源代碼,而不去講解爲什麼要這麼做,寫得大多是開發無需關心的細節~
值得看,說的很詳細。只不過貌似是基於 Spring 3 編寫的,有一些類和方法的名稱已經不同了。 不過還是建議在電腦上看,手機不適合看大片的代碼。手機屏幕上還是適合看一些理論的上東西。
翻開看了一眼 確實不怎麼滴 可入門 想了解流程 就難堪大用了