Spring IOC 及 Spring 中Bean的三種創建方式


SSM開源框架是現在市場上主流的Java開發框架,其中包含了Spring、SpringMVC以及Mybatis三大主要框架。在SSM框架中Spring是整個框架的核心,這是因為Spring有強大的資源整合能力,下面讓我們一起來學習一下強大的Spring框架。

我們首先來簡單了解一下Spring框架中有哪些模塊

 

Spring 4.0的結構圖

其中主要有四大核心模塊:

1、IOC模塊(即上圖中的 CoreContainer模塊)

IOC模塊是最核心、最基礎的模塊,又稱控制反轉容器:負責對象的創建,對象的存儲,對象的依賴管理;

2、WEB模塊(即MVC,主要解決與表示層的通訊問題)

3、AOP模塊(實現系統功能的動態擴展)

4、Data模塊(整合JDBC、JPA、Mybatis等)


今天主要講一下Spring中的IOC模塊,以及其創建Bean的三種方式

我們首先了解一下什么是IOC:

IOC是一種設計思想,我們稱之為控制反轉,在程序中我們通常將對象控制權進行轉移的這種設計理解為IOC。例如:對象的創建和管理由第三方框架去實現;又比如在生活中我們將錢存入余額寶,由余額寶管理和使用我們的錢去投資,這也是IOC思想的一種體現。簡單的來說就從“ 我要做什么就做什么 ”變為“ 你讓我做什么我就做什么 ”。

Spring中的IOC模塊是IOC思想的一種完美實現。它通過反射構建對象,通過Map存儲對象,通過DI機制實現對象的依賴管理,通過Context提供一個全局訪問點。

Spring有三種創建Bean的方式

1、調用構造器創建Bean對象 (實際開發中常用的)

通過調用構造器創建Bean對象是我們在實際開發中最常用的方式,而構造器創建Bean對象又有兩種方式:

1)利用無參構造函數 + setter方法注入值構造Bean對象實例

其本質是 SpringContext 利用無參的構造函數創建一個對象,然后利用setter方法賦值,所以需要在pojo中提供無參數構造函數,並定義對應字段的setter方法。如果無參構造函數不存在,Spring上下文創建對象的時候便會報錯。

 <!-- setter方法注入值時bean的配置方式 -->
 <bean  id="user"  class="com.beans.user">
        <property name="id" value="666"></property>
        <property name="name" value="Leorizon"></property>
 </bean>

 

setter方法注入值時,xml配置bean時使用的 <property name="屬性名" value="值" ></property>標簽對屬性進行賦值

Spring容器通過該方法為name屬性注入參數。

2)利用有參構造函數直接注入值構造Bean對象實例

當利用有參構造注入值構造時,pojo中不需要setter方法;

<!-- 構造注入值時bean的配置 -->
<bean  id="user" class="com.beans.user" >
        <constructor-arg name="id" value="666"></constructor-arg>
        <constructor-arg name="name" value="Leorizon"></constructor-arg>
</bean>

 

在構造注入值時,xml配置bean時通過使用<constructor-arg name="屬性名" value="值"></constructor-arg>標簽的name屬性和value屬性指定了:構造方法賦值

2、調用靜態工廠方法創建Bean對象

靜態工廠方法創建bean對象的核心是: class + factory-method

首先是封裝類對象,如果需要對屬性注入值,則需要定義有參構造方法或者生產setter方法;

其次是定義靜態工廠方法

public class UserFactory {

    // 在這里我們定義創建方法是調用構造方法來創建對象
    
    public static User createPerson(){
        return new User();
    }
    
    public static User createPerson(Integer id,String name){
        return new User(id,name);
    }
}

 

然后在XML文件定義bean對象

<!-- 調用靜態工廠方法創建bean對象 -->
<bean id="user"  class="com.beans.factory.UserFactory"  factory-method="createPerson">
    <constructor-arg name="id" value="666"></constructor-arg>
    <constructor-arg name="name" value="Leorizon"></constructor-arg>
</bean>
 

使用靜態工廠方法創建Bean實例需要為<bean />元素指定出id外如下屬性:

class:指定靜態工廠的實現類( 即包名.類名 )【相當於指定工廠的地址】

factory-method:指定由靜態工廠的哪個方法創建該Bean實例(方法名)【指定由工廠的哪個車間創建Bean】

如果靜態工廠方法需要參數,則使用<constructor-arg />元素傳入

3、調用實例工廠方法創建Bean對象

調用實例工廠方法創建bean對象相比較靜態工廠方法創建bean對象,就是將靜態方法中的factory實現類先實例化一個factorBean對象,然后調用factorBean對象來創建bean對象;

 <!-- 先配置工廠Bean,class指定該工廠的實現類,該Bean負責產生其他Bean實例 --> 
 <bean id="userFactory" class="com.beans.factory.UserFactory"/> 
 
 <!-- 再引用工廠Bean來配置 其他Bean -->
 <bean id="user"  factory-bean="userFactory"  factory-method="createPerson">
    <constructor-arg name="id" value="666"></constructor-arg>
    <constructor-arg name="name" value="Leorizon"></constructor-arg>
 </bean>

 

調用實例化工廠需要為<bean />指以下兩個屬性

factory-bean :該屬性指定工廠Bean的id

factory-method:該屬性指定實例工廠的工廠方法。

如果方法需要參數,則使用<constructor-arg />元素傳入


原創聲明,本文系作者授權雲+社區發表,未經許可,不得轉載。

如有侵權,請聯系 yunjia_community@tencent.com 刪除。

編輯於 2018-12-24


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM