1. 程式人生 > 其它 >Spring原始碼學習(1)

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提供的替代類只不過是把這個類裡的方法提取出來,所以學習原始碼時先按這個類)。

  未完待續。。。