您的位置:首页 > 编程语言 > Java开发

Bean的基本定义

2018-02-05 00:00 211 查看

<beans>标签的属性

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

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

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

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

4)default-autowire-candidates:指定该<beans>元素下配置的所有Bean默认是否作为自动装配的候选Bean。

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

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

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

在默认情况下,当Spring创建ApplicationContext容器时,Spring会自动预初始化容器中所有的singleton实列,如果不想让Spring容器预初始化某个singleton Bean,则可以为该<bean>元素增加lazy-init属性,指定该属性为true,则Spring不会预初始化该Bean实列。

容器中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内有效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息