Bean的基本定义

    <beans>标签的属性

<beans>元素是Spring配置文件的根元素,该元素下能够指定以下属性:java

   1)default-lazy-init:指定该<beans>元素下全部的Bean默认的延迟初始化行为;spring

   2)default-merge:指定该<beans>下配置的全部Bean默认的merget行为;session

   3)default-autowire:指定该<beans>元素下配置的全部Bean默认的自动装配行为;app

   4)default-autowire-candidates:指定该<beans>元素下配置的全部Bean默认是否做为自动装配的候选Bean。测试

    5)default-init-method:指定该<beans>元素下配置的全部Bean默认的回收方法。spa

    <beans>元素上面所能指定的属性均可以在每一个<bean> 子元素中指定--将属性名default去掉便可。prototype

当咱们在配置文件中经过<bean id="xx" class=""/>方法配置一个Bean时,这样要求该Bean实现类必须有一个无参数的构造器。而且calss必须为具体的实现类,不能为接口。code

    在默认状况下,当Spring建立ApplicationContext容器时,Spring会自动预初始化容器中全部的singleton实列,若是不想让Spring容器预初始化某个singleton Bean,则能够为该<bean>元素增长lazy-init属性,指定该属性为true,则Spring不会预初始化该Bean实列。xml

       容器中Bean的做用域 

    当经过Spring容器建立一个Bean实列时,不只能够完成Bean实列的实列化,还能够为其指定做用域;对象

    1)singleton:单列模式,在整个Spring IOC容器中,使用singleton定义的Bean将只有一个实列。这也是Spring的默认做用域。

    2)prototype:原型模式,每次经过getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实列。

    3)request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实列,即每次HTTP请求将会产生不一样的Bean实列。只有在Web应用中使用Spring时,该做用域才真正有效。

    4)session:对于每次HTTP Session,使用session定义的Bean都将产生一个新实列,即每次HTTP Session都将产生不一样的Bean实列。只有在Web应用中使用Spring时,该做用域才真正有效。

    5)global session:每一个全局的HTTP Session对应一个Bean实列。典型状况下,仅在使用protlet context的时候有效。只有在Web应用中使用Spring时,该做用域才真正有效。

<!-- 单列 -->
   <bean id="stoneAxe1" scope="singleton" class="com.custle.spring.StoneAxe"/>
 	 <!-- 原型 -->
   <bean id="stoneAxe2" scope="prototype" class="com.custle.spring.StoneAxe"/>

测试程序:

package com.custle.spring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class BeanTest {

	public static void main(String[] args) {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext-spring.xml");
		// 判断stoneAxe1--单列
		System.out.println("单列对象是否为同一对象:" + (applicationContext.getBean("stoneAxe1") == applicationContext
				.getBean("stoneAxe1")));
		// 判断stoneAxe2--单列
		System.out.println("原型对象是否为同一对象:" + (applicationContext.getBean("stoneAxe2") == applicationContext
				.getBean("stoneAxe2")));
	}

}

控制台输出:

单列对象是否为同一对象:true
原型对象是否为同一对象:false

从这能够看出:对于singleton做用域的Bean,每次请求该ID的Bean,都将返回同一个共享实列,于是两次获取的Bean实列彻底相同;但对于prototype做用域的Bean,每次请求都将产生新的实列。

若是将该Bean的做用域范围该为reauest,针对每次HTTP请求,Spring容器会根据该Bean定义一个全新的Bean实列,而且该Bean实列仅在当前HTTP Request内有效。

相关文章
相关标签/搜索