1. 程式人生 > >Spring IOC的一些高階特性

Spring IOC的一些高階特性

1.Lookup方法注入

        在大部分的應用場景中,容器中的大部分bean是singleton型別的。當一個單例bean需要和另外一個單例bean協作時,或者一個非單例bean要引用另外一個非單例bean時,通常情況下將一個bean定義為另外一個bean的屬性值就行了。不過對於具有不同生命週期的bean來說這樣做就會有問題了,比如在呼叫一個單例型別bean A的某個方法,需要引用另一個非單例(prototype)型別bean B,對於bean A來說,容器只會建立一次,這樣就沒法在需要的時候每次讓容器為bean A提供一個新的bean B例項。

        Lookup方法具有使容器覆蓋受容器管理的

bean方法的能力,從而返回指定名字的bean例項。在上述場景中,Lookup方法注入適用於原型bean。 Lookup方法注入的內部機制是Spring利用了CGLIB庫在執行時生成二進位制程式碼的功能,通過動態建立Lookup方法bean的子類從而達到複寫Lookup方法的目的。

        為了使動態子類起作用,Spring容器要子類化的類不能是final,並且需要覆寫的方法也不能是final。同樣的,要測試一個包含抽象方法的類也稍微有些不同,你需要子集編寫它的子類提供該抽象方法的實現。最後,作為方法注入目標的bean不能是序列化的。在Spring 3.2之後再也沒必要新增CGLIB到classpath,因為CGLIB的類打包在了org.springframework下並且在Spring核心JAR中有所描述。這樣做既方便,又避免了與其他使用了不同版本CGLIB的專案的衝突。

        假如現在有2個類:Clerk和ClerkManager,其中ClerkManager依賴於Clerk,即ClerkManager持有型別為Clerk的私有屬性,現在我們想讓Clerk been的作用域為singleton,而ClerkManager been的作用域為prototype,如果不做任何處理直接在ClerkManager been中設定Clerk屬性,就會出現問題,即每次應用的Clerk been都是同一個,無法達到預期的效果。這個時候我們可以使用Spring的Lookup方法注入來達到在每次引用Clerk屬性的時候都會動態建立一個新的Clerk been的目的。一下是Clerk和ClerkManager的程式碼:

package com.ioc.lookup;

public class Clerk {
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

}
package com.ioc.lookup;

public abstract class ClerkManager {
	private Clerk clerk;
	
    public Object process() {
        //呼叫createClerk()方法動態生成Clerk物件
        Clerk Clerk=createClerk();
        return Clerk;
    }

    //這個動態生成Clerk物件的方法,這是個抽象方法,Spring容器會自動覆寫createClerk()方法的實現。
    protected abstract Clerk createClerk();

	public Clerk getClerk() {
		return clerk;
	}

	public void setClerk(Clerk clerk) {
		this.clerk = clerk;
	}
    
}


        接著我們在applicationContext.xml中配置如上類的bean:

	<bean id="clerk" class="com.ioc.lookup.Clerk" scope="prototype">
		<property name="name" value="Tom"></property>
		<property name="age" value="20"></property>
	</bean>
	
	<bean id="clerkManager" class="com.ioc.lookup.ClerkManager" scope="singleton">
		<lookup-method name="createClerk" bean="clerk"/>
	</bean>

        最後編寫一個測試類:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.ioc.lookup.ClerkManager;

public class LookuoDemo {

	public static void main(String[] args) {

		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
		
		ClerkManager clerkManager=(ClerkManager) applicationContext.getBean("clerkManager");
		
		System.out.println("第一次注入的Clerk:"+clerkManager.process());
		
		System.out.println("第二次注入的Clerk:"+clerkManager.process());

	}

}

        執行測試類,結果如下:

        可以看到,兩次注入的Clerk been是不一樣的,因此達到了我們的目的。

相關推薦

Spring IOC一些高階特性

1.Lookup方法注入         在大部分的應用場景中,容器中的大部分bean是singleton型別的。當一個單例bean需要和另外一個單例bean協作時,或者一個非單例bean要引用另外一個非單例bean時,通常情況下將一個bean定義為另外一個bean的屬性值

spring學習筆記:ioc容器高階特性

Spring容器的高階特性涉及到屬性編輯器,使用外部屬性檔案,國際化,容器事件等等; 今天講解一下屬性編輯器,使用外部資源,國際化。 屬性編輯器  如果你沒有了解過屬性編輯器,建議你先google一下,我簡單的解釋一下什麼是屬性編輯器,看一個新寫的有代表性的bean:pack

Python的一些高階特性

切片 >>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] >>> L[0:3] ['Michael', 'Sarah', 'Tracy'] >>>

python-網路爬蟲初學二:headers的設定和一些高階特性

一、設定headers url = "http://www.server.com/login" # 設定請求的身份,如果沒有,伺服器可能會沒有響應 user_agent = "Mozilla/4.0 (compatible; MSIE 5.5; Windows N

Spring IoC容器設計原理及高階特性

文章目錄 Spring IoC容器概述 IoC容器系列的設計與實現:BeanFactory和ApplicationContext BeanFactory BeanFactory容器的設計原理 Applicatio

四、原始碼分析 SpringIOC 容器的高階特性

