Spring03_Bean的作用域、生命周期以及延迟实例化

1 Bean的作用域

Spring容器在实例化Bean时,可以创建以下作用域的Bean对象

作用域 描述
singleton 一个Bean定义对应一个对象实例,为默认项
prototype 一个Bean定义对应多个对象实例
request 在一次HTTP请求中,一个Bean定义对应一个实例,仅限web环境
session 在一个HTTP session中,一个Bean定义对应一个实例,仅限web环境

上面的作用域,可以通过scope属性指定
在这里插入图片描述
测试代码
在这里插入图片描述
运行结果
在这里插入图片描述
修改声明
在这里插入图片描述
运行结果
在这里插入图片描述

2 Bean的生命周期以及延迟实例化

spring容器在创建Bean时,可以帮忙管理Bean的生命周期,即管理Bean的初始化及销毁的方法。
默认情况下,创建spring容器时,会创建单例的对象,也可以让Spring容器延迟实例化这些单例的对象

创建一个类

package bean;

import java.io.Serializable;

public class ExampleBean implements Serializable{
    
    public ExampleBean() {
        System.out.println("实例化ExampleBean:" + this);
    }
    
    public void init() {
        System.out.println("初始化ExampleBean");
    }
    
    public void destroy() {
        System.out.println("销毁ExampleBean");
    }
    
    public void execute() {
        System.out.println("执行execute方法");
    }	
}

然后在applicationContext.xml中声明这个Bean

    <!-- bean的生命周期 -->
    <!-- bean的延迟实例化 -->	
	<bean id="exampleBean" class="bean.ExampleBean" 
		init-method="init" destroy-method="destroy"/>

测试代码

/**
*1.bean的生命周期
*2.bean的延迟实例化
*/
@Test
public void test(){
	String conf = "applicationContext.xml";
	AbstractApplicationContext ac = 
			new ClassPathXmlApplicationContext(conf);
	System.out.println("----------------");
	ExampleBean bean = ac.getBean("exampleBean",ExampleBean.class);
	
	bean.execute();
	
	ac.close();
}

运行结果
在这里插入图片描述
我们发现,在Spring容器创建的时候,接着就将Bean实例化了,那么如何可以实现在调用的时候再实例化呢,我们修改一下申明的Bean

    <!-- bean的生命周期 -->
    <!-- bean的延迟实例化 -->	
	<bean id="exampleBean" class="bean.ExampleBean" 
		init-method="init" destroy-method="destroy" lazy-init="true"/>

再看一下运行结果
在这里插入图片描述
这样就实现了延迟实例化

在顶级的beans元素中的default-lazy-init属性,可以为容器所有bean指定延迟实例化特性,适用于使用频率很低的单例对象

猜你喜欢

转载自blog.csdn.net/weixin_41538424/article/details/88813207