Bean的基本属性
< beans…/>是Spring配置文件的根元素,可以指定如下属性:
- defalut-lazy-init
指定该< beans…/>元素下配置的所有Bean默认的延迟初始化行为。
ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实例化,这意味着ApplicationContext在初始化的过程中创建并配置所有的singleton bean。如果你不想让一个singleton bean在ApplicationContext实现在初始化时被提前实例化,那么可以将bean设置为延迟实例化。一个延迟初始化bean将告诉IoC 容器是在启动时还是在第一次被用到时实例化。
默认default-lazy-init为false,当属性default-lazy-init设置成true时,sping不会再去加载整个对象实例,减少初始化时间,减少spring启动速度。 - default-merge
指定该< beans…/>元素下配置的所有Bean默认的merge行为。 - default-autowire
指定该< beans…/>元素下配置的所有Bean默认的自动装配行为。
对于bean当中引用的其他bean,不需要我们自己去配置它该使用哪个类,Spring 的自动装配可以帮助我们完成这些工作。 - default-autowire-candidates
指定该< beans…/>元素下配置的所有Bean默认是否作为自动装配的候选Bean - default-init-method
指定该< beans…/>元素下配置的所有Bean默认的初始化方法 - default-destroy-method
指定该< beans…/>元素下配置的所有Bean默认的回收方法
< bean…/>元素是< beans…/>元素的子元素。< beans…/>元素下指定的属性都可以在每个< bean…/>元素中指定,只要将属性名中的default去掉即可。当二者所指定的属性不一致时,< bean…/>元素中的属性会覆盖< beans…/>中指定的属性。
定义Bean时通常需要指定两个属性:
- id
Bean的唯一标识。容器对Bean的管理、访问以及依赖关系都通过id属性完成。Bean的id属性在Spring中应该是唯一的。id属性需由字母和数字组成,且以字母开头。 - class
指定Bean的具体实现类。通常情况下,Spring会直接使用new关键字创建该Bean的实例。
除此之外,Bean还可以指定其它属性:
- name
用于为Bean实例指定别名。如果要为Bean实例指定多个别名,可以在name属性中用逗号、冒号或者空格来分割,后面通过任意别名即可访问该Bean实例。作为别名的字符可以随意。 - alias
为已有Bean指定别名。如程序无法再定义Bean时指定别名,可以在需要时为一个已经存在的Bean实例指定别名。
//为person实例指定三个别名#abc,@123,abc*
<bean id="person" class="..." name="#abc,@123,abc*" />
//为名为person的实例指定别名jack
<alias name="person" alias="jack" />
Bean的作用域
Spring支持如下五种作用域:
- singleton
在整个Spring IOC容器中,singleton作用域的Bean只生成一个实例。容器负责跟踪Bean实例的状态,维护Bean实例的生命周期行为。 - prototype
每次通过getBean()方法获取prototype作用域的Bean时,都将产生一个新的Bean实例。Spring容器仅创建Bean实例然后返回给程序,并不跟踪实例也不维护实例状态。 - request
对于一次http请求,request作用域的Bean只生成一个实例,在web的request范围内有效。应用于web应用中。 - session
对于一次http请求,request作用域的Bean只生成一个实例,在web的session范围内有效。应用于web应用中。 - global session
每个全局http session对应一个Bean实例,在使用portlet context时有效。应用于web应用中。
如果不指定作用域,Spring默认使用singleton作用域。在Spring配置文件中通过scope属性配置Bean实例的作用域。
一个例子
//配置一个singleton实例
<bean id="p1" class="..." />
//配置一个proptotype实例
<bean id="p2" class="..." scope="prototype" />
测试代码
public class BeanTest
{
public static void main(String[] args) throws Exception
{
ApplicationContext ctx = new ClassPathXMLApplicationContext("beans.xml");
System.out.println(ctx.getBean("p1") ==ctx.getBean("p1");
System.out.println(ctx.getBean("p2") ==ctx.getBean("p2");
}
}
运行结果如下
true
false