1. 程式人生 > >Spring學習--IOC容器的概念及一個簡單IOC容器使用案例

Spring學習--IOC容器的概念及一個簡單IOC容器使用案例

IOC容器的概念:
IOC容器就是具有依賴注入功能的容器,IOC容器負者例項化、定位、配置應用程式中的物件及監理這些物件間的依賴,應用程式無需直接在物件中new物件,而是由IOC容器進行組裝。在Spring中BeanFactory是IOC容器的實際代表。
Spring IoC容器如何知道哪些是它管理的物件呢?這就需要配置檔案,Spring IoC容器通過讀取配置檔案中的配置元資料,通過元資料對應用中的各個物件進行例項化及裝配。一般使用基於xml配置檔案進行配置元資料,而且Spring與配置檔案完全解耦的,可以使用其他任何可能的方式進行配置元資料,比如註解、基於java檔案的、基於屬性檔案的配置都可以。
Bean的概念:


IoC容器管理的那些組成你應用程式的物件我們就叫它Bean, Bean就是由Spring容器初始化、裝配及管理的物件,除此之外,bean就與應用程式中的其他物件沒有什麼區別了。那IoC怎樣確定如何例項化Bean、管理Bean之間的依賴關係以及管理Bean呢?這就需要配置元資料,配置元資料指定如何例項化Bean、如何組裝Bean等。


寫程式碼了,開心吧(使用的是IDEA)SpringIOC專案,下圖是建立一個Spring專案以及專案目錄情況:
這裡寫圖片描述

User.java

package org.liang.entity;

/**
 * Created by rcc on 2018/1/19.
 * 實體類
 */
public class User { private String name; private String gender; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public
void setGender(String gender) { this.gender = gender; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", gender='" + gender + '\'' + ", age=" + age + '}'; } }

UserServiceImpl.java

package org.liang.service;

import org.liang.entity.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


/**
 * Created by rcc on 2018/1/19.
 */
public class UserServiceImpl {
    public User getUser(){
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        User user = context.getBean(User.class);
        user.setName("liang");
        user.setGender("man");
        user.setAge(18);

        return user;
    }

}

spring-config.xml

<?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">

    <bean id="user" class="org.liang.entity.User" />

    <bean id="userService" class="org.liang.service.UserServiceImpl" >

    </bean>

</beans>

TestUser.java

package org.liang.test;

import org.liang.service.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created by rcc on 2018/1/19.
 * 測試類
 */
public class TestUser {
    public static void main(String [] args){
        //原先需要進行建立物件時需要new物件的,如下
        UserServiceImpl userService = new UserServiceImpl();
        System.out.print(userService.getUser());   //User{name='liang', gender='man', age=18}

        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        UserServiceImpl userServiceBean = (UserServiceImpl) context.getBean("userService");
        System.out.println(userServiceBean.getUser());

    }
}

.詳解IOC:
Spring Ioc容器的代表就是org.springframework.beans包中的BeanFactory介面,BeanFactory介面提供了IoC容器最基本功能;而org.springframework.context包下的ApplicationContext介面擴充套件了BeanFactory,還提供了與Spring AOP整合、國際化處理、事件傳播及提供不同層次的context實現 (如針對web應用的WebApplicationContext)。簡單說, BeanFactory提供了IoC容器最基本功能,而 ApplicationContext 則增加了更多支援企業級功能支援。ApplicationContext完全繼承BeanFactory,因而BeanFactory所具有的語義也適用於ApplicationContext。

**ApplicationContext介面獲取Bean方法簡介:**

• **Object getBean(String name) 根據名稱返回一個Bean,客戶端需要自己進行型別轉換;**

• T getBean(String name, Class<T> requiredType) 根據名稱和指定的型別返回一個Bean,客戶端無需自己進行型別轉換,如果型別轉換失敗,容器丟擲異常;

• **T getBean(Class<T> requiredType) 根據指定的型別返回一個Bean,客戶端無需自己進行型別轉換,如果沒有或有多於一個Bean存在容器將丟擲異常;**

• Map<String, T> getBeansOfType(Class<T> type) 根據指定的型別返回一個鍵值為名字和值為Bean物件的 Map,如果沒有Bean物件存在則返回空的Map

那麼,IOC容器到底是如何工作的呢?
    一、準備配置檔案(spring-config.xml):在配置檔案中宣告Bean的定義,也就是Bean配置元資料。
    二、由IOC容器進行解析元資料:IOC容器的Bean Reader讀取並解析配置檔案、更具定義生成Bean Definition配置元資料物件,IOC容器根據Bean Definition進行例項化、   
        配置和組裝Bean。
    三、例項化IOC容器:由客戶端例項化容器、獲取需要的Bean。

這裡寫圖片描述