Spring学习回顾(四)bean的元数据配置及获取

一、bean的配置

类创建完成之后,使用对象之前要将它在bean配置文件中进行配置,元数据配置指的是bean具有的基本信息,如之前的id和class等,下面我们对bean的元数据信息一一解释;

1.bean的元数据之id

指定bean的唯一标识符,通id可获取对应的bean;

<bean id="person" class="com.me.spring.Person"></bean>

2.bean的元数据之name

bean的唯一标识符,通过name获取对应的bean,作用与id相同;id和name是唯一性的标识符,二者必有其一且不能重复,否则配置文件会提示错误;

<bean name="person" class="com.me.spring.Person"></bean>

3.bean的元数据之class

指定创建bean的类,必须属性;

4.bean的元数据之scope

指定bean创建对象的作用域,有五种可选值,分别为:singleton、prototype、request、session、global-session

  • singleton:规定Spring容器中只存在一个实例化对象,即单例模式,若bean不指定scope,则默认为singleton;
    如下配置bean,scope默认或显式的规定为singleton
<bean id="person" class="com.me.spring.Person"></bean><bean id="person" class="com.me.spring.Person" scope="singleton"></bean>

测试运行:

ApplicationContext context = new FileSystemXmlApplicationContext("D:/svnProject/Spring/src/applicationContext.xml");
Person person1 = (Person) context.getBean("person");
person1.setName("Tom1");
System.out.println("person1姓名:"+person1.getName());
Person person2 = (Person) context.getBean("person");
System.out.println("person2姓名:"+person2.getName());

运行结果:很显然,再次调用容器中的Person实例对象是还是同一个,名字相同

person1姓名:Tom1
person2姓名:Tom1
  • prototype:规定Spring中的bean配置为多例模式,即每次从容器中取对象的时都产生一个新的对象;
    将singleton中的bean配置为多例模式,如下:
<bean id="person" class="com.me.spring.Person" scope="prototype"></bean>

此时再运行singleton的测试,运行结果:

person1姓名:Tom1
person2姓名:null

person2实例的姓名为null,原因就是bean配置的为多例模式,获取person1设值姓名为Tom1后,第二次再获取实例对象是是一个全新的对象,所以并没有姓名属性,即为null。

  • request:指定每次http请求时,创建新的对象实例;如果是在同一次请求当中,实例对象是共享的;
  • session:指定同一个session共享一个实例化对象;
  • global-session:指定全局session共享一个实例化对象;

5.bean的元数据之constructor-arg

指定bean的依赖注入关系,比如Person类除了姓名和年龄,还拥有一台联想笔记本,需要lenovo的bean注入person的bean,如下:

<bean id="person" class="com.me.spring.Person" scope="prototype">
  <constructor-arg name="lenovo" ref="lenovo"></constructor-arg>
</bean>
<bean name="lenovo" class="com.me.spring.Lenovo"></bean>

6.bean的元数据之parent

指定bean的继承关系bean,即父bean,如下,创建两个类:
Computer类

package com.me.spring;
public class Computer {
    private String type;
    private String color;
    // getter and setter......
}

Lenovo类

package com.me.spring;
public class Lenovo {
    private String type;
    private String color;
    private String vendor;
    private int size;
}

bean配置:

<bean id="computer" class="com.me.spring.Computer">
    <property name="type" value="电脑"></property>
    <property name="color" value="黑色"></property>
</bean>
<!-- lenovo继承computer -->
<bean id="lenovo" class="com.me.spring.Lenovo" parent="computer">
    <property name="type" value="笔记本电脑"></property>
    <property name="vendor" value="Lenovo"></property>
    <property name="size" value="15"></property>
</bean>

测试结果:

类型[笔记本电脑],颜色[黑色],厂商[Lenovo],尺寸[15]

7.bean的元数据之depends-on

指定bean依赖关系bean,即在获取当前bean时,依赖的bean将会首先被Spring容器实例化,如果依赖的bean未被定义,则会抛出BeanCreationException异常;依赖配置如下:

<bean id="person" class="com.me.spring.Person" scope="prototype">
    <property name="name" value="Tom"></property>
</bean>
<!--依赖person-->
<bean id="lenovo" class="com.me.spring.Lenovo" depends-on="person">
    <property name="type" value="笔记本电脑"></property>
    <property name="vendor" value="Lenovo"></property>
    <property name="size" value="15"></property>
</bean>

二、bean的获取

bean的配置完成后,就要获取使用。在Spring中Bean使用简单实践中已经见到获取bean的例子。在Spring中IOC有两种实现的类型:1.BeanFactory是基础的实现,更加底层;2.ApplicationContext这个是BeanFactory的子接口,功能更高级,以后更多的将使用它作为获取bean的方式。其中,ApplicationContext有两个重要的且很常用的实现类:

1.FileSystemXmlApplicationContext

使用这个实现类时,bean的配置文件是从文件系统加载进去的,所以使用这个实现类时,要提供bean配置文件的完整绝对路径;

ApplicationContext context = new FileSystemXmlApplicationContext("D:/svnProject/Spring/src/applicationContext.xml");
Person person = (Person) context.getBean("person");

2.ClassPathXmlApplicationContext

使用此实现类时,就像名字一般,bean的配置文件是从classpath路径下获取的,也是默认获取路径;

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = (Person)context.getBean("person");

注:以上连个实现类获取bean,除了可通过配置bean的id或name获取到实例对象外,还可以通过类型获取到(通过类型获取前提是配置中没有同类型的bean,否则会有异常),如下:

Person person = (Person) context.getBean(Person.class);
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值