Spring第二篇【Core模塊之快速入門、bean建立細節、建立對象】

前言

上篇Spring博文主要引出了爲啥咱們須要使用Spring框架,以及大體瞭解了Spring是分爲六大模塊的….本博文主要講解Spring的core模塊!html

搭建配置環境

引入jar包

本博文主要是core模塊的內容,涉及到Spring core的開發jar包有五個java

  • commons-logging-1.1.3.jar 日誌
  • spring-beans-3.2.5.RELEASE.jar bean節點
  • spring-context-3.2.5.RELEASE.jar spring上下文節點
  • spring-core-3.2.5.RELEASE.jar spring核心功能
  • spring-expression-3.2.5.RELEASE.jar spring表達式相關表

我主要使用的是Spring3.2版本spring

配置文件

Spring核心的配置文件applicationContext.xml或者叫bean.xmlexpress

那這個配置文件怎麼寫呢??通常地,咱們都知道框架的配置文件都是有約束的…咱們能夠在spring-framework-3.2.5.RELEASE\docs\spring-framework-reference\htmlsingle\index.html找到XML配置文件的約束markdown

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

</beans>

我是使用Intellij Idea集成開發工具的,能夠選擇自帶的Spring配置文件,它長的是這樣:app

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

</beans>

Core模塊快速入門

前面在介紹Spring模塊的時候已經說了,Core模塊是:IOC容器,解決對象依賴關係框架

所以Core模塊主要是學習如何獲得IOC容器,經過IOC容器來建立對象、解決對象之間的依賴關係、IOC細節。函數

獲得Spring容器對象【IOC容器】

Spring容器不僅僅只有一個,能夠歸爲兩種類型工具

  • Bean工廠,BeanFactory【功能簡單】
  • 應用上下文,ApplicationContext【功能強大,通常咱們使用這個】

經過Resource獲取BeanFactory

  • 加載Spring配置文件
  • 經過XmlBeanFactory+配置文件來建立IOC容器
 //加載Spring的資源文件 Resource resource = new ClassPathResource("applicationContext.xml"); //建立IOC容器對象【IOC容器=工廠類+applicationContext.xml】 BeanFactory beanFactory = new XmlBeanFactory(resource); 

類路徑下XML獲取ApplicationContext

  • 直接經過ClassPathXmlApplicationContext對象來獲取
// 獲得IOC容器對象
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

        System.out.println(ac);

XML配置信息

在上面咱們已經能夠獲得IOC容器對象了。接下來就是在applicationContext.xml文件中配置信息【讓IOC容器根據applicationContext.xml文件來建立對象】學習

  • 首先咱們先有個JavaBean的類
/** * Created by ozc on 2017/5/10. */
public class User {

    private String id;
    private String username;


    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}
  • 之前咱們是經過new User的方法建立對象的….
 User user = new User();
  • 如今咱們有了IOC容器,可讓IOC容器幫咱們建立對象了。在applicationContext.xml文件中配置對應的信息就好了
<!-- 使用bean節點來建立對象 id屬性標識着對象 name屬性表明着要建立對象的類全名 -->
    <bean id="user" class="User"/>

經過IOC容器獲取對象

  • 在外界經過IOC容器對象獲得User對象
 // 獲得IOC容器對象 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); User user = (User) ac.getBean("user"); System.out.println(user);

這裏寫圖片描述


bean對象建立細節

在Spring第一篇中,咱們爲何要引入Spring提出了這麼一些問題:

這裏寫圖片描述

既然咱們如今已經初步瞭解IOC容器了,那麼這些問題咱們都是能夠解決的。而且是十分簡單【對象寫死問題已經解決了,IOC容器就是控制反轉建立對象】

scope屬性

指定scope屬性,IOC容器就知道建立對象的時候是單例仍是多例的了。

屬性的值就只有兩個:單例/多例

這裏寫圖片描述

  • 當咱們使用singleton【單例】的時候,從IOC容器獲取的對象都是同一個

這裏寫圖片描述

  • 當咱們使用prototype【多例】的時候,從IOC容器獲取的對象都是不一樣的

這裏寫圖片描述

scope屬性除了控制對象是單例仍是多例的,還控制着對象建立的時間

  • 咱們在User的構造函數中打印出一句話,就知道User對象是何時建立了。
