Spring 框架能夠說是Java世界中最成功的框架,它的成功來自於理念,而不是技術,它最核心的理念是IoC(控制反轉)和AOP(面向切面編程),其中IoC是Spring的基礎,而AOP則是其最重要的功能。spring
控制反轉是一個比較抽象的概念,先舉一個實際生活中的例子說明。當人們想喝蘋果汁的時候,在沒有飲品店的時候,最直觀的作法是,要買榨汁機,蘋果和礦泉水。這些東西都是本身「主動」創造的過程,也就是這杯蘋果汁須要本身主動創造。然而現在,有各類飲品店本身不必去榨果汁了。若是想要喝蘋果汁,能夠直接找到飲品店的聯繫方式,描述想要的飲料信息,留下地址和聯繫方式下單等待便可。在這個過程當中我並無「主動」創造蘋果汁,也就是蘋果汁是由飲品店創造的,而不是我本身,但也達到了個人要求。在潛意識裏咱們會以爲對象應該由咱們主動創造,但事實上這並非咱們的真實需求,由於也許你對這個領域並不精通,這個時候把建立對象的主動權轉交給別人,這就是控制反轉的概念。控制反轉這個理念雖然理解上有些困難,可是好處在於下降了對象之間的耦合。這裏對象的產生依靠於IoC容器,而不是開發者主動的行爲。主動建立的模式,責任歸於開發者,而在被動模式下,責任歸於IoC容器。基於這樣的被動形式,咱們就說對象被控制反轉了。編程
Spring IoC容器做用是容納咱們開發的各類Bean,而且咱們能夠從中獲取各類發佈在Spring IoC容器裏的Bean,而且經過描述能夠獲得它。Spring IoC容器的設計主要基於BeanFactory和ApplicationContext兩個接口,其中ApplicationContext是BeanFactory的子接口,也就是BeanFactory是Spring IoC容器的最底層接口。由於ApplicationContext接口對BeanFactory接口作了許多有用的擴展,因此在絕大多數狀況下都會使用ApplicationContext做爲Spring IoC容器。框架
下面是BeanFactory的源碼(去掉了註釋)ui
1 package org.springframework.beans.factory; 2 3 import org.springframework.beans.BeansException; 4 import org.springframework.core.ResolvableType; 5 import org.springframework.lang.Nullable; 6 7 public interface BeanFactory { 8 9 String FACTORY_BEAN_PREFIX = "&"; 10 11 Object getBean(String name) throws BeansException; 12 13 <T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException; 14 15 Object getBean(String name, Object... args) throws BeansException; 16 17 <T> T getBean(Class<T> requiredType) throws BeansException; 18 19 <T> T getBean(Class<T> requiredType, Object... args) throws BeansException; 20 21 boolean containsBean(String name); 22 23 boolean isSingleton(String name) throws NoSuchBeanDefinitionException; 24 25 boolean isPrototype(String name) throws NoSuchBeanDefinitionException; 26 27 boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException; 28 29 boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException; 30 31 32 @Nullable 33 Class<?> getType(String name) throws NoSuchBeanDefinitionException; 34 35 String[] getAliases(String name); 36 37 }
Bean的定義和初始化在Spring IoC容器是兩大步驟,先是定義,而後初始化和依賴注入。spa
Bean定義分爲3步:設計
作完這三步Bean就在Spring IoC容器中被定義了,而沒有初始化和依賴注入。對於初始化和依賴注入,Spring Bean有一個配置選項---lazy-init,在沒有配置狀況下,默認值default爲false,也就是默認自動初始化Bean。將其設置爲true,只有當使用Spring IoC容器的getBean方法獲取它時,它纔會初始化,完成依賴注入。code
從上圖(圖來源《Java EE互聯網輕量級框架整合開發 》)能夠看到Spring IoC容器在執行了初始化和依賴注入後,會執行必定步驟來完成初始化,經過這些步驟就能夠自定義初始化,而在Spring IoC容器正常關閉的時候,它會執行必定步驟關閉容器釋放資源。注意,從上圖能夠看到有些方法須要實現特定的接口才能實現。對象