首页 > 编程知识 正文

spring里面bean的生命周期,spring中bean的生命周期是怎样的?

时间:2023-05-03 18:18:27 阅读:182270 作者:1335

前言: JavaBean的目的是将可复用软件代码打包为标准。 特别是用于帮助制造商开发在综合开发环境(IDE )中使用的java软件部件。 这些包括:用户将部件拖动到开发环境中&; 包括可以放置的网格控件等。 这将JavaBean扩展到Java web APP应用程序的标准部件,并将JavaBean部件框架扩展到enterpriseeditionbean(EJB )。

什么是Bean? 首先,让我们看一下Spring官方文档中Bean的定义。

In Spring,theobjectsthatformthebackboneofyourapplicationandthataremanagedbythespringiocontainerarecalledbeans.abeanisanobisanobjobjbjbjans assembled,andotherwisemanagedbyaspringioccontainer.otherwise,abeanissimplyoneofmanyobjectsinyourapplication

根据以上内容,可以对Bean给出以下定义: Bean是由IOC实例化、组装和管理的对象。

Bean的生命周期这里我们的Bean的生命周期主要是指singleton bean,对于prototype bean来说,在用户的getBean获取prototype bean的实例后,IOC容器是当前的实例必须明确将管理权传递给用户,然后再传递给getBean,这里不涉及request/session/application/web socket这几个作用域的bean。

不同的容器具有不同的Bean生命周期开始时间。 对于ApplicationContext,在容器启动时将实例化bean。 在BeanFactory中,在调用getBean ) )方法之前不会实例化。

典型的java对象的生命周期是

当不再使用实例化时,它将通过垃圾回收机制回收,但对Bean来说不是这样。 Bean的生命周期如下图所示

关于以上方法,可以进行以下分类

Bean本身的方法: Bean级别的生命周期方法,如构造函数、getter/setter以及由init-method和destory-method指定的方法。 可以理解为Bean类直接实现接口的方法。 例如,BeanNameAware、BeanFactoryAware、ApplicationContextAware、InitializingBean、DisposableBean等方法仅相对于当前Bean为容器级这些接口的实现类独立于bean,并且在Spring容器中注册。 这些后处理器在Spring容器创建Bean时工作。 后处理器方法(BeanFactoryProcessor的一系列接口) AspectJWeavingEnabler、CustomAutowireConfigurer、configurationclasspostprocessser 这些是已经在Spring框架中实现的BeanFactoryPostProcessor,用于实现特定功能。 Bean本身的方法和Bean级别的生命周期方法都只对当前Bean起作用,而容器级别的生命周期方法和工厂后处理器方法则对所有Bean起作用

关于这些方法,1、2、4可以很好地理解。 现在,我们将重点讨论什么是BeanPostProcessor和BeanFactoryPostProcessor

我个人的理解是,BeanPostProcessor和BeanFactoryPostProcessor是Spring创建的扩展点,用户可以通过创建自己的实现类来修改Bean或BeanFactory

注意:对于ApplicatonContext,容器可以自动检测并加载BeanPostProcessor和BeanFactoryPostProcessor,但不能进行BeanFactory。 您必须自己调用方法手动注册。 BeanPostProcessor和BeanFactoryPostProcessor都可以是多个。 也可以根据org.spring framework.core.priority ordered和org.spring framework.core.ordered对应用程序上下文进行自定义排序

这里需要说明以下两个容易混淆的单词:

Instantiation:实例化是对Initialization:的初始化,该初始化通过调用构造函数来实例化,并在Bean的声明周期中使用init-method指定的方法或initiality

erPropertiesSet()方法

下面我们对常用的这些接口进行说明:

常用接口说明 BeanNameAware该接口只有一个方法setBeanName(String name),用来获取bean的id或者nameBeanFactoryAware该接口只有一个方法setBeanFactory(BeanFactory beanFactory),用来获取当前环境中的BeanFactoryApplicationContextAware该接口只有一个方法setApplicationContext(ApplicationContext applicationContext),用来获取当前环境中的ApplicationContext 获取到IOC容器之后,可以对beans进行修改等操作InitializingBean该接口只有一个方法afterPropertiesSet(),在属性注入完成后调用DisposableBean该接口只有一个方法destroy(),在容器销毁的时候调用,在用户指定的destroy-method之前调用BeanPostProcessor该接口有两个方法:postProcessBeforeInitialization(Object bean, String beanName):在初始化之前调用此方法postProcessAfterInitialization(Object bean, String beanName):在初始化之后调用此方法

通过方法签名我们可以知道,我们可以通过beanName来筛选出我们需要进行个性化定制的bean

InstantiationAwareBeanPostProcessor
该类是BeanPostProcessor的子接口,常用的有如下三个方法postProcessBeforeInstantiation(Class beanClass, String beanName):在bean实例化之前调用postProcessProperties(PropertyValues pvs, Object bean, String beanName):在bean实例化之后、设置属性前调用postProcessAfterInstantiation(Class beanClass, String beanName):在Bean实例化之后调用测试Bean生命周期

下面我们来编写一个实例来验证我们上面所说的Bean生命周期

首先,我们新建一个User,这个Bean实现了我们的BeanNameAware、ApplicationContextAware、InitializingBean、DisposableBean接口

然后我们实现我们自己的BeanPostProcessor

 

实现自己的InstantiationAwareBeanPostProcessor

xml配置文件如下

<context:component-scan base-package="com.xiaohuan.springtest"/><bean id="user" class="com.xiaohuan.springtest.beanlifecycle.User" init-method="myInit" destroy-method="myDestroy">    <!-- 构造函数注入 -->    <constructor-arg index="0" type="int">        <value>1</value>    </constructor-arg>    <constructor-arg index="1" type="java.lang.String">        <value>xiaohuan</value>    </constructor-arg>    <!-- setter方法注入 -->    <property name="id" value="2"/>    <property name="name" value="dahuan"/></bean>复制代码

 

编写我们自己的测试类

最后运行项目

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。