spring-第八章 bean的生命周期

spring


文章目录


前言

本章介绍bean的生命周期。


1.什么是Bean的生命周期

Spring其实就是一个管理Bean对象的工厂。它负责对象的创建,对象的销毁等。

所谓的生命周期就是:对象从创建开始到最终销毁的整个过程。

什么时候创建Bean对象?

创建Bean对象的前后会调用什么方法?

Bean对象什么时候销毁?

Bean对象的销毁前后调用什么方法?

2.为什么要知道Bean的生命周期

其实生命周期的本质是:在哪个时间节点上调用了哪个类的哪个方法。

我们需要充分的了解在这个生命线上,都有哪些特殊的时间节点。

只有我们知道了特殊的时间节点都在哪,到时我们才可以确定代码写到哪。

我们可能需要在某个特殊的时间点上执行一段特定的代码,这段代码就可以放到这个节点上。当生命线走到这里的时候,自然会被调用。

3.五步生命周期分析

Bean生命周期的管理,可以参考Spring的源码:AbstractAutowireCapableBeanFactory类的doCreateBean()方法。

Bean生命周期可以粗略的划分为五大步:

  • 第一步:实例化Bean
  • 第二步:Bean属性赋值
  • 第三步:初始化Bean
  • 第四步:使用Bean
  • 第五步:销毁Bean

如果我们想要在特定的周期阶段执行代码,则各周期阶段所执行的代码分别在以下地方:

比较特殊的是初始化阶段和销毁阶段,本身并不存在相关方法,而是我们需要自己创建对应的方法并指定其为初始化方法或销毁方法。

  • 自定义方法并用init-method和destroy-method属性指定

补充

只有正常关闭spring容器()才会执行销毁方法。

4.七步生命周期分析

spring中提供了Bean后处理机器 ,可以在bean初始化前后执行一些逻辑,但不和初始化和销毁方法冲突,所以可以将其也视为两个生命周期阶段。

4.1使用Bean后处理器

spring提供BeanPostProcessor接口来让我们实现Bean后处理器
创建BeanPostProcessor接口实现类

java 复制代码
package com.powernode.spring6.bean;  
  
import org.springframework.beans.BeansException;  
import org.springframework.beans.factory.config.BeanPostProcessor;  
  

public class LogBeanPostProcessor implements BeanPostProcessor {  
    @Override  
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {  
        System.out.println("Bean后处理器的before方法执行,即将开始初始化");  
        return bean;  
    }  
  
    @Override  
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {  
        System.out.println("Bean后处理器的after方法执行,已完成初始化");  
        return bean;  
    }  
}
  • 实现BeanPostProcessor接口
  • 实现postProcessBeforeInitialization方法,会在Bean初始化前执行
  • 实现postProcessAfterInitialization方法,会在Bean初始化后执行

把Bean后处理器配置为Bean

需要把创建好的Bean后处理器实现类配置为spring中的一个bean

java 复制代码
<!--配置Bean后处理器。这个后处理器将作用于当前配置文件中所有的bean。-->
<bean class="com.powernode.spring6.bean.LogBeanPostProcessor"/>

于是该配置文件中的所有bean在初始化前后都会执行Bean后处理器中的方法。

5.十步生命周期分析

spring中提供了一些接口,我们使用这些接口可以可以在bean的生命周期中额外添加阶段进行操作:

  • Aware相关接口:让bean可以获取bean的id名、该bean的加载器、制造该bean的工厂对象
  • InitializingBean:提供方法在
  • DisposableBean

于是就会产生额外的生命周期阶段:

只要自己的Bean继承以上接口并实现其中的方法,即可。

6.Bean不同作用域与不同管理方式

Spring 根据Bean的作用域来选择管理方式。

  • 对于singleton作用域的Bean,Spring 能够精确地知道该Bean何时被创建,何时初始化完成,以及何时被销毁;
  • 而对于 prototype 作用域的 Bean,Spring 只负责创建,当容器创建了 Bean 的实例后,Bean 的实例就交给客户端代码管理,Spring 容器将不再跟踪其生命周期。

7.如何让自己new的对象被管理成bean

有些时候可能会遇到这样的需求------某个java对象是我们自己new的,然后我们希望这个对象被Spring容器管理,怎么实现?

使用DefaultListableBeanFactory 对象的registerSingleton方法即可,需要设置该对象的id.

java 复制代码
public class RegisterBeanTest {  
  
    @Test  
    public void testBeanRegister(){  
        // 自己new的对象  
        User user = new User();  
        System.out.println(user);  
  
        // 创建 默认可列表BeanFactory 对象  
        DefaultListableBeanFactory factory = new DefaultListableBeanFactory();  
        // 注册Bean  
        factory.registerSingleton("userBean", user);  
        // 从spring容器中获取bean  
        User userBean = factory.getBean("userBean", User.class);  
        System.out.println(userBean);  
    }  
}

总结

本章介绍bean的生命周期后,可以对IOC中的实例有更深的理解。

相关推荐
xmh-sxh-131411 分钟前
jdk各个版本介绍
java
天天扭码30 分钟前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶31 分钟前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺35 分钟前
Spring Boot框架Starter组件整理
java·spring boot·后端
小曲程序42 分钟前
vue3 封装request请求
java·前端·typescript·vue
gma9991 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️1 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
陈王卜1 小时前
django+boostrap实现发布博客权限控制
java·前端·django
小码的头发丝、1 小时前
Spring Boot 注解
java·spring boot
java亮小白19971 小时前
Spring循环依赖如何解决的?
java·后端·spring