一、bean的名字與標識符
<bean id="" class=""></bean>
bean的名字作用: 獲取這個bean通過bean名字獲取
bean名字配置方式:
- id: 唯一標志符, 命名規范與變量命名規范一樣, 包含特殊符號
- name: 配置名字: 可以包含特殊符號,沒有要求, 比如
.
一次性取多個名字
<bean name="dog1,dog2,dog3" id="dog" class="com.fs.entity.Dog"></bean>
- ?
<alias>
標簽給bean取別名
<alias name="dog1" alias="dog4"/>
推薦: 開發中,使用id就可以了
如果一個bean沒有設置id,name屬性, 這個bean有默認名字:
這個類型bean第一個bean對象名字: 類全限定名
從第二個開始: 類全限定名#下標
<!--默認名字:com.fs.entity.Dog-->
<bean class="com.fs.entity.Dog"><property name="name" value="小黑"/><property name="age" value="1"/>
</bean>
<!--第二個bean默認名字:com.fs.entity.Dog#1-->
<bean class="com.fs.entity.Dog"><property name="name" value="小白"/><property name="age" value="2"/>
</bean>
二、bean的作用域
使用scope屬性來設置, 默認值: singleton (單例bean)
概念:
- 單例: 同一個名字的bean在spring容器中只有一個,共享
- 設計模式: 單例設計模式
這個類在整個項目中只能有一個對象, 為了共享
實現方式:
- 懶漢模式: 第一次獲取這個單例對象,才創建
package com.fs.slt;/*** @author suke* @version 1.0* @title SingletonObject* @description 單例設計模式* 只能有一個對象* @create 2024/6/21 9:17
*/
public class SingletonObject {//共享private static SingletonObject instance;//構造方法 默認無參構造方法, 修飾符: public(整個項目可見), 這個構造方法在任何一個類中都可見//1.構造方法私有化private SingletonObject(){}public static SingletonObject getInstance(){//懶漢模式if(instance == null){instance = new SingletonObject();}return instance;}
}
線程并發下安全問題, 多線程并發訪問下, 可能創建多個對象
升級版本1: 給getInstance()方法變成同步方法 )
public static synchronized
Singleton0bject getInstance(){
//懶漢模式
if(instance == null){
instance = new Singleton0bject():
return instance;
?解決線程并發問題
問題: 效率問題, 低, 獲取對象, 也排隊
加鎖加在創建對象的代碼上, 讀對象,沒有修改,不需要加鎖
升級版2: 雙層檢查鎖
public static SingletonObject getInstance(){//懶漢模式if (instance == null) {synchronized(SingletonObject.class) {if(instance == null){instance = new SingletonObject();}}}return instance;}
防止instace內存不一致問題,需要在instace對象上添加一個volatile關鍵字
package com.fs.slt;/**
* @author suke
* @version 1.0
* @title SingletonObject
* @description 單例設計模式
* 只能有一個對象
* @create 2024/6/21 9:17
*/
public class SingletonObject {
//共享
private static volatile SingletonObject instance;
//構造方法 默認無參構造方法, 修飾符: public(整個項目可見), 這個構造方法在任何一個類中都可見//1.構造方法私有化
private SingletonObject(){}public static SingletonObject getInstance(){//懶漢模式if (instance == null) {synchronized(SingletonObject.class) {if(instance == null){instance = new SingletonObject();}}}return instance;
}
}
2.餓漢模式
public class SingletonObject {//餓漢模式private static SingletonObject instance = new SingletonObject();//構造方法 默認無參構造方法, 修飾符: public(整個項目可見), 這個構造方法在任何一個類中都可見//1.構造方法私有化private SingletonObject(){}public static SingletonObject getInstance(){return instance;}
}
實現步驟:構造方法私有化
- 提供一個公開靜態的方法,獲取本類對象
- 提供一個靜態的本類對象屬性
三、bean生命周期的配置
單例bean生命周期:
Spring容器創建的時間, spring創建所有的單例的bean對象, 如果你配置的init-method(初始化方法), 去執行你配置初始化方法, spring會把這個單例Bean對象保存到單例池中, 等待其他對象獲取bean(服務), 當Spring要銷毀這個bean之前, 如果你配置的destroy-method, 就執行你配置銷毀的方法.
<bean id="p1"class="com.fs.entity.Person" init-method="init"destroy-method="destroy"></bean>