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);