高階特性介紹 通過前面對 Spring IOC 容器的原始碼分析,我們已經基本上了解了 Spring IOC 容器對 Bean 定義資源的定位、讀入和解析過程,同時也清楚了當使用者通過 getBean 方法向 IOC 容器獲取被管理的 Bean 時,IOC 容器對 Bean 進行的初始化

Spring cloud HSF 整合 HSF 高階特性

本頁目錄 單元測試 非同步呼叫 在之前的文件中,HSF 開發已經介紹瞭如何使用 Spring Cloud 來開發 HSF 應用。 本文將介紹一下 HSF 的一些高階特性在 Spring Cloud 開發方式下的使用方式。目前內容包含 單元測試 和 非同步呼叫 兩部分

(一)Spring IoC原始碼-3.其他特性的實現原理-01lazy-init與預例項化

前面的文章也提到過,IOC容器初始化過程一般不包含Bean載入的實現。Bean載入一般發生在應用第一次通過getBean向容器索取Bean的時候。但有一個例外:如果在XML檔案中為Bean定義了lazy-init屬性,那麼Bean的載入在IOC容器初始化時就

(一)Spring IoC原始碼-3.其他特性的實現原理-02迴圈依賴的解決

引言:迴圈依賴就是N個類中迴圈巢狀引用,如果在日常開發中我們用new 物件的方式發生這種迴圈依賴的話程式會在執行時一直迴圈呼叫,直至記憶體溢位報錯。下面說一下Spring是如果解決迴圈依賴的。 第一種:構造器引數迴圈依賴 Spring容器會將每一個正

IOC容器的高階特性

1.通過前面4節對Spring IoC容器的原始碼分析,我們已經基本上了解了Spring IoC容器對Bean定義資源的定位、讀入和解析過程,同時也清楚了當使用者通過getBean方法向IoC容器獲取被管理的Bean時,IoC容器對Bean進行的初始化和依賴注入過程,這些是Spring IoC容器的

SpringSpring的兩大特性IOC和AOP

3.EJB的缺點 1巨大而複雜的規格說明:對於一個複雜的分散式系統,有一個文件進行說明是一件很合理的事情。但是,並不是所有的文件資訊都是真正必需的,EJB的文件反而成了一個非常不便利的工具。 2龐大的檔案,複雜的業務:開發設計一個專案之前,通常需要閱讀1000多頁的需求說明書文件。這是部署EJB時非常痛苦的

理解Spring 的兩大特性IOC和AOP)

Spring的核心特性就是IOC和AOPIOC:控制反轉    AOP:面向切面程式設計IOC:(媒婆)IOC,另外一種說法叫DI(Dependency Injection),即依賴注入。它並不是一種技術實現,而是一種設計思想。在任何一個有實際開發意義的程式專案中,我們會使用

spring IoC容器的實現。

管理 體系 控制 我們 管理系 content 具體實現 抽象 目的 控制反轉是spring的重要概念。而實現控制反轉的IoC容器具體又是如何實現呢。 IoC容器的目的是能夠管理系統中各個對象之間的關系和依賴,為了實現這個功能,spring框架對Bean做了進一步抽象 Be

Spring IOC實現原理

spring ioc實現原理一、IOC 容器:最主要是完成了完成對象的創建和依賴的管理註入等等。 所謂控制反轉,就是把原先我們代碼裏面需要實現的對象創建、依賴的代碼,反轉給容器來幫忙實現。那麽必然的我們需要創建一個容器,同時需要一種描述來讓容器知道需要創建的對象與對象的關系。這個描述最具體表現就是我們可配置

spring IOC(DI)實驗

trace read 代碼 dom getbean asc ng- tel .com 軟件151 張鑫棟 一、IOC的意思是控件反轉也就是由容器控制程序之間的關系,把控件權交給了外部容器,之前的寫法,由程序代碼直接操控,而現在控制權由應用代碼中轉到了外部容器,控制權的轉移

Spring IOC 實例

new wid cto files 中國 參數 項目 XML return 軟件151 徐中飛 Spring的模塊化是很強的,各個功能模塊都是獨立的,我們可以選擇的使用。這一章先從Spring的IoC開始。所謂IoC就是一個用XML來定義生成對象的模式,我們看看如果

spring IOC實驗

ati classpath ont mls ica pat 私有 tsa rom 軟件151 朱實友 (1)基於XML的配置元數據的基本結構 <?xml version="1.0" encoding="UTF-8"?> <

spring ioc

eric 中國 factor nbsp 而是 錯誤 ack odi 測試的 軟件152 程永績 1.什麽是IOC: Ioc—Inversion of Control,即“控制反轉”,不是什麽技術,而是一種設計思想。在Java開發中,Ioc意味著將你設計好的對象交給容器控制,

spring IOC(DI)

ati 運行期 cati 概念 test 關系 好的 control 對象 軟件152 劉昊翰 一、IOC(DI) 概念 IOC(Inversion of Control,控制倒轉)Ioc意味著將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。 DI—

spring 事務的傳播特性

nal 調用 ransac 提交 port 文件 action com pre 1.聲明式事物中,一個類serviceA的方法test1()調用另一個類serviceB的方法test2() 要是serviceB的test2()事務配置在xml文件中為REQUIRED,又