一、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的執行個體化和初始化兩個階段的主要作用:
執行個體化:
執行個體化的過程是一個建立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