Spring-IOC XML 配置多个相同 ID 的 bean 加载分析
我们现在仍以 xml 中配置 bean 的方式来 使用 Spring ,不考虑注解和扫包
配置相同id 的bean
定义一个 bean 类 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 有一个静态变量 counter 可以判断该类被实例化了几次
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 会直接报错,在同一个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 都会进行提示

然而,我们有其他办法让Spring 能够去接纳 在 xml 中 配置 多个相同 的 bean 。
使用 import 的 方式 配置相同 id 的 bean
我们可以在 service.xml 中 配置 一个 bean ,并使用 import 的形式 导入另一个 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>
通过这样的配置后,Spring不会报错,启动主程序。
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);
}
}
控制台打印如下:
===========> ===========> TransactionManager counter :1
===========> ===========> hello world, counter is 1, name is slave
分析控制台日志发现,TransactionManager 类 只被加载了一次,而且加载的是从 service2.xml 里面定义的bean。
我们调换顺序,把 import 放在 bean 定义之上,再进行测试。
<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
总结
spring不支持 直接在一个xml文件中定义两个相同id的bean,但是可以通过 import 的形式 在另外一个xml文件中定义相同 id 的bean。
如果多个xml中定义相同 的 bean id ,Spring 默认会以最后加载到的bean为准,进行加载。
.note .post .book-menu {
margin: 40px 0 20px;
height: 50px;
font-size: 0;
border: 1px solid #e0e0e0;
border-radius: 5px;
background-color: hsla(0,0%,71%,.1);
overflow: hidden;
}
*, :after, :before {
box-sizing: border-box;
}
.note .post .book-menu .menu-item a {
display: inline-block;
width: 100%;
color: #333;
}
Spring-IOC XML 配置多个相同 ID 的 bean 加载分析的更多相关文章
- spring ioc xml配置
一个完整的spring xml配置:是把action,service,dao以及其它的资源性配置(如basedao)和公共性配置(如连接数据库)配置在resource.xml中,这样就有四个xml配置 ...
- Spring IOC的配置使用(转)
转:http://www.cnblogs.com/linjiqin/p/3408306.html Spring IOC的配置使用 1.1.1 XML配置的结构一般配置文件结构如下: <beans ...
- spring+mybaits xml配置解析----转
一.项目中spring+mybaits xml配置解析 一般我们会在datasource.xml中进行如下配置,但是其中每个配置项原理和用途是什么,并不是那么清楚,如果不清楚的话,在使用时候就很有可能 ...
- Spring 中 Xml配置文件属性的说明
Xml配置文件属性的说明: <bean id="TheAction" ⑴ class="net.xiaxin.spring.qs.UpperAction" ...
- spring的xml配置声明以及相应的问题处理
spring的xml配置声明: xml配置声明 Code 问题处理 问题1 xml报错: cvc-elt.1: Cannot find the declaration of element 'bea ...
- spring中用xml配置构造注入的心得
spring中用xml配置构造注入时,如果 <constructor-arg> 属性都是 ref ,则不用理会参数顺序 <constructor-arg ref="kill ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(6):Spring IOC容器学习(概念、作用、Bean生命周期)
一.IOC控制反转概念 控制反转(IOC)是一种通过描述(在Java中可以是XML或者是注解)并通过第三方去生产或获取特定对象的方式. 主动创建模式,责任在于开发者,而在被动模式下,责任归于Ioc容器 ...
- xml配置和基于java类的bean配置搭配使用
如果同时使用了xml配置,和java类的bean配置(当然估计项目中一般不会这样), 在初始化容器指定资源文件的时候可能会比较麻烦 此时我们可以把基于java类的bean配置整合到xml中,或xml的 ...
- SSH 之 Spring的源码(一)——Bean加载过程
看看Spring的源码,看看巨人的底层实现,拓展思路,为了更好的理解原理,看看源码,深入浅出吧.本文基于Spring 4.0.8版本. 首先Web项目使用Spring是通过在web.xml里面配置 o ...
随机推荐
- Ubuntu 18.04 安装 Docker-ce(就是Docker社区版本)
一步都不用改,跟着走就行 1.更换国内软件源,推荐中国科技大学的源,稳定速度快(可选) sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak ...
- Django-url反向解析和命名空间
一.urls硬编码 在反向解析和命名空间之前我们先来说说URLS硬编码,用django 开发应用的时候,可以完全是在urls.py 中硬编码配置地址,在views.py中HttpResponseRed ...
- JS 获取css transform中的值
可以参考这位博主的文章https://www.cnblogs.com/zhenwoo/p/4993780.html 不想看直接想看怎么解决的看这: var translates= document.d ...
- CentOS7查看开放端口命令及开放端口号
CentOS 7查看以开放端口命令:firewall-cmd —list-ports 查看端口是否开放命令:第一个方法就是使用lsof -i:端口号命令行,例如lsof -i:80.如果没有任何信息输 ...
- The D Programming Language 书评
此书的作者 Andrei Alexandrescu 作为前 C++ 社区的一朵奇葩,因为实在是不满 C++ 标准委员会的官僚作风,跳槽到了 D 社区,成为了 D 发明人 Walt Brightman ...
- 特来电CMDB应用实践
配置管理数据库(Configuration Management Database,以下简称CMDB)是一个老生常谈的话题,不同的人有不同的见解,实际应用时,因为企业成熟度以及软硬件规模不同,别人的成 ...
- 开源免费的文档协作系统 onlyoffice平台轻松部署
请移步至此,更详细:http://blog.csdn.net/hotqin888/article/details/79337881 ONLYOFFICE是一个免费的.开源的企业办公套件,用于在线组织团 ...
- Nodejs 使用特定版本的SSL/TLS协议版本
var options = { key: fs.readFileSync('./bin/privatekey.pem'), cert: fs.readFileSync('./bin/certifica ...
- as 打包报错
错误:Android Error:Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease' ...
- react native中如何往服务器上传网络图片
let common_url = 'http://192.168.1.1:8080/'; //服务器地址 let token = ''; //用户登陆后返回的token /** * 使用fetch实现 ...