<bean>的作用域、生命周期、延迟加载

生命周期的管理

初始化方法 :
(用于获取资源,只执行一次)。
销毁方法: 
(用于释放资源,只执行一次)。 
注意,销毁方法只有在作用域为singleton才起作用。 

作用域

默认情况下,对于一个bean元素,容器只会创建一个对应的实例。
可以设置作用域为prototype(原型,多个实例)。

延迟加载 (了解)

默认情况下,当容器启动之后,会将所有作用域为单例的bean创建好。

lazy-init属性:如果值为true,表示延迟加载,即容器启动之后,不会立即创建该实例。

==========================================================================================

代码如下:

scope.MessageScope

package scope;

public class MessageBean {

	public MessageBean() {
		System.out.println("MessageBean()");
	}

	public void init(){
		System.out.println("init()");
	}
	
	public void sendMessage(){
		System.out.println("sendMessage()");
	}
	
	public void destroy(){
		System.out.println("destroy()");
	}
}
scope.ScopeBean

package scope;

public class ScopeBean {
	//跟踪无参数构造器,检查对象是否生成多次
	public ScopeBean() {
		System.out.println("ScopeBean()");
	}

}
配置文件:

<!-- 配置作用域  利用scope属性,默认缺省值为singleton(单例,只创建一个实例)
	如果值为prototype(原型,一个bean可以创建多个实例),
	 -->
	<bean id="s1" class="scope.ScopeBean" scope="prototype"></bean>
	
	<!-- init-method属性:指定初始化方法(创建好对象后自动调用初始化方法) 
	     destory-method属性:指定销毁方法
	     lazy-init属性:指定是否延迟加载
	-->
	<bean id="mb1" class="scope.MessageBean" lazy-init="true"
	init-method="init" destroy-method="destroy"></bean>
测试方法:

package test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import scope.MessageBean;
import scope.ScopeBean;

public class TestCase {

	@Test
	//测试作用域
	public void test1(){
		//启动容器
		ApplicationContext ac = 
				new ClassPathXmlApplicationContext("scope.xml");
		//获得对象(通过无参构造创建 自动调用构造方法)
		ScopeBean s1 = ac.getBean("s1",ScopeBean.class);
		ScopeBean s2 = ac.getBean("s1",ScopeBean.class);
		System.out.println(s1 == s2);
		/**
		 * 1.若没有scope属性或者scope属性="singleton" 则输出(创建一个bean)
		 * ScopeBean()
		 * true
		 * 2.若scope属性="prototype" 则输出(创建两个bean)
		 * ScopeBean()
		 * ScopeBean()
		 * false
		 */
	}
	
	@Test
	//测试生命周期
	public void test2(){
		AbstractApplicationContext ac = 
				new ClassPathXmlApplicationContext("scope.xml"); 
		MessageBean mb1 = ac.getBean("mb1",MessageBean.class);
		mb1.sendMessage();
		/**
		 * 关闭容器(AbstractApplicationContext接口里有关闭容器的方法)
		 * ApplicationContext是接口
		 * ClassPathXmlApplicationContext是上述接口的实现类
		 * AbstractApplicationContext是ApplicationContext的子接口
		 */
		//所以关闭容器时候要使用AbstractApplicationContext
		ac.close();//单例bean销毁时调用destroy-method属性中的方法
		/**
		 * 输出结果如下:
		 * MessageBean()
		 * init()
		 * sendMessage()
		 * destroy()
		 */
		//若作用域为prototype则关闭容器销毁对象之前不会调用destroy-method属性中的方法
	}
	
	@Test
	public void test3(){
		//启动spring容器
		ApplicationContext ac = 
				new ClassPathXmlApplicationContext("scope.xml");
		/**
		 * 默认情况下会输出:
		 * MessageBean()
		 * init()
		 * 因为容器会默认创建作用域为单例的bean并调用init-method,
		 * 若指定lazy-init="true"  延迟加载
		 * 则不会自动创建作用域为单例的bean对象,此时没有任何输出结果
		 */
	}
	
	
	
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荒--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值