Spring如何在xml文件中配置Bean

Spring容器是一个大工厂,负责创建、管理所有的Bean。

Spring容器支持2种格式的配置文件:xml文件、properties文件,最常用的是xml文件。

Bean在xml文件中的配置

<beans>

根元素,可包含多个<bean>元素,一个<bean>即一个Bean的配置。

<bean>

一个<bean>即一个Bean对象。原来是new出来该类的一个对象,Spring中是一个<bean>创建一个对象。

<bean name="" class="" scope="" />

name指定对象的名称,class指定该Bean的类,scope指定该对象的作用域。class属性是必须的,其它可选。

对象的名称可通过name或id指定,id只能指定一个名称,name可指定一个或多个名称,用逗号或分号隔开即可。示例:name="grade,score"。未指定id或name时,默认取class属性的值。

Bean的作用域

作用域 说明
singleton(单例) 该Bean(类)在Spring容器中只有一个实例,无论引用/获取这个Bean多少次,都指向同一个对象。 singleton是Bean的默认作用域,适用于无会话状态的Bean(如Dao组建、Service组件)。
prototype(原型)   每次获取该Bean时,都会创建一个新的实例。
request 在一次HTTP请求中,获取的是该Bean的同一个实例,该实例只在此次HTTP请求中有效。 对于不同的HTTP请求,会创建不同的实例。
session 在一次HTTP session中获取的是该Bean的同一个实例,该实例只在本次HTTP session中有效。
globalSession 在一个全局的HTTP session中,获取到的是该Bean的同一个实例。 只在使用portlet上下文时有效。
application 为每个ServletContext对象创建一个实例。 只在web相关的ApplicationContext中有效。
websocket 为每个websocket对象创建一个实例。 只在web相关的ApplicationContext中有效。

示例:singleton作用域

<bean name="student" class="my_package.Student" scope="singleton" />
ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
    //获取到的这两个对象是同一个对象。
    Student student1=applicationContext.getBean("student",Student.class);
    Student student2=applicationContext.getBean("student",Student.class);
    //输出相同
    System.out.println(student1);
    System.out.println(student2);

缺省scope属性时,默认就是singleton作用域。

示例:prototype作用域

<bean name="student" class="my_package.Student" scope="prototype" />
ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
    //获取到的这两个对象是不同的。调用getBean()一次,就创建一个新的对象。
    Student student1=applicationContext.getBean("student",Student.class);
    Student student2=applicationContext.getBean("student",Student.class);
    //输出不同
    System.out.println(student1);
    System.out.println(student2);

说明:

在xml配置文件中,一个<bean>配置的是一个Bean,配置的是一个类,不是该类的一个实例(对象)。

在调用getBean()时获取/引用容器中Bean实例时,Spring容器根据id/name找到这个Bean对应的配置,查看作用域,该重新新建这个Bean的实例就重新新建,该返回已存在的实例就返回已存在的实例。

<bean>的子元素——<constructor-arg>

<bean name="" class="">
    <constructor-arg index/name="" value/ref="" />
    <constructor-arg index/name="" value/ref="" />
</bean>

<constructor-arg>用于向该bean的构造函数传递参数。一个<constructor-arg>传递一个参数,一个<bean>可带有多个<constructor-arg>子元素,根据<constructor-arg>的个数调用相应的构造函数。

name或index指定形参,name是用形参名指定,index是用形参列表的下标指定(从0开始)。缺省时,默认从第一个参数开始,依次传值。

value或ref指定实参值,value只能指定基础类型(Spring容器会自动转换为对应的数据类型),ref只能指定为其它的Bean(指定为其它Bean的name或id),根据需要选用。也可以用<constructor-arg>的子元素<ref>或<value>来指定。type属性可指定数据类型,这个属性很鸡肋,基本不用。

可以写成这种形式:

<bean name="" class="">
  <constructor-arg index/name="">
    <value></value>
  </constructor-arg>
  <constructor-arg index/name="">
    <ref bean="" />
  </constructor-arg>
</bean>

依然是一个<constructor-arg>传递一个实参,index/name可缺省。

<value>元素中,如果实参是String、char,不加引号。比如<value>张三</value>,会自动识别类型,2个字符的String。<value>"张三"</value>也是String,但实参是4个字符。

<ref />只能是单标签形式。

参数可以是数组类型

   <constructor-arg>
      <array>
        <value></value>
        <value></value>
      </array>
   </constructor-arg>

<value>、<ref />根据情况选用。

参数可以是List、Map、Set类型

  private List<String> list;
  public Student(List<String> list){
    this.list=list;
  }
