Spring原始碼學習(1)
Spring原始碼學習(一)
一、前言
該系列部落格用於記錄本人學習Spring原始碼的過程,以Spring5.1為例。第一篇筆記不會記錄太多程式碼相關的內容,更多的是梳理一下Spring整體的結構,本人學識有限,如果書寫過程中有什麼紕漏希望及時指出。
二、Spring簡介
Spring是一個開源框架,它由Rod Johnson建立。它是為了解決企業應用開發的複雜性而建立的。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限於伺服器端的開發。從簡單性、可測試性和鬆耦合的角度而言,任何Java應用都可以從Spring中受益。
三、Spring核心概念
提到Spring,最核心的兩個概念就是IOC(Inversion of Control,控制反轉),AOP(Aspect Oriented Programming,面向切面程式設計)。我會首先嚐試講解IOC這個概念。通常情況下我們會將Spring的工廠稱之為容器,因為在Spring中工廠不僅僅是建立物件,同時會維護整個物件的生命週期。即工廠建立了物件,同時也儲存了物件所以我們會稱之為IOC容器(這裡我們預設Spring建立的是單例物件,即scope為singleton)。首先看一個Spring的Demo,下面的程式碼是一個最簡單的使用Spring為我們建立物件的例子。從程式碼中不難看出,我們使用ApplicationContext類來獲取配置好的bean,並且讓Spring幫我們建立物件。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--定義一個Person物件--> <bean id="person" class="com.cmxy.entity.Person"> <property name="age" value="27"/> <property name="name" value="hardy"/> </bean> </beans>
public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Person person = context.getBean("person", Person.class); System.out.println(person); }
ApplicationContext是一個高階工廠,整合了非常多不同的工廠,即ApplicationContext用於眾多工廠的能力。可以看到,首先ApplicationContext是一個介面,其次繼承了ListableBeanFactory、HierarchicalBeanFactory(這兩個工廠後續也會講解),因為是原始碼學習,所以我們需要深入底層。這裡直接給出結論,Spring眾多工廠中處於最底層的是BeanFacotry。
BeanFacotry(Spring工廠核心的介面!!!)
既然要學習原始碼就要對結構有一個大體的瞭解。首先看一下Spring最核心的工廠介面的繼承關係。從圖中不難看出BeanFacotry的眾多的子介面,以及子類。例如HierarchicalBeanFactory、AutowireCapableBeanFactory、ListableBeanFactory等等一些列的。子介面是在擁有父介面所有能力的前提下,對父介面進行功能的擴充套件。接下來簡單介紹一下BeanFacotry子介面的作用(之後會詳細介紹)。
1、BeanFactory:Spring工廠體系中最底層的介面,定義了工廠的基本操作,例如獲取bean、是否包含某個bean、獲取Bean的型別。
2、HierarchicalBeanFactory(可繼承的Bean工廠):顧名思義,該介面給工廠賦予了可繼承的能力。應用:SpringMVC中的父子工廠。
3、AutowireCapableBeanFactory(自動注入Bean工廠):給工廠賦予自動注入的能力。
4、ListableBeanFactory:給工廠賦予獲取相關配置資訊的能力。
5、ConfigurableBeanFactory(可配置工廠):可配置Bean是否為單例、以及提供型別轉換等功能。
Spring還有許多的工廠,Spring容器是由一系列的工廠組合而成,Spring的設計嚴格按照單一職責原則所以每個工廠各司其職,組合在一起最終形成了一個功能豐富的頂層介面(ApplicationContext),Spring為了方便我們開發,也是提供了幾個集成了所有工廠能力的類,其中一個就是我們最為熟知的ApplicationContext(介面),以及XmlBeanFactory(實現類,雖然已經過期,但是後續Spring提供的替代類只不過是把這個類裡的方法提取出來,所以學習原始碼時先按這個類)。
未完待續。。。