1. 程式人生 > >spring建立物件的三種方式詳解

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()方法來啟動該執行緒