日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

Spring-IOC XML 配置多个相同 ID 的 bean 加载分析

發(fā)布時(shí)間:2023/12/9 asp.net 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring-IOC XML 配置多个相同 ID 的 bean 加载分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我們現(xiàn)在仍以 xml 中配置 bean 的方式來(lái) 使用 Spring ,不考慮注解和掃包

配置相同id 的bean

定義一個(gè) bean 類(lèi) TransactionManager

/*** @author maple 2018.09.10 下午10:27*/ public class TransactionManager {private static int counter = 0;private String beanName;public void setBeanName(String beanName) {this.beanName = beanName;}public TransactionManager() {System.out.println("===========> ===========> TransactionManager counter :" + (++counter));}public void hello() {System.out.println("===========> ===========> hello world, counter is " + counter + ", name is " + beanName);} }

TransactionManager 有一個(gè)靜態(tài)變量 counter 可以判斷該類(lèi)被實(shí)例化了幾次

Spring 管理 bean

<bean id="manager" class="com.hzways.multiply.TransactionManager"><property name="beanName" value="master"/> </bean><bean id="manager" class="com.hzways.multiply.TransactionManager"><property name="beanName" value="master"/></bean>

照這種方式配置,spring 會(huì)直接報(bào)錯(cuò),在同一個(gè)xml文件下,這樣的配置是不允許的。

Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Bean name 'manager' is already used in this <beans> element Offending resource: URL [file:/Users/maple/developer/spring-learning/maple-spring/maple-ioc/target/classes/services3.xml]

甚至 idea 都會(huì)進(jìn)行提示

然而,我們有其他辦法讓Spring 能夠去接納 在 xml 中 配置 多個(gè)相同 的 bean 。

使用 import 的 方式 配置相同 id 的 bean

我們可以在 service.xml 中 配置 一個(gè) bean ,并使用 import 的形式 導(dǎo)入另一個(gè) spring 的xml 配置文件

service.xml

<bean id="manager" class="com.hzways.multiply.TransactionManager"><property name="beanName" value="master"/> </bean><import resource="classpath*:services2.xml"/>

services2.xml

<bean id="manager" class="com.hzways.multiply.TransactionManager"><property name="beanName" value="slave"/> </bean>

通過(guò)這樣的配置后,Spring不會(huì)報(bào)錯(cuò),啟動(dòng)主程序。

public class Main {public static void main(String[] args) throws InterruptedException {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath*:services3.xml");applicationContext.start();TransactionManager helloWorld = applicationContext.getBean(TransactionManager.class);helloWorld.hello();Thread.sleep(Long.MAX_VALUE);} }

控制臺(tái)打印如下:

===========> ===========> TransactionManager counter :1 ===========> ===========> hello world, counter is 1, name is slave

分析控制臺(tái)日志發(fā)現(xiàn),TransactionManager 類(lèi) 只被加載了一次,而且加載的是從 service2.xml 里面定義的bean。

我們調(diào)換順序,把 import 放在 bean 定義之上,再進(jìn)行測(cè)試。

<import resource="classpath*:services3-bean.xml"/><bean id="manager" class="com.hzways.multiply.TransactionManager"><property name="beanName" value="master"/></bean>

這次程序果然打的是 master

===========> ===========> TransactionManager counter :1 ===========> ===========> hello world, counter is 1, name is master

總結(jié)

spring不支持 直接在一個(gè)xml文件中定義兩個(gè)相同id的bean,但是可以通過(guò) import 的形式 在另外一個(gè)xml文件中定義相同 id 的bean。
如果多個(gè)xml中定義相同 的 bean id ,Spring 默認(rèn)會(huì)以最后加載到的bean為準(zhǔn),進(jìn)行加載。


上一篇 目錄 下一篇

轉(zhuǎn)載于:https://www.cnblogs.com/leihuazhe/p/9680664.html

總結(jié)

以上是生活随笔為你收集整理的Spring-IOC XML 配置多个相同 ID 的 bean 加载分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。