×

spring中bean的生命周期

spring中bean的生命周期(Spring中Bean的生命周期是怎样的)

admin admin 发表于2023-04-24 00:38:06 浏览51 评论0

抢沙发发表评论

本文目录

Spring中Bean的生命周期是怎样的


Spring框架中,一旦把一个bean纳入到Spring IoC容器之中,这个bean的生命周期就会交由容器进行管理,一般担当管理者角色的是BeanFactory或ApplicationContext。认识一下Bean的生命周期活动,对更好的利用它有很大的帮助。
下面以BeanFactory为例,说明一个Bean的生命周期活动:
Bean的建立
由BeanFactory读取Bean定义文件,并生成各个实例。
Setter注入
执行Bean的属性依赖注入。
BeanNameAware的setBeanName()
如果Bean类实现了org.springframework.beans.factory.BeanNameAware接口,则执行其setBeanName()方法。
BeanFactoryAware的setBeanFactory()
如果Bean类实现了org.springframework.beans.factory.BeanFactoryAware接口,则执行其setBeanFactory()方法。

springbean生命周期


Spring的生命周期是指实例化Bean时所经历的一系列阶段,即通过getBean()获取bean对象及设置对象属性时,Spring框架做了哪些事。Bean的生命周期从Spring容器实例化Bean到销毁Bean。
本文分别对 BeanFactory 和 ApplicationContext 中的生命周期进行分析。
一、BeanFactory实例化Bean相关接口
Bean级生命周期接口:(4个)
1、BeanNameAware
//待对象实例化并设置属性之后调用该方法设置BeanName
void setBeanName(String beanName);
2、BeanFactoryAware
//待调用setBeanName之后调用该方法设置BeanFactory,BeanFactory对象默认实现类是DefaultListableBeanFactory
void setBeanFactory(BeanFactory var1) throws BeansException;
3、InitializingBean
//实例化完成之后调用(调用了BeanPostProcessor.postProcessBeforeInitialization方法之后调用该方法)
void afterPropertiesSet() throws Exception;
4、DisposableBean
//关闭容器时调用
void destroy() throws Exception;
这4个接口都在包 org.springframework.beans.factory 下,它们是Bean级生命周期接口,这些接口由Bean类直接实现。
容器级Bean生命周期接口:(2个)
1、抽象类:InstantiationAwareBeanPostProcessorAdapter
实例化前/后,及框架设置Bean属性时调用该接口。可覆盖的常用方法有:
//在Bean对象实例化前调用
@Override
public Object postProcessBeforeInstantiation(Class《?》 beanClass, String beanName) throws BeansException;

//在Bean对象实例化后调用(如调用构造器之后调用)
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;

/**
* 在设置某个属性前调用,然后再调用设置属性的方法
* 注意:这里的设置属性是指通过配置设置属性,直接调用对象的setXX方法不会调用该方法,如bean配置中配置了属性address/age属性,将会调用该方法
* @param pvs 如 PropertyValues: length=2; bean property ’address’; bean property ’age’
*/
@Override
public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor pds, Object bean, String beanName) throws BeansException;
2、接口BeanPostProcessor
实例化完成之后调用该接口。可实现的接口方法有:
//实例化完成,setBeanName/setBeanFactory完成之后调用该方法
public Object postProcessBeforeInitialization(Object o, String s) throws BeansException;

//全部是实例化完成以后调用该方法
public Object postProcessAfterInitialization(Object o, String s) throws BeansException;
这两个接口都在包 org.springframework.beans.factory.config 下,一般称它们的实现类为“后处理器”。后处理器接口一般不由Bean本身实现,实现类以容器附加装置的形式注册到Spring容器中。
当Sprig容器创建任何Bean的时候,这两个后处理器都会发生作用,所以这两个后处理器的影响是全局的。用户可以通过合理的代码控制后处理器只对固定的Bean创建进行处理。
Bean级生命周期接口解决Bean个性化处理的问题,Bean容器级生命周期接口解决容器中某些Bean共性化处理的问题。

