热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Spring如何在xml文件中配置Bean

这篇文章主要介绍了Spring如何在xml文件中配置Bean的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

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

Bean在xml文件中的配置


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


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

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作用域


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作用域

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,配置的是一个类,不是该类的一个实例(对象)。

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

的子元素——


    
    

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

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

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

可以写成这种形式:


  
    
  
  
    
  

依然是一个传递一个实参,index/name可缺省。

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

只能是单标签形式。

参数可以是数组类型

   
      
        
        
      
   

根据情况选用。

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

  private List list;
  public Student(List list){
    this.list=list;
  }

    
      
        
        
      
    
  

一个传递一个List,一个表示一个列表项,只能传递Java基础类型。如果是其它的Bean,要用


   
      
      
   

的效果一样,使用哪个都行。

Set:用法和List一样。

Map:


    
      
        
        
      
    
  

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

说明:

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

效果一样,效果一样,效果一样。

如果参数是基础数据类型或是其它的Bean,可以写成单标签的形式,如果参数是数组、集合这种有多项的数据类型,就需要写成双标签的形式。

的子元素——

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

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

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

一样,可以使用数组、集合,用法相同。

注意:

不同,只能用name,不能用index。

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

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


推荐阅读
author-avatar
Kris-Guo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有