Spring 框架中bean管理細節
一、創建bean的三種方式
1.使用默認構造函數(無參構造器)創建
在Spring的配置文件中,使用bean標籤,配置id
和class
屬性之後,且沒有其他屬性和標籤時。採用的就是默認構造函數創建bean對象,此時如果類中沒有默認構造函數,則對象無法創建成功。
示例:
beans.xml文件中配置bean
<bean id="userService" class="com.itjj.service.impl.userServiceImpl"></bean>
此時需要有無參構造器(當然,沒有自定義有參構造器時,可以沒有,因爲無參構造器是默認的)
public void UserServiceImpl(){
}
2.使用普通工廠中的方法創建對象(使用某個類中的方法創建對象,並存入ioc容器)
在com.itjj.factory下創建工廠類
//創建對象的工廠類
public class InstanceFactory{
//創建IUserService對象的方法
public IUserService getUserService(){
//返回值類型是要創建的對象型
return new UserServiceImpl();
}
}
beans.xml文件中配置bean
<!-- 工廠的bean -->
<bean id="instanceFactory" class="com.itjj.factory.impl.InstanceFactory"></bean>
<!-- 使用工廠創建對象
factory-bean:是工廠的bean
factory-method:是工廠類中創建該對象的方法
-->
<bean id="userService" factory-bean="instanceFactory" factory-method="getUserService"></bean>
3.使用工廠中的靜態方法創建對象(使用某個類中的靜態方法創建對象,並存入ioc容器)
在com.itjj.factory下創建工廠類
//創建對象的工廠類
public class StaticFactory{
//創建IUserService對象的靜態方法
public static IUserService getUserService(){
//返回值類型是要創建的對象型
return new UserServiceImpl();
}
}
beans.xml文件中配置bean
<!-- 使用靜態工廠創建對象
class:是靜態工廠類的全限定類名
factory-method:是工廠類中創建該對象的方法
-->
<bean id="userService" class="com.itjj.factory.impl.StaticFactory" factory-method="getUserService"></bean>
二、bean對象的作用範圍
bean標籤的scope
屬性:用於指定bean對象的作用範圍。
scop標籤的取值(常用singleton和prototype):
1.singleton
:單例的(默認值);
2.prototype
:多例的;
3.request
:作用域web應用的請求範圍;
4.session
:作用域web應用的會話範圍;
5.global-session
:作用域集羣環境的會話範圍(全局會話範圍)。
注:session與global-session,global-session是當有多臺服務器時,對所有服務器有效,,當不是集羣環境時,它就是session。
示例:
<bean id="userService" class="com.itjj.service.impl.userServiceImpl" scope="singleton"></bean>
三、bean對象的生命週期
1.單例對象(singleton時)
(1)創建:容器創建時,對象創建。(加載完beans配置文件,對象也就創建了)
(2)生存:只要容器還在,對象也一直存在。
(3)消亡:容器銷燬,對象消亡。
總結:單例對象,與容器共存亡。
2.多例對象(singleton時)
(1)創建:當我們使用對象時,spring框架爲我們創建。
(2)生存:對象只要是在使用過程中就一直存在。
(3)消亡:對象長時間不用,且沒有別的對象引用時,由Java回收機制(GC)回收。
總結:多例對象,與正常new出來的Java對象的生命週期一樣。