文章目录
- Bean的生命周期
- 一、概念
- 二、bean的生命周期
- 三、演示bean的生命周期
- Ⅰ.创建Orders类
- Ⅱ.修改配置文件
- Ⅲ.编写测试类
- 四、Bean 的后置处理器,bean 生命周期有七步
- ▶ 演示添加后置处理器效果
- (1)创建类,实现接口 BeanPostProcessor,创建后置处理器
- (2)修改配置文件
- 五、Bean的生命周期 单例与多例 模式的对比
Bean的生命周期
一、概念
- 简单的一句话来说bean的生命周期就是从对象创建到对象销毁的过程。
二、bean的生命周期
(1)通过构造器创建 bean 实例(
无参数构造
)
(2)为 bean 的属性设置值和对其他 bean 引用(
调用 set 方法
)
(3)调用 bean 的初始化的方法(
进行配置初始化的方法
)
(4)bean 可以使用了(
对象获取
)
(5)当容器关闭时候,调用 bean 的销毁的方法(
进行配置销毁的方法
)
三、演示bean的生命周期
Ⅰ.创建Orders类
- 声明属性
- 编写无参构造器
- 编写set()方法
- 创建初始化方法
- 创建bean销毁方法
public class Orders {
// 声明属性
private String oName;
// 1.无参构造
public Orders() {
System.out.println("第一步:执行无参构造器创建bean实例");
}
// 2.set
public void setoName(String oName) {
this.oName = oName;
System.out.println("第二步:调用set方法设置属性的值");
}
// 3.创建执行的初始化的方法 --- 在xml文件中配置
public void initMethod() {
System.out.println("第三步:执行初始化的方法");
}
// 5.创建执行的bean销毁方法
public void destroyMethod() {
System.out.println("第五步:执行销毁方法");
}
}
Ⅱ.修改配置文件
- 配置创建bean对象
- 添加
,指定初始化方法init-method属性
- 添加
,指定销毁bean的方法destroy-method属性
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置bean对象 -->
<bean id="oders" class="Bean的生命周期.Orders" init-method="initMethod" destroy-method="destroyMethod">
<property name="oName" value="电脑"></property>
</bean>
</beans>
Ⅲ.编写测试类
public class Test {
@org.junit.Test
public void test_orders(){
try {
ApplicationContext context = new ClassPathXmlApplicationContext("Bean的生命周期/bean_Orders.xml");
// 4.获取bean实例对象
Orders orders = context.getBean("orders",Orders.class);
System.out.println("第四步:获取创建的bean实例对象");
// 5.手动销毁bean实例对象
((ClassPathXmlApplicationContext)context).close();
} catch (Exception e){
e.getMessage();
}
}
}
返回顶部
四、Bean 的后置处理器,bean 生命周期有七步
(1)通过构造器创建 bean 实例(
无参数构造
)
(2)为 bean 的属性设置值和对其他 bean 引用(
调用 set 方法
)
- 把 bean 实例传递 bean 后置处理器的方法
postProcessBeforeInitialization
(3)调用 bean 的初始化的方法(
进行配置初始化的方法
)
- 把 bean 实例传递 bean 后置处理器的方法
postProcessAfterInitialization
(4)bean 可以使用了(
对象获取
)
(5)当容器关闭时候,调用 bean 的销毁的方法(
进行配置销毁的方法
)
▶ 演示添加后置处理器效果
(1)创建类,实现接口 BeanPostProcessor,创建后置处理器
public class MyBeanPost implements BeanPostProcessor {
/**
* 初始化之前调用
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("在初始化之前执行的方法");
return bean;
}
/**
* 初始化之后调用
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("在初始化之后执行的方法");
return bean;
}
}
(2)修改配置文件
- 只需要配置后置处理器类的bean对象即可,因为后置处理器类实现了
实现了后置处理器,那么后置处理器就会对当前配置文件中的所有bean都添加后置处理器的处理。BeanPostProcessor接口
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置bean对象 -->
<bean id="orders" class="Bean的生命周期.Orders" init-method="initMethod" destroy-method="destroyMethod">
<property name="oName" value="电脑"></property>
</bean>
<!-- 配置后置处理器 -->
<bean id="myBeanPost" class="Bean的生命周期.Test.MyBeanPost"></bean>
</beans>
五、Bean的生命周期 单例与多例 模式的对比
图一:
图二:
图三:
图四:
注意:不管后面有没有创建明确的对象,都会执行配置文件的方法和属性,因为以上是默认的单例模式(设置 scope 值是 singleton 时候),;多例模式(设置 scope 值是 prototype 时候),
加载 spring 配置文件时候就会创建单实例对象
,所以两者的生命周期有所不一样!
不是在加载 spring 配置文件时候创建 对象,而是在调用getBean方法时候创建多实例对象
- 取值有三个
default ,true ,false
- 定义:
- 当容器创建时就将对象也一起创建,就是非懒加载
- 当我们需要使用改对象才加载的时候,就是懒加载
- 优点:节省资源
- 缺点:bug不容易暴露,需要到使用的时候才会发现要使用的类有问题
- 单例模式默认非懒加载
- 多例模式为懒加载