<bean name="" class="">
    <constructor-arg>
      <util:list>
        <value></value>
        <value></value>
      </util:list>
    </constructor-arg>
  </bean>

一个<util:list>传递一个List,一个<value>表示一个列表项,<value>只能传递Java基础类型。如果是其它的Bean,要用<ref />:

<constructor-arg>
   <util:list>
      <ref bean="" />
      <ref bean="" />
   </util:list>
</constructor-arg>

<util:list>和<list>的效果一样,使用哪个都行。

Set:用法和List一样。

Map:

<bean name="zhangsan" class="my_package.Student">
    <constructor-arg>
      <util:map>
        <entry key="name" value="张三" />
        <entry key="age" value="20" />
      </util:map>
    </constructor-arg>
  </bean>

一个<entry>表示一个键值对,key、value表示的是基础类型,如果是其它的Bean,用key-ref、value-ref。

说明:

因为<list>元素对应得数据类型是List,<set>对应Set,<map>对应Map,所以形参只能是List/Set/Map类型,不能是ArrayList/HashSet/HashMap等子类的类型,但可以使用泛型。

<list>和<util:list>效果一样,<set>和<util:set>效果一样,<map>、<util:map>效果一样。

如果参数是基础数据类型或是其它的Bean,可以写成<constructor-arg index/name="" value="" />单标签的形式,如果参数是数组、集合这种有多项的数据类型,就需要写成<constructor-arg></constructor-arg>双标签的形式。

<bean>的子元素——<property>

<property name="" value="" />

给setter方法传递参数,一个setter方法设置一个属性,一个<property>给一个setter方法传递参数(传递一个参数)。

如果Bean有多个setter方法,可使用多个<property>传递参数。

name指定形参名。value指定值(只能为Java基础类型),或者用ref指定其它Bean。当然也可以用对应的子元素。

同<constructor-arg>一样,<property>可以使用数组、集合,用法相同。

注意:

和<constructor-arg>不同,<property>只能用name,不能用index。

