首页 > 编程知识 正文

spring bean加载过程(简述bean的生命周期)

时间:2023-05-03 15:11:57 阅读:93579 作者:2340

请阅读:

Spring家族的水桶笔记本: springspringbootspringcloudspringmvcspringboot的问题趴下了吗? 我用这个PDF文档吊着面试官。 在

SpringBean的生命周期

面试中,我们经常会听到SpringBean的生命周期这个问题。 用口语来说,从创造到销毁,什么方法是按顺序调用的,我刚开始学,一般是对着标准答案硬背,完全不知道其含义,容易忘记。

流程图如下所示

这样看起来非常复杂,记住了也容易忘记。

因此,为了不再次忘记这个知识点,我会用代码一步一步地模拟和深入理解SpringBean的工作流程。

既然是Bean对象Bean对象,那么SpringBean自然也是对象。 用简单的对象来说明,创建对象需要构造方法,对象有其属性和get、set方法。

私有字符串字段;

公共弹簧bean

system.out.println(springbean的构建方法);

}

公共字符串获取字段

system.out.println (springbeanget方法);

返回场;

}

公共语音设置(字符串字段) {

system.out.println (springbeanset方法);

this.field=字段;

众所周知,要创建SpringBean,必须在配置文件中声明该Beam,但当然也可以是注释。

bean类=' spring bean '

属性名称='字段'值='测试' /

/bean然后,尝试初始化这个容器。 执行结果是什么

publicstaticvoidmain (字符串[ ]数组) {

classpathxmlapplicationcontextapplicationcontext=

newclasspathxmlapplicationcontext (spring.XML );

(} )。

现在,您可以看到,当将bean加载到容器中时,将按顺序调用构造和set方法。 我想大部分人都知道这两个步骤。 但是,除此之外,让我们考虑一下我们的Spring是否做了其他的事情。 接下来看看吧。

如果该Bean实现了几个Aware接口,则将填充与Bean容器的基本属性级别相关的信息。 例如,如果实现了BeanNameAware接口,请重写setBeanName方法,并将此Bean的id设置为性能分析

publicvoidsetbeanname (字符串) {

system.out.println (set beanname : ) s;

bean id=' beanname '类=' spring bean '。

属性名称='字段'值='测试' /

/bean运行看看会发生什么

剩下的BeanFactoryAware与应用程序连接接口相同,让我们直接看看结果

可以看到首先运行了setBeanFactory方法,然后运行了setApplicationContext方法

接下来,创建一个用于全局前置和后置初始化的新Bean。 这就是看问题时所说的前置处理器和后置处理器。

这个Bean我们实现了Bean物理处理器接口

publicobjectpostprocessbeforeinitialization (对象bean,字符串beanname ) throws bean表达式{ } )。

System.out.println("postProcessBeforeInitialization"); return bean; } public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessAfterInitialization"); return null; }

千万不要忘记要在配置文件里声明这个Bean

<bean class="SpringProccesserBean"></bean>

然后我们再运行试试

不出我们所料,前置方法和后置方法依次在后面运行了,难道这就是Bean的全部了吗?呵呵,太天真了,如果在Bean中有实现InitializingBean接口,那又是不同的说法了。我们下面除了重写了afterPropertiesSet方法以外我们还可以在bean里面指定它的init方法。

public void afterPropertiesSet() throws Exception { System.out.println("afterPropertiesSet"); } public void init(){ System.out.println("init"); }

不要忘记配置文件

<bean id="BeanName" class="SpringBean" init-method="init"> <property name="field" value="test" /> </bean>

可以看到,这两个方法是夹在前置处理器和后置处理器之间的,先执行的是InitializingBean接口的afterPropertiesSet方法然后是Bean自身的init方法。

至此,一个Bean的初始化环节就完成了,我们就可以去使用这个Bean了。

既然是说Bean的生命周期,那当然还有Bean的销毁流程了,Bean的销毁流程一共分为连个步骤,一个步骤是实现销毁接口DisposableBean,重写它的销毁方法destroy,还有一个是Bean自身的destroy方法。

public void destroy() throws Exception { System.out.println("DisposableBean"); } public void des(){ System.out.println("des"); }

记得要在配置文件里定义

<bean id="BeanName" class="SpringBean" init-method="init" destroy-method="des"> <property name="field" value="test" /> </bean>

这两个方法会在关闭容易的时候调用,因此我们调用close方法关闭容器

public static void main(String[] args) { ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); applicationContext.close(); }

运行结果

我们看到是先调用DisposableBean接口的destroy方法然后是Bean自身的销毁方法。

这就是SpringBean的生命周期。

下面我们来总结一下

Spring Bean的生命周期

1、实例化Bean对象 2、设置Bean属性 3、如果通过各种Aware接口声明了依赖关系,则会注入Bean对容器基础设施层面的依赖。 Aware接口集体包括BeanNameAware、BeanFactoryAware和ApplicationContextAware 分别注入Bean ID、Bean Factory 和ApplicationContext 4、如果实现了BeanPostProcesser,调用BeanPostProcesser的前置初始化方法postProcessBeforeInitialization 5、如果实现了InitializingBean接口,则会调用afterPropertiesSet方法 6、调用Bean自身定义的init方法 7、调用BeanPostProcesser的后置方法postProcessAfterInitialization 创建完毕 销毁 8、容器关闭前调用DisposableBean的destroy方法和自身的destroy方法

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