spring bean的完整生命周期是怎么样的


1、Spring对Bean进行实例化(相当于程序中的new Xx())。

2、Spring将值和Bean的引用注入进Bean对应的属性中。

3、如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()方法。

(实现BeanNameAware清主要是为了通过Bean的引用来获得Bean的ID,一般业务中是很少有用到Bean的ID的)。

扩展资料

全面的和模块化的。Spring有分层的体系结构,这意味着你能选择使用它孤立的任何部分,它的架构仍然是内在稳定的。例如,你可能选择仅仅使用Spring来简单化JDBC的使用,或用来管理所有的业务对象。

它的设计从底部帮助你编写易于测试的代码。Spring是用于测试驱动工程的理想的framework。

Spring对你的工程来说,它不需要一个以上的framework。Spring是潜在地一站式解决方案,定位于与典型应用相关的大部分基础结构。它也涉及到其他framework没有考虑到的内容。


spring中bean的生命周期是怎么样的


1.Spring对Bean进行实例化(相当于程序中的new Xx())。

2.Spring将值和Bean的引用注入进Bean对应的属性中

3.如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()方法。

(实现BeanNameAware清主要是为了通过Bean的引用来获得Bean的ID,一般业务中是很少有用到Bean的ID的)。

4.如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanDactory(BeanFactory bf)方法并把BeanFactory容器实例作为参数传入。

(实现BeanFactoryAware 主要目的是为了获取Spring容器,如Bean通过Spring容器发布事件等)。

在spring2.0之前bean只有2种作用域即:singleton(单例)、non-singleton(也称prototype),Spring2.0以后,增加了session、request、global session三种专用于Web应用程序上下文的Bean。因此,默认情况下Spring2.0现在有五种类型的Bean.

当一个bean的作用域设置为singleton,那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把一个bean定义设置为singleton作用域时,Spring IOC容器只会创建该bean定义的唯一实例。


spring bean 生命周期


Bean在Spring Bean应用上下文中的生命周期:
第1步、实例化
第2步、设置属性值
第3步、调用BeanNameAware的setBeanName()方法
第4步、调用BeanFactoryAware的setBeanFactory()方法(设置的BeanFactory对这个bean有什么用?)
例如,有这样一个类
class A implements BeanNameAware{
private BeanFactory factory;
public void setBeanFactory(BeanFactory f){
this.factory = f;
}
}
然后在spring的容器中用《bean》标签配置上这个类。
那么,当spring容器启动时,到这个地方,就会把容器本身作为一个BeanFactory给注入到类A里面去。至于A拿到这个factory之后要干什么,那就由着A自己为所欲为了。
实际上第5步跟这个差不多,只不过容器被作为ApplicationContext来注入了。BeanFactory和ApplicationContext本质上是一个东西,印象里似乎是spring版本升级后引入的ApplicationContext。spring推荐使用后者。
有了这个东西,就可以在一些不太方便用spring来管理上下文的地方使用spring容器了。比如,我见过用第5步的方式把spring的容器给存在一个util类里,在servlet中利用这个util去获取spring容器中配置和管理的类的实例。
第5步、调用ApplicationContextAware方法setApplicationContext()方法(上下文一般传给bean什么东西?能举几个例子么?)
第6步、调用BeanPostProcessor的预初始化方法(before》(预初始化和初始化有什么区别啊,能举例子说下哪些是在预初始化完成的?)
不太理解……推测是先初始化bean的配置。spring的bean配置和bean实例是两回事。最简单的,两个《bean》配置中可以用parent来指定继承关系,但这两个bean所代表的类和实例可能根本没有继承关系。预初始化可能就是先把bean的配置做一个初始化,然后再根据完整的配置去初始化实例。
第7步、调用InitializingBean的afterPropertiesSet()方法(这个是干什么的?为什么还要有这步?)
spring的依赖注入,是通过类的set方法来注入的。这个方法就是用来在某个bean配置的所有property配置都通过bean实例的set方法成功注入到bean实例中之后,再做一些动作。尤其是一些资源的初始化操作。