因为<constructor-arg>是向构造函数传递一个参数,构造函数的形参表是有序的,可用index指定,也可用name指定。而Bean的多个setter方法是无序的,只能通过name指定。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Spring boot将配置属性注入到bean类中

    一.@ConfigurationProperties注解的使用 看配置文件,我的是yaml格式的配置: // file application.yml my: servers: - dev.bar.com - foo.bar.com - jiaobuchong.com 下面我要将上面的配置属性注入到一个Java Bean类中,看码: import org.springframework.boot.context.properties.ConfigurationProperties; import

  • Spring解密之XML解析与Bean注册示例详解

    为什么开始看spring的源码 半路转行写代码快一年半了,从开始工作就在使用spring框架,虽然会用,会搭框架,但是很多时候不懂背后的原理,比如:spring是怎样控制事务的,springmvc是怎样处理请求的,aop是如何实现的...这让人感觉非常不踏实,那就开始慢慢边看书边研究spring的源码吧!!! 怎样高效的看源码 我的答案是带着具体的问题去看源码,不然非常容易陷入源码细节中不能自拔,然后就晕了,最后你发现这看了半天看的是啥玩意啊. 引言 Spring是一个开源的设计层面框架,解决了

  • 详解Spring中使用xml配置bean的细节

    整理总结刚学的关于spring的xml配置bean的知识. 在ApplicationContext.xml文件中使用bean节点配置bean,bean的属性id在IOC容器中必须是唯一的. <bean id="helloWorld" class="com.test.spring.beans.HelloWorld"> <property name="name" value="Spring"></pr

  • Spring装配Bean教程之XML安装配置bean详解

    前言 众所周知在Spring刚出现的时候,XML是描述配置的主要方式,在Spring的名义下,我们创建了无数行XML代码.在一定程度上,Spring成为了XML的同义词. 现在随着强大的自动化配置和Java代码的配置出现,XML不再是唯一选择,也不应该是首选,学习XML配置,更多用于维护已有的XML的配置.下面话不多说了,来一起看看详细的介绍吧. 创建XML配置规范 在使用XML配置前,需要创建一个新的配置规范,就像JavaConfig需要我们创建带有 @Configuration注解的类,而在

  • Spring中多配置文件及引用其他bean的方式

    Spring多配置文件有什么好处? 按照目的.功能去拆分配置文件,可以提高配置文件的可读性与维护性,如将配置事务管理.数据源等少改动的配置与配置bean单独分开. Spring读取配置文件的几种方式: 1.使用Spring自身提供的ApplicationContext方式读取 在Java程序中可以使用ApplicationContext两个实现类ClassPathXmlApplicationContext以及FileSystemXmlApplicationContext来读取多个配置文件,他们的

  • Spring如何在xml文件中配置Bean

    Spring容器是一个大工厂,负责创建.管理所有的Bean. Spring容器支持2种格式的配置文件:xml文件.properties文件,最常用的是xml文件. Bean在xml文件中的配置 <beans> 根元素,可包含多个<bean>元素,一个<bean>即一个Bean的配置. <bean> 一个<bean>即一个Bean对象.原来是new出来该类的一个对象,Spring中是一个<bean>创建一个对象. <bean na

  • spring mvc 读取xml文件数据库配置参数的方法

    本文主要介绍怎么通过属性注入与构造器注入实现把我们项目中要用到的数据库参数放到xml文件里面去,方便部署. spring mvc 4.2.6项目 SQL Server 2008数据库 本文介绍的主要使用ApplicationContext以及其实现类实现.主要用到的是ClassPathXmlApplicationContext. ClassPathXmlApplicationContext:从类路径ClassPath中寻找指定的XML配置文件,找到并装载 完成ApplicationContext

  • 读取xml文件中的配置参数实例

    paras.xml文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework

  • Maven之pom.xml文件中的Build配置解析

    目录 前言 正文 mave的相关插件 pom.xml中的build标签 1. pom.xml中的两种build 2. Profile Build和Project Build的共有元素 3. Project Build特有的<-Directory> 4. Project Build特有的 Maven常用配置 pom.xml基础配置 插件配置 编译插件 测试插件 测试报告插件 eclipse插件 war包插件 tomcat插件 插件命令 总结 前言 在日常的开发中,我们经常使用maven来管理和构

  • 详解ASP.NET Core 在 JSON 文件中配置依赖注入

    前言 在上一篇文章中写了如何在MVC中配置全局路由前缀,今天给大家介绍一下如何在在 json 文件中配置依赖注入. 在以前的 ASP.NET 4+ (MVC,Web Api,Owin,SingalR等)时候,都是提供了专有的接口以供使用第三方的依赖注入组件,比如我们常用的会使用 Autofac.Untiy.String.Net 等,这些第三放依赖注入组件基本上都提供了一套配置注入或者配置生命周期的方式,除了直接配置到类里面之外,还提供了要么使用 xml 文件,要么使用 json 等,那么在新的

  • Spring Boot2.X国际化文件编写配置

    这篇文章主要介绍了Spring Boot2.X国际化文件编写配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 国际化文件的编写 messages.properties init project messages_en_US.properties init project messages_zh_CN.properties 页面非连接配置国际化只需要: spring.messages.basename=i18n.login 1: 1.5X版本配

  • mybatis Mapper的xml文件中resultType值的使用说明

    目录 Mapper的xml文件中resultType值 ①返回一般数据类型的值 ②当返回类型是javaBean ③当返回是List类型 ④返回类型数Map结构 ⑤说一下关于mybatis里面mapper层中传入多个参数的方法 mybatis学习之resultType解析 总结 1.对象类型 2.List类型 3.Map类型 Mapper的xml文件中resultType值 ①返回一般数据类型的值 比如根据id或者字段条件查询获取表中的某一个字段值 User Sel(int id); //根据id

  • 如何在conda虚拟环境中配置cuda+cudnn+pytorch深度学习环境

    首先,我们要明确,我们是要在虚拟环境中安装cuda和cuDNN!!!只需要在虚拟环境中安装就可以了. 下面的操作默认你安装好了python 一.conda创建并激活虚拟环境 前提:确定你安装好了anaconda并配置好了环境变量,如果没有,网上有很多详细的配置教程,请自行学习 在cmd命令提示符中输入conda命令查看anaconda 如果显示和上图相同,那么可以继续向下看 1.进入anaconda的base环境 方法1 在cmd命令提示符中输入如下命令 activate 方法2 直接在搜索栏里

  • 怎样快速从一个XML文件中查找信息

    在网络时代,XML文件起到了一个保存和传输数据的作用.Soap协议通过Xml交流信息,数据库通过Xml文件存取等等.那么怎样快速的从一个XML文件中取得所需的信息呢? 我们知道,JAVA的JAXP中和Microsoft.Net都有Xml分析器,Microsoft.Net是边读边分析,而JAXP是读到内存中然后才进行分析(还有一种是事件机制去读),总而言之,是不利于快速读取.基于此,Microsoft.Net 和JAXP都提供了XPATH机制,来快速定位到XML文件中所需的节点. 例如有一个XML

  • js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码

    复制代码 代码如下: <?php /* <?xml version="1.0" encoding="utf-8"?> <article> <item> <title name="t1"></title> <content>content1</content> <pubdate>2009-10-11</pubdate> </ite

随机推荐