Spring系列教程三: Spring Ioc容器詳解

根據上一篇文章講解內容建立對象有如下兩種方式spring

1、主動去找資源經過實例化對象的方式,二者之間有必然聯繫,應用獨立就變得比較難框架

IAccountService as=new AccountServiceImpl();

第二種、把獲取聯繫的工做較給了第三方,BeanFactory從而避免了和AccountDao之間的必然聯繫函數

IAccountService as=(IAccountService) Beanfactory.getBean("accountService");

爲何要叫控制反轉?上面劃線的部分原本本身是有獨立的控制權限,想拿到那個對象就能拿到那個對象,可是它把本身的拿對象的權利轉交給 一個BeanFactory的工廠類,具體能拿到那個對象是由getBean裏面傳進來的參數決定。ui

控制反轉(Ioc)的概念

就是把建立對象的權利交給框架,是框架的重要特徵,只是面向對象中的一種設計概念,它包括依賴注入和依賴查找,主要的做用是削減程序之間的耦合關係要是咱們本身來寫控制反轉的話就是可使用BeanFactory工廠模式(詳細參考上一篇博客)來寫,可是在設計開發中很明顯會增長工做量,因此咱們會把這個工做交給Spring來作,Spring中Spring Core是框架最基礎的部分,提供了Ioc的特性,Spring Ioc容器中主要包括BeanFactory 容器和ApplicationContext 容器spa

下面是使用Spring來進行控制反轉的示例設計

首先咱們得下載Spring-framework的jar包,在pom文件裏面進行下載3d

而後在根目錄下面resoure文件中,建立一個xml配置文件,要想下降依賴關係只有經過反射來建立對象,而且把這任務交給Spring來建立code

<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-4.3.xsd">
    <!-- 上面的是約束,把對象的建立交給Spirng來管理,惟一標識id和全限定類名-->
    <bean id="accountService" class="com.ithema.jdbc.service.impl.AccountServiceImpl"></bean>
    <bean id="accountDao" class="com.ithema.jdbc.dao.impl.AccountDaoImpl"></bean>
</beans>

下面是表現層的實現代碼xml

package com.ithema.jdbc.ui;
import com.ithema.jdbc.dao.IAccountDao;
import com.ithema.jdbc.factory.Beanfactory;
import com.ithema.jdbc.service.IAccountService;
import com.ithema.jdbc.service.impl.AccountServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 模擬一個表現層,用於調用業務層
 */
public class Client {
    public static void main(String[] args) {
        /**
         * 獲取Spring Ioc的核心容器,而且根據id獲取對象
         */
        //IAccountService as=new AccountServiceImpl();
       /* for (int i=0;i<5;i++){
            IAccountService as=(IAccountService) Beanfactory.getBean("accountService");
            System.out.println(as);
        }*/
        //as.saveAccount();
        //一、獲取核心容器對象,new出來是它的實現類
        ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
        //二、根據id獲取bean對象
        IAccountService as= (IAccountService) ac.getBean("accountService");
        IAccountDao adao= ac.getBean("accountDao",IAccountDao.class);//在IIAccountDao.class傳入字節碼,讓字節碼強轉
        System.out.println(as);
        System.out.println(adao);
        as.saveAccount();
    }
}

最後是輸出結果,成功的建立了兩個對象,而且執行了業務service層的方法對象

補充一個小的知識點ApplicationContext接口的幾個主要的實現類

* ApplicationContext的三個實現類
*    ClassPathXmlApplicationContext,它能夠加載類路徑下的配置文件,要求配置在類路徑下,不在的話加載不了
*    FileSystemXmlApplicationContext 它是能夠加載磁盤下任意路徑的配置文件(必須有訪問權限)
*    AnnotationConfigApplicationContext 它是讀取註解建立容器
*/

同樣可以讀取到配置文件,可是咱們通常不建議這麼作,配置文件通常都是和咱們項目放在一塊兒的,若是其餘人不知道萬一給你刪除了怎麼辦??

核心容器的兩個接口引起出的兩個問題
*    ApplicationContext:
*    它在建立核心容器採用的策略是當即加載的方式,也是就是說,有一讀取完立刻就穿件配置文件的的對象
*   
*    BeanFactory:
*    它在建立核心容器時候的策略是採起延遲加載的方式,也就是說,何時根據ID獲取對象了,何時才真正建立對象

 

ApplicationContex建立對象狀況演示以下

首先、咱們要看到對象有沒有建立,須要去接口實現類裏面的構造函數輸出一句話,對象被建立了!!建立對象是經過實例化構造函數所得!!

BeanFactory建立對象狀況演示以下

執行結果以下

繼續執行 step over

那麼在實際的開發中咱們怎麼去選擇這兩種Ioc容器的兩種接口啦?具體狀況具體分析

ApplicationContex適合於單例對象使用 ,BeanFactory使用於多例對象,可是在實際開發的過程當中咱們使用的是ApplicationContext接口建立

相關文章
相關標籤/搜索