<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
当经过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内有效。