1. 程式人生 > >spring容器建立物件的生命週期

spring容器建立物件的生命週期

前面我們提到了,

IOC的概念:

把物件的建立、初始化、銷燬等工作交給spring容器來完成。

物件的建立我們在前面幾個例子已經討論到了,現在,我們來討論一下

物件的初始化,銷燬

物件的初始化和銷燬,也是有spring來完成,可是我們之前在執行的時候,沒有看見它們的蹤影。
對於瞭解這個問題,可以設定spring的配置檔案的bean中的init-method和destroy-method的取值。
首先,我們要在相應的類中建立好初始化及銷燬的方法。名字可以任意取,因為等下要配置到配置檔案中。
類中的程式碼:


public class helloSpring implements
Serializable {
//客戶端掉用這個方法 public void hello(){ System.out.println("hello spring!"); } //預設建構函式 public helloSpring() { System.out.println("new instance"); } //初始化呼叫這個方法 public void init(){ System.out.println("init+++++++++++++++++"); } //摧毀呼叫這個方法
public void destory(){ System.out.println("destory-----------------"); } }

配置檔案中的程式碼:

<!-- 
        init-method:指該bean對應的類中的初始化呼叫的方法
        destroy-method:指該bean對應的類中的摧毀呼叫的方法
     -->          
    <bean class="cn.ansel.domain.helloSpring" id="hello"  init-method="init
" destroy-method="destory" ></bean>

測試類的程式碼:

public class testHelloSpring {
    /**
     * 測試物件的建立、初始化、摧毀是否由spring完成
     */
    @Test
    public void test1(){
        //啟動spring容器
        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");

        //得到helloSpring物件
        helloSpring helloSpring=(helloSpring) applicationContext.getBean("hello");

        //呼叫該物件的方法
        helloSpring.hello();
    }
}

執行測試類的結果
這裡寫圖片描述
從執行結果我們可以看到,spring容器一開啟之後,就建立bean的物件,然後再執行初始化方法,然後由客戶端呼叫相應的方法。可是在這裡,我們沒有看到spring容器呼叫它的摧毀方法。
我們在呼叫完hello方法之後,再呼叫close方法,卻找不到。
針對這個問題,我們只需要將applicationContext向下轉型之後,就可以呼叫其摧毀方法了。
修改完程式碼之後:

public class testHelloSpring {
    /**
     * 測試物件的建立、初始化、摧毀是否由spring完成
     */
    @Test
    public void test1(){
        //啟動spring容器
        ApplicationContext Context=new ClassPathXmlApplicationContext("applicationContext.xml");
        //得到helloSpring物件
        helloSpring helloSpring=(helloSpring) Context.getBean("hello");
        //呼叫該物件的方法
        helloSpring.hello();
        //把上面得到的context向下轉型
        ClassPathXmlApplicationContext applicationContext=(ClassPathXmlApplicationContext)Context;
        //關閉spring容器
        applicationContext.close();
    }
}

再次執行,
這裡寫圖片描述

當關閉spring容器的時候,spring容器呼叫destory方法。

多例物件的生命週期:

當我們把配置檔案中的scope取值變成多例的時候,看看程式會怎樣執行:
配置檔案的程式碼:

<bean class="cn.ansel.domain.helloSpring" id="hello"  init-method="init" destroy-method="destory" scope="prototype"></bean>

相關類和測試類的程式碼不變,然後執行測試類:
這裡寫圖片描述
從執行結果我們可以看到,在多例的情況下沒有執行destory方法,但是看執行結果圖可以知道,spring容器確實是呼叫了關閉的方法。並且下面那句話是摧毀單例物件,並沒有摧毀多例物件。

總結:

spring容器的生命週期:
(a)在單例情況下:
1、由spring容器建立物件
2、spring容器呼叫初始化方法
3、客戶點呼叫該物件的某些方法
4、關閉spring容器的時候,執行摧毀方法

(b)在多例的情況下:
1、由spring容器建立物件
2、spring容器呼叫初始化方法
3、客戶點呼叫該物件的某些方法

相關推薦

spring容器建立物件生命週期

前面我們提到了, IOC的概念: 把物件的建立、初始化、銷燬等工作交給spring容器來完成。 物件的建立我們在前面幾個例子已經討論到了,現在,我們來討論一下 物件的初始化,銷燬 物件的初始化和銷燬,也是有spring來完成,可是我們之前在執行

Spring容器建立物件的幾種方式及其區別

1. 通過類路徑下的配置檔案獲取ApplicationContext    //在建立容器的時候建立物件          特點:佔用記憶體,但效率高 ApplicationContext ac=new ClassPathXmlApplicationContext("cl

spring容器建立物件的時間和懶載入

