首页 > 编程知识 正文

简述bean的生命周期(spring bean作用域)

时间:2023-05-04 20:37:46 阅读:105102 作者:721

我去一些公司面试的时候,经常会被问到关于Spring的问题,有一次被问到Spring中Bean的生命周期。其实这也是做生意经常遇到的问题,但是很容易忘记,所以这次我就专门总结一下。

提示:可以从Servlet的生命周期中学习,实例化、初始化init、接收请求服务和销毁。

Bean 的完整生命周期

对于普通的Java对象,对象是新建时创建的,没有引用时由垃圾回收机制回收。对于Spring IoC容器托管的对象,它们的生命周期完全由容器控制。每个Bean在春季的生命周期如下:

如上图所示,Bean的生命周期相当复杂。让我们对上图:中的每一步进行文字描述。

启动Spring,找到需要Spring管理的bean并加载,实例化bean;

在Bean被实例化之后,Bean的引入和值被注入到Bean的属性中;

如果Bean实现了BeanNameAware接口,Spring会将Bean的Id传递给setBeanName()方法;

如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法传入BeanFactory容器实例;

如果bean实现了ApplicationContextAware接口,Spring会调用Bean的setApplicationContext()方法,传入Bean的应用上下文引用;

如果Bean实现了Bean后置处理器接口,Spring将调用它们的后置处理器beforeinitialization()方法;

如果Bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。同样,如果bean使用init-method声明了一个初始化方法,那么也将调用该方法;

如果Bean实现了Bean后处理器接口,Spring将调用它们的后处理器fterialization()方法;

Bean已经准备好被应用程序使用了。它们将保留在应用程序上下文中,直到应用程序上下文被销毁;

如果bean实现了DisposableBean接口,Spring将调用其destroy()接口方法。同样,如果bean使用destroy-方法声明destory-方法,也将调用该方法。

说实话,看了这么多面试问题,只有这个面试问题的答案最多。事实上,很多时候我们并没有真正实现上面描述的接口。如果在采访中问到春豆的生命周期,相信很多人都说不出口。下面,我将分三个阶段对豆的生命周期有更深的了解,让朋友们有更深的了解!

生命周期的三个阶段

10-1010目前,Spring Bean的主要作用域或范围有五种。

第一个创作阶段

Spring工厂什么时候创建对象?

Scope="singleton "(默认)

` `` java

创建弹簧工厂时,会创建对象。

classpathsmlapplicationcontext S1=new classpathsmlapplicationcontext(' application . XML ');

请注意,获取对象时会创建: lazy-init=“true”。

bean name=' student ' class=' com . zq . student ' scope=' singleton ' lazy-init=' true '/

` `` scope="prototype "

` `` java

Spring factory在获取对象时会创建对象。

classpathsmlapplicationcontext S1=new classpathsmlapplicationcontext(' application . XML ');

object student=S1 . GetBean(' student ');

第二个初始化阶段

p>Spring工厂在创建完成对象后,调用对象的初始化方法,完成对应的初始化操作 1. 初始化方法提供: 程序员根据需求,提供初始化方法,最终完成初始化操作 2. 初始化方法调用: Spring工厂进行调用

InitializingBean接口

```java 实现接口 重写方法 @Override public void afterPropertiesSet() throws Exception { //这里写初始化的内容.数据库? System.out.println("初始化方法"); } ```

自己提供一个普通方法 配置到 配置文件

```java public void myInit(){ System.out.println("我自己定义的初始化方法"); } <bean name="student" class="com.zq.student" init-method="myInit" /> ```

细节分析

1.既实现了 InitializingBean 又自己定义了 执行顺序? ```java 1. InitializingBean接口 2. 自定义的初始化 ``` 2.注入一定发生在初始化操作前面 ```java public class student implements InitializingBean { private String name; public String getName() { return name; } public void setName(String name) { System.out.println("student的set方法"); this.name = name; } public student() { System.out.println("学生类的无参构造"); } @Override public String toString() { return "学生类"; } @Override public void afterPropertiesSet() throws Exception { System.out.println("初始化方法"); } public void myInit(){ System.out.println("我自己定义的初始化方法"); } } <property name="name" value="jadct"></property> ClassPathXmlApplicationContext s1 = new ClassPathXmlApplicationContext("application.xml"); 控制台输出: 学生类的无参构造 student的set方法 初始化方法 我自己定义的初始化方法 ``` 3.什么叫初始化操作 ``` 资源的初始化:网络 IO 数据库 ...... ```

第三销毁阶段

DisposableBean接口

```java //重写方法 @Override public void destroy() throws Exception { System.out.println("销毁方法"); } ClassPathXmlApplicationContext s1 = new ClassPathXmlApplicationContext("application.xml"); s1.close();//关闭工厂执行销毁方法 ```

自定义方法

1. 不适用于scope="prototype" 2. 什么叫销毁操作 ``` 主要是做一些资源的释放操作 io.close() connection.close(); ```

总结:

Spring 容器可以管理 singleton 作用域下 bean 的生命周期,在此作用域下,Spring 能够精确地知道bean何时被创建,何时初始化完成,以及何时被销毁。而对于 prototype 作用域的bean,Spring只负责创建,当容器创建了 bean 的实例后,bean 的实例就交给了客户端的代码管理,Spring容器将不再跟踪其生命周期,并且不会管理那些被配置成prototype作用域的bean的生命周期。

大体的三个阶段

实例化并属性赋值 Instantiation、Populate初始化 Initialization销毁 Destruction

回顾看下描述内容,结合代码再理解下,相信大家更加理解什么是Spring Bean的生命周期了吧!

记得点赞+关注哦~~

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