在Bean标签中可以通过scope属性指定对象的作用域
- 单例模式(默认,scope=“singleton)
- 默认饿汉模式(默认):Spring容器初始化阶段就会完成此对象的创建;
- 懒汉模式(当在bean标签中设置lazy-init=“true”)获取对象时完成对象的创建。
- 非单例模式(又称为原型模式,可理解成多例模式scope="prototype )。
- 每次通过Spring容器获取此bean的对象时都会创建一个新的对象
1 单例饿汉模式
默认情况 ,scope=“singleton”
第一步,在Product的无参构造方法中添加一条打印语句。
package com.yiwu.pojo;
public class Product {
private String name;
private double Price;
public Product()
System.out.println("生成对象");
}
}
第二步,在xml文件中配置
<bean id = "product1" class="com.yiwu.pojo.Product"/>
第三步,编写测试类
import com.yiwu.pojo.Product;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest01 {
public static void main(String[] args) {
System.out.println("容器开始初始化");
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(" applicationContext.xml");
System.out.println("容器初始化完成");
System.out.println("开始获取实例");
Product product1 = (Product)applicationContext.getBean("product1");
System.out.println("第一次获取完成");
Product product2 = (Product)applicationContext.getBean("product1");
System.out.println("获取实例完成");
System.out.println(product1);
System.out.println(product2);
}
}
第四步,结果
实例在容器初始化的时候生成,每次从容器获取的是同一个实例
容器开始初始化
生成对象
容器初始化完成
开始获取实例
第一次获取完成
获取实例完成
com.yiwu.pojo.Product@80503
com.yiwu.pojo.Product@80503
2 单例懒汉模式
第一步,更改xml
<bean id = "product1" class="com.yiwu.pojo.Product" lazy-init="true"/>
第二步,结果
实例在第一次获取对象时候生成,之后每次获取的是同一个实例。
容器开始初始化
容器初始化完成
开始获取实例
生成对象
第一次获取完成
获取实例完成
com.yiwu.pojo.Product@80503
com.yiwu.pojo.Product@80503
3 原型/多例模式
scope=“prototype”
在该模式下,所有实例都是在获取实例时生成。
第一步,更改xml
<bean id = "product1" class="com.yiwu.pojo.Product"scope="prototype"/>
第二步,结果
在获取对象的时候生成实例,每次获取的是不同的实例
容器开始初始化
容器初始化完成
开始获取实例
生成对象
第一次获取完成
生成对象
获取实例完成
com.yiwu.pojo.Product@80503
com.yiwu.pojo.Product@4b553d26
4 Bean生命周期
Bean的生命周期是指Bean实例被创建、初始化和销毁的过程。
在Bean的两种作用域singleton和prototype中,Spring容器对Bean的生命周期的管理是不同的。
- 在singleton作用域中,Spring容器可以管理Bean的生命周期,控制着Bean的创建、初始化和销毁。
- 在prototype作用域中, Spring容器只负责创建Bean实例,不会管理其生命周期。
在Bean的生命周期中,有两个时间节点尤为重要
- 实例初始化后
- 实例销毁前
- 在这两个时间节点通常需要完成一些指定操作。因此,常常需要对这两个节点进行监控。
第一步,bean中增加两个方法
public void init(){
System.out.println("bean初始化完成调用");
}
public void destory(){
System.out.println("bean销毁前调用");
}
第二步,在xml文件添加bean
在bean标签中可以通过 init-method 属性指定当前bean的初始化方法,初始化方法在构造器执行之后执行
在bean标签中可以通过 destroy-method 属性指定当前bean的销毁方法,销毁方法在对象销毁之前执行
<bean id = "user19" class="com.yiwu.pojo.User" init-method="init" destroy-method="destory">
</bean>
第三步,编写测试方法
import com.yiwu.pojo.User;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest01 {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(" applicationContext.xml");
User user = (User)applicationContext.getBean("user19");
//销毁容器里的所有实例
applicationContext.close();
System.out.println(user);
}
}