我们现在仍以 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. MyCAT入门实践

    1.MyCAT简单介绍 MyCAT是一个彻底开源的,面向企业应用开发的大数据库集群,支持事务.ACID.可以替代MySQL的加强版数据库,是一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Or ...

  2. 链接正常但IE浏览器无法显示网页的几种情况

    一.感染病毒木马所致 这种情况往往表现在打开IE时,在IE界面的左下框里提示:正在打开网页,但一直无响应. 右击任务栏/任务管理器/进程,查看.如果CPU占用率100%,可以断定是感染了病毒,这时要查 ...

  3. order by与索引(转载)

    order by与索引   ORDER BY 通常会有两种实现方法,一个是利用有序索引自动实现,也就是说利用有序索引的有序性就不再另做排序操作了.另一个是把结果选好之后再排序. 用有序索引这种,当然是 ...

  4. c# XML 有多个重复子节点操作

    1,继续添加ebm子节点 public static void CreateXml() { //创XML建对象 XmlDocument doc = new XmlDocument(); //声明根节点 ...

  5. 最小公倍数(BNUOJ30195)

    最小公倍数 Time Limit: 0 ms Case Time Limit: 0 ms Memory Limit: 0 KBSubmit: 17 Accepted: 1 This problem w ...

  6. JAVA设计模式详解(三)----------装饰者模式

    今天LZ带给大家的是装饰者模式,提起这个设计模式,LZ心里一阵激动,这是LZ学习JAVA以来接触的第一个设计模式,也许也是各位接触的第一个设计模式.记得当初老师在讲IO的时候就提到过它:“是你还有你, ...

  7. [转载] MySQL的四种事务隔离级别

    本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...

  8. 数据库概念:码 键 Key & 范式 Normal Form

    参考资料 数据库管理系统原理与设计(Database Mangement System 3rd) 百度 wiki 术语对照 码 = 键 = Key 码约束 = Key Constraints 码约束 ...

  9. lamp配置多个虚拟站点

    在同一ip下添加多个域名站点! 1.查看ip 命令:ifconfig 2.添加域名 命令:vi /etc/hosts 输入域名:如 192.168.160.127   www.test.com 192 ...

  10. 百度自动推送js

    <!DOCTYPE html> <!-- saved from url=(0014)about:internet --> <html> <head> & ...