天天看點

Spring bean的作用域以及生命周期一、request與session的差別二、Spring bean的作用域三、Spring bean的生命周期與初始化過程

一、request與session的差別

request簡介

request範圍較小一些,隻是一個請求。

request對象的生命周期是針對一個用戶端(說确切點就是一個浏覽器應用程式)的一次請求,當請求完畢之後,request裡邊的内容也将被釋放點 。

簡單說就是你在頁面上的一個操作,request.getParameter()就是從上一個頁面中的url、form中擷取參數。

但如果一個request涉及多個類,後面還要取參數,可以用request.setAttribute()和request.getAttribute()。

但是當結果輸出之後,request就結束了。

session簡介

session可以跨越很多頁面。

而session的生命周期也是針對一個用戶端,但是卻是在别人設定的會話周期内(一般是20-30分鐘),session裡邊的内容将一直存在,即便關閉了這個用戶端浏覽器 session也不一定會馬上釋放掉的。

可以了解是用戶端同一個IE視窗發出的多個請求。

這之間都可以傳遞參數,比如很多網站的使用者登入都用到了。

兩者差別

request占用資源比較少,安全性也比較高,可是相對來說缺乏持續性。

session則相對來說對資源的消耗會大點,安全性相對來說也會稍微低點,可是它能實作比如會話跟蹤技術。

如果可以使用request的情況下,盡量使用request 因為相對于伺服器來說資源的消耗還是比較重要的。

在傳遞頁面過程中request傳遞到下一頁面就不能再傳遞了,而sesison卻不如此,即request僅限于2個相鄰的頁面

每按一個網頁上的一個連結就是一個新的request,當伺服器傳回給浏覽器一個response時,request就結束了,此時儲存在request中的對象就不存在了,

但是當你用一個浏器連到伺服器上時application-server會新開一個session給你,當連接配接逾時或浏覽器關閉時session才銷毀。

是以說作用的範圍是不一樣,session也就可以跟蹤使用者的狀态。

二、Spring bean的作用域

Spring 3中為Bean定義了5中作用域,分别為singleton(單例)、prototype(原型)、request、session和global session,5種作用域說明如下:

1.singleton

單例模式,Spring IoC容器中隻會存在一個共享的Bean執行個體,無論有多少個Bean引用它,始終指向同一對象。Singleton作用域是Spring中的預設作用域,也可以顯示的将Bean定義為singleton模式,配置為:

<bean id="userDao" class="com.stonegeek.UserDaoImpl" scope="singleton"/>
           

2.prototype

原型模式,每次通過Spring容器擷取prototype定義的bean時,容器都将建立一個新的Bean執行個體,每個Bean執行個體都有自己的屬性和狀态,而singleton全局隻有一個對象。根據經驗,對有狀态的bean使用prototype作用域,而對無狀态的bean使用singleton作用域。

<bean id="userDao" class="com.stonegeek.UserDaoImpl" scope="prototype"/>
           

3.request

針對每一次Http請求,Spring容器根據該bean的定義建立一個全新的執行個體,且該執行個體僅在目前Http請求内有效,而其它請求無法看到目前請求中狀态的變化,當目前Http請求結束,該bean執行個體也将會被銷毀。

第一步:在web應用的xml檔案中聲明ContextListener
<web-app>
 ...
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
 ...
</web-app>
第二步:配置scope即可
<bean id="loginAction" class="com.stonegeek.Login" scope="request"/>
           

4.session

同Http請求相同,每一次session請求建立新的執行個體,而不同的執行個體之間不共享屬性,且執行個體僅在自己的session請求内有效,請求結束,則執行個體将被銷毀。

省略web.xml中的聲明
<bean id="userPreference" class="com.stonegeek.UserPreference" scope="session"/>  
           

5.global Session

相對于session,此session時全局的,在一個全局的Http Session中,容器會傳回該Bean的同一個執行個體,僅在使用portlet context時有效。

省略web.xml中的聲明
<bean id="userPreference" class="com.stonegeek.UserPreference" scope="global session"/>  
           

三、Spring bean的生命周期與初始化過程

Spring bean的作用域以及生命周期一、request與session的差別二、Spring bean的作用域三、Spring bean的生命周期與初始化過程
Spring bean的作用域以及生命周期一、request與session的差別二、Spring bean的作用域三、Spring bean的生命周期與初始化過程

先區分一下Spring bean的執行個體化和初始化兩個階段的主要作用:

執行個體化:

執行個體化的過程是一個建立Bean的過程,即調用Bean的構造函數,單例的Bean放入單例池中

初始化:

初始化的過程是一個指派的過程,即調用Bean的setter,設定Bean的屬性

執行過程

1.(執行個體化)執行bean的構造器

2.為bean注入屬性

  • 調用BeanNameAware的setBeanName方法
  • 調用BeanFactoryAware的setBeanFactory方法

3.(初始化)

  • 調用InitializingBean的afterPropertiesSet方法
  • 調用自身的init-method屬性指定的初始化方法

4.執行正常調用

5.銷毀

  • 調用DiposibleBean的destory方法
  • 調用的destroy-method屬性指定的銷毀方法

1.BeanPostProcessor接口(Spring的後置處理器)

如果我們想在Spring容器中完成bean執行個體化、配置以及其他初始化方法前後要添加一些自己邏輯處理。我們需要定義一個或多個BeanPostProcessor接口實作類,然後注冊到Spring IoC容器中。

當然,此接口有的兩個方法postProcessBeforeInitialization方法、postProcessAfterInitialization方法主要作用于初始化前後,

2.InstantiationAwareBeanPostProcessor接口

InstantiationAwareBeanPostProcessor接口繼承BeanPostProcessor接口,它内部提供了3個方法,再加上BeanPostProcessor接口内部的2個方法,是以實作這個接口需要實作5個方法。InstantiationAwareBeanPostProcessor接口的主要作用在于目标對象的執行個體化過程中需要處理的事情,包括執行個體化對象的前後過程以及執行個體的屬性設定

3.BeanFactoryPostProcessor接口

Spring IoC容器允許BeanFactoryPostProcessor在容器執行個體化任何bean之前讀取bean的定義(配置中繼資料),并可以修改它。同時可以定義多個BeanFactoryPostProcessor,通過設定'order'屬性來确定各個BeanFactoryPostProcessor執行順序。

注冊一個BeanFactoryPostProcessor執行個體需要定義一個Java類來實作BeanFactoryPostProcessor接口,并重寫該接口的postProcessorBeanFactory方法。通過beanFactory可以擷取bean的定義資訊,并可以修改bean的定義資訊。這點是和BeanPostProcessor最大差別

4.bean自身的方法

這個包括了Bean本身調用的方法和通過配置檔案中的init-method和destroy-method指定的方法

5.bean級生命周期接口方法

這個包括了BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean這些接口的方法

(1)BeanNameAware接口

就一個方法setBeanName(String name)

設定bean的名字

(2)BeanFactoryAware接口

就一個方法setFactory(BeanFactory factory)

注入一個beanfactory

(3)InitializingBean

InitializingBean接口為bean提供了初始化方法的方式,它隻包括afterPropertiesSet方法,凡是繼承該接口的類,在初始化bean的時候會執行該方法。

(4)DiposableBean

DisposableBean接口隻提供了destroy()方法。在銷毀bean時,會調用此方法

轉載于:https://www.cnblogs.com/sxkgeek/p/9350956.html