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 ...
随机推荐
- Java ArrayList 数组之间相互转换
做研发的朋友都知道,在项目开发中经常会碰到list与数组类型之间的相互转换,本文通过一个简单的例子给大家讲解具有转换过程. package test.test1; import java.util.A ...
- OpenStack的架构详解[精51cto]
OpenStack既是一个社区,也是一个项目和一个开源软件,它提供了一个部署云的操作平台或工具集.其宗旨在于,帮助组织运行为虚拟计算或存储服务的云,为公有云.私有云,也为大云.小云提供可扩展的.灵活的 ...
- cakephp怎么默认显示index/index文件
在配置好cakephp之后,我们输入网址后都一般默认显示index/index 文件,那么怎么设置呢? 1.D:\www\cakephp\app\Config\routes.php
- JS之ClassName属性使用
一.style与className属性的对比 在前面的style属性学习中,知道了通过style属性可以控制元素的样式,从而实现了行为层通过DOM的style属性去干预变现层显示的目地,但是这种就是不 ...
- ThinkPHP5+Layui实现图片上传加预览
html代码 <div class="layui-upload"> <button type="button" class="lay ...
- 解决myeclipse2017安装后闪退问题
修改myeclipse的配置文件myeclipse.ini: 1.将-vm下面的路径改成自己的jdk的javaw.exe的路径 2.在文档最后加上两条语句: -Dgenuitec.honorDevMo ...
- canvas绘画交叉波浪
做个记录,自己写的动态效果,可能以后用的着呢: <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...
- 001Git & GitHub
01.创建GitHub账号 请点击标题链接,阅读官网帮助 02.创建代码仓库 请点击标题链接,阅读官网帮助 03.安装Git 注:Git官网下载太慢,可在[360卫士]-->[软件管家]中搜索下 ...
- OSGI企业应用开发(八)整合Spring和Mybatis框架(一)
到目前为止,我们已经学习了如何使用Blueprint將Spring框架整合到OSGI应用中,并学习了Blueprint&Gemini Blueprint的一些使用细节.本篇文章开始,我们將My ...
- ActiveReports 报表控件V12新特性 -- RPX报表转换为RDL报表
ActiveReports是一款专注于 .NET 平台的报表控件,全面满足 HTML5 / WinForms / ASP.NET / ASP.NET MVC / WPF 等平台下报表设计和开发工作需求 ...