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

其中主要有四大核心模塊:
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