Spring IoC的概念

Spring IoC的基礎知識

Spring 框架能夠說是Java世界中最成功的框架,它的成功來自於理念,而不是技術,它最核心的理念是IoC(控制反轉)和AOP(面向切面編程),其中IoC是Spring的基礎,而AOP則是其最重要的功能。spring

1.Spring IoC概述

控制反轉是一個比較抽象的概念,先舉一個實際生活中的例子說明。當人們想喝蘋果汁的時候,在沒有飲品店的時候,最直觀的作法是,要買榨汁機,蘋果和礦泉水。這些東西都是本身「主動」創造的過程,也就是這杯蘋果汁須要本身主動創造。然而現在,有各類飲品店本身不必去榨果汁了。若是想要喝蘋果汁,能夠直接找到飲品店的聯繫方式,描述想要的飲料信息,留下地址和聯繫方式下單等待便可。在這個過程當中我並無「主動」創造蘋果汁,也就是蘋果汁是由飲品店創造的,而不是我本身,但也達到了個人要求。在潛意識裏咱們會以爲對象應該由咱們主動創造,但事實上這並非咱們的真實需求,由於也許你對這個領域並不精通,這個時候把建立對象的主動權轉交給別人,這就是控制反轉的概念。控制反轉這個理念雖然理解上有些困難,可是好處在於下降了對象之間的耦合。這裏對象的產生依靠於IoC容器,而不是開發者主動的行爲。主動建立的模式,責任歸於開發者,而在被動模式下,責任歸於IoC容器。基於這樣的被動形式,咱們就說對象被控制反轉了。編程

2.Spring 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 }

3.Spring IoC容器的初始化和依賴注入

Bean的定義和初始化在Spring IoC容器是兩大步驟,先是定義,而後初始化和依賴注入。spa

Bean定義分爲3步:設計

  1. Resource定位,這步是Spring IoC容器根據開發者的配置,進行資源定位(經過XML或者註解)
  2. BeanDefinition的載入,將Resource定位信息保存到Bean的定義中(BeanDefinition),此時並不會建立Bean實例
  3. BeanDefinition的註冊,將BeanDefinition的信息發佈到Spring IoC容器中,此時仍舊沒有對應Bean的實例建立

作完這三步Bean就在Spring IoC容器中被定義了,而沒有初始化和依賴注入。對於初始化和依賴注入,Spring Bean有一個配置選項---lazy-init,在沒有配置狀況下,默認值default爲false,也就是默認自動初始化Bean。將其設置爲true,只有當使用Spring IoC容器的getBean方法獲取它時,它纔會初始化,完成依賴注入。code

4.Spring Bean的生命週期

 

從上圖(圖來源《Java EE互聯網輕量級框架整合開發 》)能夠看到Spring IoC容器在執行了初始化和依賴注入後,會執行必定步驟來完成初始化,經過這些步驟就能夠自定義初始化,而在Spring IoC容器正常關閉的時候,它會執行必定步驟關閉容器釋放資源。注意,從上圖能夠看到有些方法須要實現特定的接口才能實現。對象

相關文章
相關標籤/搜索