最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析Spring工廠的反射和配置文件

 更新時間:2023年04月07日 08:47:56   作者:CrazyDragon_King  
這篇文章主要介紹了淺析Spring工廠的反射和配置文件,spring是通過反射和配置文件的方式來獲取 JavaBean 對象,需要的朋友可以參考下

反射和配置文件

學(xué)習(xí) Spring 的時候,雖然可以知道是通過反射和配置文件的方式來獲取 JavaBean 對象,但是一直沒有機(jī)會自己嘗試一次,探究以下內(nèi)部原理,雖然有人推薦閱讀源碼,但是可能還是感覺學(xué)的不好,一直沒有嘗試過?,F(xiàn)在剛好學(xué)習(xí)設(shè)計模式剛好遇到了這部分的內(nèi)容了,感覺自己對這個有了一個較好的理解了。

設(shè)計模式中,為了滿足開閉原則,大都引入了抽象層,如工廠方法模式、抽象工廠模式等。客戶端針對抽象層編程,而在程序運(yùn)行的時候再指定其子類,根據(jù)里氏代換原則和面向?qū)ο蟮亩鄳B(tài)性,子類對象再運(yùn)行時將覆蓋父類對象。如果需要對系統(tǒng)進(jìn)行擴(kuò)展,只需要修改子類類名即可。在具體實(shí)現(xiàn)時,通過引入配置文件可以使得用戶再不修改客戶端任何代碼的前提下增加或替換子類,

其基本實(shí)現(xiàn)過程過程為:

  1. 客戶端針對抽象層編程,客戶端代碼中不能出現(xiàn)具體的類名,即客戶端不直接實(shí)例化對象。
  2. 引入純文本格式的配置文件,通常是 XML 文件,將具體類類名存儲在配置文件中。
  3. 通過 DOM(Document Object Model,文檔對象模型)、SAX(SimpleAPI for XML)等 XML 解析技術(shù)獲取存儲在配置文件中類名。
  4. 在客戶端代碼中通過反射機(jī)制根據(jù)類名創(chuàng)建對象,用反射所創(chuàng)建的對象代替父類對象的引用,程序運(yùn)行時,將調(diào)用子類方法來實(shí)現(xiàn)業(yè)務(wù)功能。
  5. 如果需要擴(kuò)展功能,只需要添加一個新的子類繼承抽象父類,再修改配置文件,重新運(yùn)行程序即可;如果需要替換功能,只需要另一個子類類名替換存儲再配置文件中的原有子類類名。無論是擴(kuò)展還是替換都無須修改既有類庫和客戶端源碼,完全符合開閉原則。

Talk is cheap, show me the code.

直接通過代碼來理解上面的內(nèi)容吧。

<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean>com.reflect.Dog</bean>
</beans>

測試實(shí)體類

package com.reflect;

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

	@Override
	public String toString() {
		return "Dog [name=" + name + ", age=" + age + "]";
	}
}

對象工廠類(類似Spring工廠的簡單實(shí)現(xiàn))

package com.reflect;

import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.*;

public class Factory {
	public static Object getBean() {
		try {
			Document doc = DocumentBuilderFactory
					.newInstance()
					.newDocumentBuilder()
					.parse("src/beans.xml");
			
			//獲取包含類名的文本節(jié)點(diǎn)
			NodeList nodeList  = doc.getElementsByTagName("bean");
			Node node = nodeList.item(0).getFirstChild();
			String name = node.getNodeValue();
			
			//通過類名生成實(shí)例對象并將其返回
			Class<?> clazz = Class.forName(name);
			return clazz.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
			return null; 
		} 
	}
}

測試類

package com.reflect;

public class Test {
	public static void main(String[] args) {
		Dog dog = null;
		dog = (Dog)Factory.getBean();
		dog.setName("小黑");
		dog.setAge(12);
		System.out.println(dog.toString());
	}
}

項目目錄結(jié)構(gòu)
注意這里需要使用 dom4j 的jar包,下載導(dǎo)入即可!

在這里插入圖片描述

運(yùn)行結(jié)果

在這里插入圖片描述

現(xiàn)在需求變了,不想使用 Dog 類,而要使用 HuntDog 類,只要增加 HuntDog 類, 并繼承 Dog 類即可,項目源碼不需要改動,滿足開閉原則。

package com.reflect;

public class HuntDog extends Dog {
	private String name;
	private Integer age;
	
	public HuntDog() {}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}

	
	@Override
	public String toString() {
		return "HuntDog [name=" + name + ", age=" + age + "]";
	}

	public void say() {
		System.out.println("Hello, I am HuntDog: "+this.toString());
	}
}

