spring建立物件的三種方式詳解
前言
我們知道spring框架的核心就是IOC容器了,那麼IOC容器主要的作用就是建立物件和處理物件之間的依賴關係。本文主要講解IOC容器建立物件的三種方式。
建立物件的三種方式
1) 呼叫無引數構造器
2) 帶引數構造器
3) 工廠建立物件
包括:3.1 工廠類,靜態方法建立物件
3.2 工廠類,非靜態方法建立物件
1.呼叫無引數的構造器
具體如下:
User.java
public class User {
private int id;
private String name;
public User() {
super();
System.out.println("------User物件建立【無引數構造器】------");
}
public User(int id, String name) {
System.out.println("-----User物件建立【帶引數構造器】--------");
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
}
Bean.xml配置如下:
<!-- 1. 預設無引數構造器 -->
<bean id="user1" class="com.nwpu.geeker.User"></bean>
測試:
// 測試:物件建立
@Test
public void testIOC() throws Exception {
// 建立IOC容器物件
ApplicationContext ac = new ClassPathXmlApplicationContext("com/nwpu/geeker/bean.xml");
// 獲取容器中的物件
User user = (User) ac.getBean("user");
System.out.println(user);
}
2.帶引數構造器建立物件
例如:上面的user.java 有帶參的構造器,引數列表為(int,string).一般依賴注入物件的時候用的比較多。
配置如下:
<!-- 2. 帶引數構造器 -->
<bean id="user2" class="com.nwpu.geeker..User">
<constructor-arg index="0" type="int" value="100"></constructor-arg>
<constructor-arg index="1" type="java.lang.String" value="Jack"></constructor-arg>
</bean>
其中index屬性表示引數的位置。Type表示型別,value表示賦值,還有一個ref屬性下面將會介紹,表示可以引用IOC容器建立好的(已存在的)物件。
配置如下:
<!-- 定義一個字串,值是"Jack" ; String s = new String("jack")-->
<bean id="str" class="java.lang.String">
<constructor-arg value="Jacks"></constructor-arg>
</bean>
<bean id="user3" class="com.nwpu.geeker.User">
<constructor-arg index="0" type="int" value="100"></constructor-arg>
<constructor-arg index="1" type="java.lang.String" ref="str"></constructor-arg>
</bean>
ref屬性引用的就是IOC容器建立物件的id屬性值。
3.通過工廠類建立物件
3.1 通過例項化工廠,非靜態方法建立物件
先建立工廠javaBean
// 工廠,建立物件
public class ObjectFactory {
// 例項方法建立物件
public User getInstance() {
return new User(100,"工廠:呼叫例項方法");
}
// 靜態方法建立物件
public static User getStaticInstance() {
return new User(101,"工廠:呼叫靜態方法");
}
}
配置檔案:
<!-- # 3.1 工廠類,例項方法 -->
<!-- 先建立工廠 -->
<bean id="factory" class="com.nwpu.geeker.ObjectFactory"></bean>
<!-- 在建立user物件,用factory方的例項方法 -->
<bean id="user4" factory-bean="factory" factory-method="getInstance"></bean>
其中: factory-bean=”factory”指定工廠。factory-method=”getInstance”指定工廠的哪個方法。
3.2 工廠類: 靜態方法建立物件
<bean id="user" class="com.nwpu.geeker.ObjectFactory" factory-method="getStaticInstance"></bean>
class 指定的就是工廠型別,這裡是和上面配置不同的地方。
factory-method 一定是工廠裡面的“靜態方法”
建立物件的細節問題
1) 物件建立: 單例/多例
在bean.xml配置檔案中,配置scope=”singleton”,為單例建立物件,如果不配置,預設也是單例方式。主要應用於service/dao層還有一些utils工具類等只需要在伺服器啟動時初始化一次即可。
scope=”prototype”,表示多例方式建立物件,也就是當用戶需要使用這個物件時即建立物件,在ssh專案整合中主要應用於Action物件。這種方式一般在伺服器啟動時不會建立物件,在每次使用才建立。
2) 什麼時候建立?上面其實已經說了
scope=”prototype” 在用到物件的時候,才建立物件。(在ioc容器初始化之後)
scope=”singleton” 在伺服器啟動時候(容器初始化之前), 就已經建立了bean,且整個應用只有一個。
3)是否延遲建立
lazy-init=”false” 預設為false, 不延遲建立,即在啟動時候就建立物件
lazy-init=”true” 延遲初始化, 在用到物件的時候才建立物件
(只對單例有效)因為多例本來就是訪問物件時才建立。
4) 建立物件之後,初始化/銷燬
init-method=”init_user” 【對應物件的init_user方法,在物件建立好之後執行 】
destroy-method=”destroy_user” 【在呼叫容器物件的destroy方法時候執行,(容器用實現類)】
public class User {
private int id;
private String name;
public User() {
super();
System.out.println("------User物件建立------");
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void init_user() {
System.out.println("建立物件之後,初始化");
}
public void destroy_user() {
System.out.println("IOC容器銷燬,user物件回收!");
}
}
測試:
@Test
public void testIOC() throws Exception {
// 得到IOC容器物件 【用實現類,因為要呼叫銷燬的方法】
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("com/nwpu/geeker/applicationContext.xml");
System.out.println("-----容器建立-----");
// 從容器中獲取bean
User user1 = (User) ac.getBean("user");
User user2 = (User) ac.getBean("user");
System.out.println(user1);
System.out.println(user2);
// 銷燬容器物件
ac.destroy();
}
@Test
public void test() throws Exception {
// 容器物件
ApplicationContext ac = new ClassPathXmlApplicationContext("com/nwpu/geeker/applicationContext.xml");
System.out.println("-----容器建立完成-----");
User user1 = (User) ac.getBean("user1");
}
相關推薦
spring建立物件的三種方式詳解
前言 我們知道spring框架的核心就是IOC容器了,那麼IOC容器主要的作用就是建立物件和處理物件之間的依賴關係。本文主要講解IOC容器建立物件的三種方式。 建立物件的三種方式 1) 呼叫無引數構造器 2) 帶引數構造器 3) 工廠建立物件
css3中建立動畫的三種方式詳解
$div1.transition({ transform : "translateX(300px)" },3000,"linear", function(){ $div2.transition({ transform : "translateX(300px)" },30
JS 之函式定義 & 建立物件 三種方式
JS函式建立三種方式 JS建立物件三種方式 一、javaScript 函式建立的三種方式 <html> <head> <meta http-equiv="Content-Type" content="text/htm
多表連線的三種方式詳解 hash join、merge join、 nested loop
在多表聯合查詢的時候,如果我們檢視它的執行計劃,就會發現裡面有多表之間的連線方式。多表之間的連線有三種方式:Nested Loops,Hash Join 和 Sort Merge Join.具體適用哪種型別的連線取決於 當前的優化器模式 (ALL_ROWS 和 RULE) 取決於表大小 取決於連線列
多表連線的三種方式詳解 HASH JOIN MERGE JOIN NESTED LOOP
在多表聯合查詢的時候,如果我們檢視它的執行計劃,就會發現裡面有多表之間的連線方式。 之前打算在sqlplus中用執行計劃的,但是格式看起來有點亂,就用Toad 做了3個截圖。
【REACT NATIVE 系列教程之四】重新整理元件RENDER(重新渲染)的三種方式詳解
開發過遊戲的都應該很清楚,“刷屏”是多麼的重要。其實開發應用也如此,當元件的資料被修改後,如何及時更新元件呈現出最新的資料與效果一樣至關重要。那麼這裡Himi大概講三種常用的方式:this.setState() 【最為常用】這是在事件處理函式中和請求回撥函式中觸發 UI 更新的主要方法。一般情況下setSt
多表連線的三種方式詳解 HASH JOIN MERGE JOIN NESTED LOOP【3】
SQL server 內部實現了三種類型的內連線運算,大多數人從來沒有聽說過這些連線型別,因為它們不是邏輯連線也很少被用於程式碼中。那麼它們什麼時候會被用到呢?答案是要依情況而定。這就意味著要依賴於記錄集和索引。查詢優化器總是智慧的選擇最優的物理連線型別。我們知道SQL優
mysql備份的三種方式詳解
mysql> FLUSH TABLES WITH READ LOCK; 請求讀鎖 注:不要退出,另起一個終端: mysql> SHOW MASTER STATUS; 檢視二進位制檔案的位置 +------------------+----------+----------
Spring容器的兩種方式詳解
1、Spring容器初始化兩種方式 (1)ApplicationContext(子類) //預設載入檔案系統的配置檔案,主要配置檔案放在專案下、本地上、類路徑下(3種位置) ApplicationContext ac=new FileSyst
javascript函式定義三種方式詳解
定義函式的三種方式 function語句式 function test1() { console.info("test1"); } 函式的直接變數 ECMAScript var test2 = function () { cons
物件建立的三種方式和閉包的兩種常用場景--js
物件建立的三種方式 ①通過new關鍵字建立物件 var obj = new Object(); obj.name = 'daxue'; obj.age = 28; obj.fun = function(){ } alert(obj.age); ②
Spring boot實現熱部署的兩種方式詳解
熱部署是什麼大家都知道在專案開發過程中,常常會改動頁面資料或者修改資料結構,為了顯示改動效果,往往需要重啟應用檢視改變效果,其實就是重新編譯生成了新的 Class 檔案,這個檔案裡記錄著和程式碼等對應的各種資訊,然後 Class 檔案將被虛擬機器的 ClassLoader 載入。而熱部署正是利用了這個特點,它
JS創建對象的幾種方式詳解
演員 sta say object ron 操作 tar obj 構造 Js是一門面向對象的語言,裏面沒有類的思想,所以直接是創建對象,下面介紹幾種創建對象的方法: 1.對象字面量的方法:記住鍵值對格式:{key:value,key :value} 實例: Var
spring AOP解析之註解方式詳解
parser 分享 pro asp mes aop log space spec 命名空間處理器是AopNamespaceHandler,我們可以看到這裏註冊了幾個解析器,第一個我們知道是xml形式的解析,接下來我們看AspectJAutoProxyBeanDefiniti
new和delete的三種形式詳解
分別是 額外 ID 調用 pre else class code alloc 一、new操作符、delete操作符 class String { public: String(const char *str="") { if
元素建立的三種方式
<!--元素建立的三種方式--> <!--1.document.write("標籤的程式碼及內容")--> <!--2.物件.innerHTML="標籤及程式碼"--> <!--3.document.createElement("標籤的名字")--&
執行spring boot應用三種方式
nag click 執行 dbf mage main方法 ring 圖片 water 1.在IDE中執行在應用程序主入口右鍵執行main方法2.在項目根目錄通過命令執行3.生成可執行jar執行spring boot應用三種方式
排列硬幣 arrange coins 三種解法詳解
* 排列硬幣 * https://leetcode-cn.com/problems/arranging-coins/description/ * 你總共有 n 枚硬幣,你需要將它們擺成一個階梯形狀,第
JavaScript中元素建立的三種方式
目錄 1. document.write("標籤的程式碼及內容"); 缺陷:如果是在頁面載入完畢後,此時通過這種方式建立元素,那麼頁面上存在的所有的內容全部被幹掉 <body> <input type="button" valu
Java多執行緒建立的三種方式與對比
一、繼承Thread類建立執行緒類 1、定義Thread類的子類,並重寫該類的run()方法,該run()方法的方法體代表了執行緒需要完成的任務,即執行緒的執行體。 2、建立Thread子類的例項,即建立執行緒物件。 3、呼叫執行緒物件的start()方法來啟動該執行緒