我們如何判斷一個物件是在spring容器啟動的時候建立的呢 還是在我們呼叫這個物件的時候建立的? 在單例的情況下: 在上面一個spring基礎(一)中,我們寫了如下的測試類: public class testHelloSpring { @Test p

Spring容器建立物件的三種方式

/** * spring容器做的事情: * 解析spring的配置檔案,利用Java的反射機制建立物件 * */ public class testHelloWorld { @Test public void testHelloWo

Spring_用Spring容器建立物件並給屬性賦值

建立spring配置檔案:spring-config.xml。物件的建立和賦值都在這裡進行配置。 建立實體類,設定屬性 import java.util.List; import java.util.Map; public class BookBean { private Lon

spring容器建立bean物件的方式

1)xml檔案中有bean的配置,而且這個bean所對應的java類中存在一個無參構造器,那麼這個時候spring容器就可以使用反射呼叫無參構造器來建立例項了(常規的方式) 2)通過工廠類獲得例項(工廠類實現了介面FactoryBean<?>) 例如: xml中的配置

Spring中Bean的生命週期[email protected]方法進行物件的初始化

方法:通過@Bean指定init-method和destroy-method; 注:單例項和原型模式物件的建立時間和初始化銷燬的時間順序不同。 一、單例項模式 1、建立Car例項物件,並建立初始化和銷燬方法 package com.atguigu.bean; imp

spring中IOC容器建立物件物件依賴關係處理

SpringIOC容器 1) 建立物件 SpringIOC容器,是spring核心內容。 作用: 建立物件 & 處理物件的依賴關係 IOC容器建立物件: 建立物件, 有幾種方式: 1) 呼叫無引數構造器 2) 帶引數構造器 3) 工廠建立物件 工廠類,靜態方法建立

Spring容器建立物件的三種方式

先建立一個Product類 bean的例項化  就是在spring容器裡註冊bean 第一種:通過無參構造方法建立   這種方法在啟動spring容器的時候就會建立bean物件 SpringContext利用無參的建構函式建立一個物件,然後利用setter方法賦值。

Spring 容器物件建立的過程

         Spring容器負責物件的建立過程,配置並且管理他們的建立過程,從建立到被回收。Spring有多種容器的實現,分為兩種型別,bean工廠,最簡單的容器,提供DI的支援。應用上下文是基於beanFactory構建的,提供企業極的服務。    常用的幾種應用上下

Java的匿名物件建立生命週期

匿名物件的特點: 1.匿名物件是沒有別其它物件所引用 2.使用一次就變成垃圾了,被垃圾回收器收回了 //匿名物件是沒有別其它物件所引用,就使用一次就變成垃圾了,被垃圾回收器收回了 public class TestMain { public void say()

如何確認spring容器建立了某個物件

如果監聽器載入了applicationContext.xml檔案,就會建立spring容器,相應的,也會根據配置的物件,建立物件,如果確定spring容器是否載入,可以通過以上兩種方式解決:1、咱們自己改錯applicationContext.Xml檔案,或者web.xml檔

Spring容器建立原始碼

BeanFactory預準備 Spring容器的refresh()【建立重新整理】; 1、prepareRefresh()重新整理前的預處理; 1)、initPropertySources()初始化一些屬性設定,本身方法為空;子類自定義個性化的屬性設定方法

知識儲備:Spring中Bean的生命週期(基於註解版)

一:前言 在Spring專案中,通常配置Spring都是使用XML的形式進行配置,配置bean是通過<bean></bean>標籤將bean加入IOC容器中,但在Spring註解版中,可以通過Java程式碼進行配置,即建立一個java類在其類頭上標註@Configurat

spring作用域與生命週期簡介

1. spring 作用域 使用scope屬性指定bean的作用域,預設值為singleton singleton 即單例模式,每次返回都是同一個bean prototype 原型模式,每次都會重新生成一個新的bean例項 2. bean生命週期簡介

Filter過濾器(如何建立生命週期,執行流程)

Filter過濾器是什麼??        開發人員可以實現使用者在訪問某個目標資源之前,對訪問的請求和響應進行攔截。簡單說,就是可以實現web容器對某資源的訪問前截獲進行相關的處理,還可以在某資源向web容器返回響應前進行截獲進行處理。 過濾器就

Spring學習--------Bean 的生命週期

                                                      Bean 的生命週期 Spring IOC 容器可以管理 Bean 的生命週期, Spring 允許在 Bean 生命週期的特定點執行定製的任務。 Spring I

spring中baen的生命週期,及生命週期中的作用

最近在看spring原始碼,所以總結下spring的生命週期和各個階段的作用。 spring的生命週期概括起來主要如下: 例項化 屬性注入 ioc注入 實現了BeanNameAware 則執行setBeanName方法  實現了BeanFactoryAw

spring中Bean的生命週期,具體再具體

今天在面試的時候,面試官提問到spring中Bean的生命週期,我的回答是: 1.例項化(為bean物件開闢空間) 2.初始化(對物件的屬性進行依賴注入,使用setter方法) 3.銷燬 我以為週期這裡

Spring原始碼系列 — Bean生命週期

前言 上篇文章中介紹了Spring容器的擴充套件點,這個是在Bean的建立過程之前執行的邏輯。承接擴充套件點之後,就是Spring容器的另一個核心:Bean的生命週期過程。這個生命週期過程大致經歷了一下的幾個階段 在本節中重點介紹例項化、填充裝配、喚醒Aware方法、BeanPostProce