public User() {

        System.out.println("我是User,我被建立了");
    }
  • 當使用singleton的時候,對象在IOC容器以前就已經建立了
    • 這裏寫圖片描述
  • 當使用prototype的時候,對象在使用的時候才建立
    • 這裏寫圖片描述

lazy-init屬性

lazy-init屬性只對singleton【單例】的對象有效…..lazy-init默認爲false….

有的時候,可能咱們想要對象在使用的時候才建立,那麼將lazy-init設置爲ture就好了

這裏寫圖片描述


init-method和destroy-method

若是咱們想要對象在建立後,執行某個方法,咱們指定爲init-method屬性就好了。。

若是咱們想要IOC容器銷燬後,執行某個方法,咱們指定destroy-method屬性就好了。

<bean id="user" class="User" scope="singleton" lazy-init="true" init-method="" destroy-method=""/>

Bean建立細節總結

/** * 1) 對象建立: 單例/多例 * scope="singleton", 默認值, 即 默認是單例 【service/dao/工具類】 * scope="prototype", 多例; 【Action對象】 * * 2) 何時建立? * scope="prototype" 在用到對象的時候,才建立對象。 * scope="singleton" 在啓動(容器初始化以前), 就已經建立了bean,且整個應用只有一個。 * 3)是否延遲建立 * lazy-init="false" 默認爲false, 不延遲建立,即在啓動時候就建立對象 * lazy-init="true" 延遲初始化, 在用到對象的時候才建立對象 * (只對單例有效) * 4) 建立對象以後,初始化/銷燬 * init-method="init_user" 【對應對象的init_user方法,在對象建立以後執行 】 * destroy-method="destroy_user" 【在調用容器對象的destroy方法時候執行,(容器用實現類)】 */

IOC建立對象

上面咱們使用的是IOC經過無參構造函數來建立對象,咱們來回顧一下通常有幾種建立對象的方式:

  • 無參構造函數建立對象
  • 帶參數的構造函數建立對象
  • 工廠建立對象
    • 靜態方法建立對象
    • 非靜態方法建立對象

使用無參的構造函數建立對象咱們已經會了,接下來咱們看看使用剩下的IOC容器是怎麼建立對象的。

帶參數的構造函數建立對象

首先,JavaBean就要提供帶參數的構造函數:

public User(String id, String username) {
        this.id = id;
        this.username = username;
    }

接下來,關鍵是怎麼配置applicationContext.xml文件了。

<bean id="user" class="User">

        <!--經過constructor這個節點來指定構造函數的參數類型、名稱、第幾個-->
        <constructor-arg index="0" name="id" type="java.lang.String" value="1"></constructor-arg>
        <constructor-arg index="1" name="username" type="java.lang.String" value="zhongfucheng"></constructor-arg>
    </bean>

這裏寫圖片描述


在constructor上若是構造函數的值是一個對象,而不是一個普通類型的值,咱們就須要用到ref屬性了,而不是value屬性

好比說:我在User對象上維護了Person對象的值,想要在構造函數中初始化它。所以,就須要用到ref屬性了

<bean id="person" class="Person"></bean> 

    <bean id="user" class="User" >

        <!--經過constructor這個節點來指定構造函數的參數類型、名稱、第幾個-->
        <constructor-arg index="0" name="id" type="java.lang.String" value="1"></constructor-arg>
        <constructor-arg index="1" name="username" type="java.lang.String" ref="person"></constructor-arg>
    </bean>

工廠靜態方法建立對象

首先,使用一個工廠的靜態方法返回一個對象

public class Factory {

    public static User getBean() {

        return new User();
    }

}

配置文件中使用工廠的靜態方法返回對象

<!--工廠靜態方法建立對象,直接使用class指向靜態類,指定靜態方法就好了-->
    <bean id="user" class="Factory" factory-method="getBean" >

    </bean>

這裏寫圖片描述


工廠非靜態方法建立對象

首先,也是經過工廠的非非靜態方法來獲得一個對象

public class Factory {


    public User getBean() {

        return new User();
    }


}

配置文件中使用工廠的非靜態方法返回對象

<!--首先建立工廠對象-->
    <bean id="factory" class="Factory"/>

    <!--指定工廠對象和工廠方法-->
    <bean id="user" class="User" factory-bean="factory" factory-method="getBean"/>

這裏寫圖片描述

相關文章
相關標籤/搜索