修改 XML 如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean>com.reflect.HuntDog</bean>
</beans>

修改后的運(yùn)行結(jié)果

在這里插入圖片描述

總結(jié)

這個例子使用反射和配置文件,寫了一個滿足開閉原則的代碼,這點(diǎn)和 Spring的對象工廠思想很像(Spring 的設(shè)計思想很優(yōu)美,很龐大,這里只是我個人的理解),對于初學(xué) Spring的人應(yīng)該有一定的幫助(比如說我,哈哈)。
好了,大體來說這個例子非常的簡單,但是已經(jīng)足夠了,我覺得如果能用簡單的例子講好一個復(fù)雜的東西也是很厲害的,我也是在慢慢學(xué)習(xí),希望可以繼續(xù)進(jìn)步,加油!

到此這篇關(guān)于淺析Spring工廠的反射和配置文件的文章就介紹到這了,更多相關(guān)Spring工廠反射配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(30)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(30)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • JAVA中 Spring定時器的兩種實(shí)現(xiàn)方式

    JAVA中 Spring定時器的兩種實(shí)現(xiàn)方式

    本文向您介紹Spring定時器的兩種實(shí)現(xiàn)方式,包括Java Timer定時和Quartz定時器,兩種Spring定時器的實(shí)現(xiàn)方式各有優(yōu)點(diǎn),可結(jié)合具體項目考慮是否采用。
    2015-09-09
  • Java設(shè)計模式中的觀察者模式

    Java設(shè)計模式中的觀察者模式

    觀察者模式定義對象之間的一種一對多的依賴關(guān)系,使得每當(dāng)一個對象的狀態(tài)發(fā)生變化時,其相關(guān)的依賴對象都可以得到通知并被自動更新。主要用于多個不同的對象對一個對象的某個方法會做出不同的反應(yīng)
    2023-02-02
  • IDEA中的HTTP Client使用教程

    IDEA中的HTTP Client使用教程

    這篇文章主要介紹了IDEA中的HTTP Client使用教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Spring Hystrix熔斷報警原理圖例解析

    Spring Hystrix熔斷報警原理圖例解析

    這篇文章主要介紹了Spring Hystrix熔斷報警原理圖例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • 利用Java連接Hadoop進(jìn)行編程

    利用Java連接Hadoop進(jìn)行編程

    這篇文章主要介紹了利用Java連接Hadoop進(jìn)行編程,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-06-06
  • Java中的static關(guān)鍵字修飾屬性和方法(推薦)

    Java中的static關(guān)鍵字修飾屬性和方法(推薦)

    這篇文章主要介紹了Java中的static關(guān)鍵字修飾屬性和方法,包括哪些成員屬性可以被static修飾,靜態(tài)屬性的訪問方法示例詳解,需要的朋友可以參考下
    2022-04-04
  • Java中RabbitMQ的幾種消息確認(rèn)機(jī)制

    Java中RabbitMQ的幾種消息確認(rèn)機(jī)制

    RabbitMQ消息確認(rèn)機(jī)制指的是在消息傳遞過程中,發(fā)送方發(fā)送消息后,接收方需要對消息進(jìn)行確認(rèn),以確保消息被正確地接收和處理,本文主要介紹了Java中RabbitMQ的幾種消息確認(rèn)機(jī)制,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • Java 基礎(chǔ)語法中的邏輯控制

    Java 基礎(chǔ)語法中的邏輯控制

    這篇文章主要介紹了Java 基礎(chǔ)語法中的邏輯控制的相關(guān)資料,需要的朋友可以參考下面文章內(nèi)容
    2021-09-09
  • 挑戰(zhàn)4道Java試題

    挑戰(zhàn)4道Java試題

    這篇文章主要為大家分享了4道Java基礎(chǔ)題,幫助大家鞏固基礎(chǔ)知識,夯實(shí)java基礎(chǔ)技能,感興趣的朋友快點(diǎn)挑戰(zhàn)
    2015-12-12

最新評論

九台市| 象州县| 琼结县| 那坡县| 南平市| 咸丰县| 马尔康县| 怀宁县| 鹰潭市| 鹰潭市| 佛学| 梧州市| 仁寿县| 定安县| 绥滨县| 金堂县| 冀州市| 遵义县| 迁西县| 若尔盖县| 密山市| 建湖县| 肥乡县| 松溪县| 灵川县| 陵川县| 洪湖市| 潮安县| 安福县| 循化| 盐津县| 海城市| 滦南县| 大厂| 堆龙德庆县| 江山市| 简阳市| 贵定县| 大方县| 宝清县| 漾濞|