《Java基础篇》JavaBean的生命周期·作用域·通俗易懂

1.基本概念

  • bean 就是由IOC 容器初始化、装配及管理的对象。
  • Spring中的bean默认都是单例的,那么单例Bean在多线程程序下如何保证线程安全呢?
  • Spring的单例是基于BeanFactory也就是Spring容器的,单例Bean在此容器内只有一个,Java的单例是基于 JVM,每个 JVM 内只有一个实例。所以非分布式服务情况下,单例Bean可以保证线程安全

2.Bean的作用范围

创建一个bean定义,其实质是用该bean定义对应的类来创建真正实例的“配方”。把bean定义看成一个配方很有意义,它与class很类似,只根据一张“处方”就可以创建多个实例。不仅可以控制注入到对象中的各种依赖和配置值,还可以控制该对象的作用域。这样可以灵活选择所建对象的作用域,而不必在Java Class级定义作用域。
Spring Framework支持五种作用域

Spring Framework支持五种作用域
类别作用域说明
Singlenton在Spring IoC容器中只会存在一个共享的 bean 实例,bean以单例方式存在,默认模式
Prototpye表示一个 bean 定义对应多个对象实例。 prototype 作用域的 bean 会导致在每次对该 bean 请求时,都返回一个新的实例
Request

只适用于webApplicationContext

环境

每一次 HTTP 请求都会产生一个新的bean
Session每一次 HTTP 请求都会产生一个新的 bean,同时该 bean 仅在当前 HTTP session 内有效.与request作用域一样
globalSession定于全局portlet Session的生命周期范围

3.bean的生命周期

在这里插入图片描述

引用:https://zhuanlan.zhihu.com/p/108198655

Bean 的生命周期概括起来就是 4 个阶段

  1. 实例化(Instantiation)
  2. 属性赋值(Populate)
  3. 初始化(Initialization)
  4. 销毁(Destruction)

实例化过程:

BeanWrapper调用createBeanInstance方法。

属性赋值:

bean 设置相关属性和依赖

初始化:

(主要了解Bean在实例)

Aware接口:

  • Spring 检测到 bean 实现了 Aware 接口,则会为其注入相应的依赖。

BeanFactory 类型的容器

  • BeanNameAware:注入当前 bean 对应 beanName;
  • BeanClassLoaderAware:注入加载当前 bean 的 ClassLoader(类加载器);
  • BeanFactoryAware:注入 当前BeanFactory容器 的引用。

ApplicationContext 类型的容器

  • EnvironmentAware:注入 Enviroment,一般用于获取配置属性;
  • EmbeddedValueResolverAware:注入 EmbeddedValueResolver(Spring EL解析器),一般用于参数解析;
  • ApplicationContextAware(ResourceLoader、ApplicationEventPublisherAware、MessageSourceAware):注入 ApplicationContext 容器本身。

BeanPostProcessor后置处理器 

public interface BeanPostProcessor {
	// 初始化前置处理
	default Object postProcessBeforeInitialization(Object bean,
                  String beanName) throws BeansException {
		return bean;
	}
	// 初始化后置处理
	default Object postProcessAfterInitialization(Object bean,
                  String beanName) throws BeansException {
		return bean;
	}
}

 InitializingBean 和 init-method 是 Spring 为 bean 初始化提供的扩展点。(可以扩展初始化逻辑)

DisposableBean 和 destory-method是 Spring 为 bean 销毁提供的扩展点

bean生命周期详细过程如下:

  1. ResouceLoader加载配置信息
  2. 解析配置信息,生成一个一个的BeanDefintion
  3. BeanDefintion由BeanDefintionRegistry管理起来
  4. BeanFactoryPostProcessor对配置信息进行加工(也就是处理配置的信息,一般通过PropertyPlaceholderConfigurer来实现)
  5. 实例化Bean
  6. 如果该Bean配置/实现了InstantiationAwareBean,则调用对应的方法
  7. 使用BeanWarpper来完成对象之间的属性配置(依赖)
  8. 如果该Bean配置/实现了Aware接口,则调用对应的方法
  9. 如果该Bean配置了BeanPostProcessor的before方法,则调用
  10. 如果该Bean配置了init-method或者实现InstantiationBean,则调用对应的方法
  11. 如果该Bean配置了BeanPostProcessor的after方法,则调用
  12. 将对象放入到HashMap中
  13. 最后如果配置了destroy或者DisposableBean的方法,则执行销毁操作

总结:
首先是实例化、属性赋值、初始化、销毁这 4 个大阶段
再是初始化的具体操作,有 Aware 接口的依赖注入、BeanPostProcessor 在初始化前后的处理以及 InitializingBean 和 init-method 的初始化操作;(或**@PostConstruct注解**)
销毁的具体操作,有注册相关销毁回调接口,最后通过DisposableBean 和 destory-method 进行销毁。(@PreDestory注解也可实现)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值