我们现在仍以 xml 中配置 bean 的方式来 使用 Spring ,不考虑注解和扫包

配置相同id 的bean

定义一个 beanTransactionManager

/**
* @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 加载分析的更多相关文章

  1. spring ioc xml配置

    一个完整的spring xml配置:是把action,service,dao以及其它的资源性配置(如basedao)和公共性配置(如连接数据库)配置在resource.xml中,这样就有四个xml配置 ...

  2. Spring IOC的配置使用(转)

    转:http://www.cnblogs.com/linjiqin/p/3408306.html Spring IOC的配置使用 1.1.1 XML配置的结构一般配置文件结构如下: <beans ...

  3. spring+mybaits xml配置解析----转

    一.项目中spring+mybaits xml配置解析 一般我们会在datasource.xml中进行如下配置,但是其中每个配置项原理和用途是什么,并不是那么清楚,如果不清楚的话,在使用时候就很有可能 ...

  4. Spring 中 Xml配置文件属性的说明

    Xml配置文件属性的说明: <bean id="TheAction" ⑴ class="net.xiaxin.spring.qs.UpperAction" ...

  5. spring的xml配置声明以及相应的问题处理

    spring的xml配置声明:  xml配置声明 Code 问题处理 问题1 xml报错: cvc-elt.1: Cannot find the declaration of element 'bea ...

  6. spring中用xml配置构造注入的心得

    spring中用xml配置构造注入时,如果 <constructor-arg> 属性都是 ref ,则不用理会参数顺序 <constructor-arg ref="kill ...

  7. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(6):Spring IOC容器学习(概念、作用、Bean生命周期)

    一.IOC控制反转概念 控制反转(IOC)是一种通过描述(在Java中可以是XML或者是注解)并通过第三方去生产或获取特定对象的方式. 主动创建模式,责任在于开发者,而在被动模式下,责任归于Ioc容器 ...

  8. xml配置和基于java类的bean配置搭配使用

    如果同时使用了xml配置,和java类的bean配置(当然估计项目中一般不会这样), 在初始化容器指定资源文件的时候可能会比较麻烦 此时我们可以把基于java类的bean配置整合到xml中,或xml的 ...

  9. SSH 之 Spring的源码(一)——Bean加载过程

    看看Spring的源码,看看巨人的底层实现,拓展思路,为了更好的理解原理,看看源码,深入浅出吧.本文基于Spring 4.0.8版本. 首先Web项目使用Spring是通过在web.xml里面配置 o ...

随机推荐

  1. 【转】Java工程师成神之路

    针对本文,博主最近在写<成神之路系列文章> ,分章分节介绍所有知识点.欢迎关注. 一.基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 h ...

  2. 自己写一个java的mvc框架吧(五)

    自己写一个mvc框架吧(五) 给框架添加注解的支持 一段废话 上一章本来是说这一章要写视图处理的部分,但是由于我在测试代码的时候需要频繁的修改配置文件,太麻烦了.所以这一章先把支持注解的功能加上,这样 ...

  3. leetcode字符串系列

    3. 无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...

  4. js中的json的小例子

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  5. C#将图片存放到SQL SERVER数据库中的方法

    本文实例讲述了C#将图片存放到SQL SERVER数据库中的方法.分享给大家供大家参考.具体如下: 第一步: ? 1 2 3 4 5 6 7 8 9 10 //获取当前选择的图片 this.pictu ...

  6. Linux 中 awk命令应用

    ls -la | awk '{printf ("%8s %8s %8s %8s %8s %8s %8s %8s %8s\n",$1,$2,$3,$4,$5,$6,$7,$8,sub ...

  7. PHPCMS V9开发文档

    内容模块 内容模块PC标签调用说明 模块名:content 模块提供的可用操作 操作名 说明 lists 内容数据列表 relation 内容相关文章 hits 内容数据点击排行榜 category ...

  8. SLAM产品化的一些思考

    这两年一直在做SLAM产品化的一些工作,有些感触,想和大家分享一下.很多想法只是个人浅见,不当之处还望大家指正. 我这两年分别做了AR眼镜和辅助驾驶方向的开发,说实话,挫折大于成果.SLAM产品化之难 ...

  9. 【Kibana】Kibana入门教程

    一.Kibana简介及下载安装 Kibana是专门用来为ElasticSearch设计开发的,可以提供数据查询,数据可视化等功能. 下载地址为:https://www.elastic.co/downl ...

  10. [iOS] Win8下在Vmware11中安装使用苹果系统OS X 10.10

      近来因为人事变动,领导打算安排我做 iOS 的项目,所以需要花一些时间提前准备一下iOS相关的东西.因为自己手头上并没有 Mac(过年为了闲的时候能玩玩游戏买了联想,唉),想想不能只靠每天在公司的 ...