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。

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章