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 ...
随机推荐
- MyCAT入门实践
1.MyCAT简单介绍 MyCAT是一个彻底开源的,面向企业应用开发的大数据库集群,支持事务.ACID.可以替代MySQL的加强版数据库,是一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Or ...
- 链接正常但IE浏览器无法显示网页的几种情况
一.感染病毒木马所致 这种情况往往表现在打开IE时,在IE界面的左下框里提示:正在打开网页,但一直无响应. 右击任务栏/任务管理器/进程,查看.如果CPU占用率100%,可以断定是感染了病毒,这时要查 ...
- order by与索引(转载)
order by与索引 ORDER BY 通常会有两种实现方法,一个是利用有序索引自动实现,也就是说利用有序索引的有序性就不再另做排序操作了.另一个是把结果选好之后再排序. 用有序索引这种,当然是 ...
- c# XML 有多个重复子节点操作
1,继续添加ebm子节点 public static void CreateXml() { //创XML建对象 XmlDocument doc = new XmlDocument(); //声明根节点 ...
- 最小公倍数(BNUOJ30195)
最小公倍数 Time Limit: 0 ms Case Time Limit: 0 ms Memory Limit: 0 KBSubmit: 17 Accepted: 1 This problem w ...
- JAVA设计模式详解(三)----------装饰者模式
今天LZ带给大家的是装饰者模式,提起这个设计模式,LZ心里一阵激动,这是LZ学习JAVA以来接触的第一个设计模式,也许也是各位接触的第一个设计模式.记得当初老师在讲IO的时候就提到过它:“是你还有你, ...
- [转载] MySQL的四种事务隔离级别
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...
- 数据库概念:码 键 Key & 范式 Normal Form
参考资料 数据库管理系统原理与设计(Database Mangement System 3rd) 百度 wiki 术语对照 码 = 键 = Key 码约束 = Key Constraints 码约束 ...
- lamp配置多个虚拟站点
在同一ip下添加多个域名站点! 1.查看ip 命令:ifconfig 2.添加域名 命令:vi /etc/hosts 输入域名:如 192.168.160.127 www.test.com 192 ...
- 百度自动推送js
<!DOCTYPE html> <!-- saved from url=(0014)about:internet --> <html> <head> & ...