1.什么是序列化和反序列化?
①序列化(Serialization):
-
序列化是将数据结构或对象转换为一种可存储或传输的格式的过程。这种格式通常是字节流或某种文本格式(如 JSON、XML 等)。序列化的目的在于将数据保存到文件中,或者通过网络传输到其他系统或组件。序列化后数据可以被方便地存储到数据库、文件,或者在不同的网络服务之间进行传送。
②反序列化(Deserialization):
-
反序列化是将序列化后的数据转换回原来的数据结构或对象的过程。这是将序列化时生成的数据格式再次读取并转化为可用于程序的原始对象的过程。反序列化使得程序能够从存储或接收到的数据中恢复出有用的信息。
2.简述Spring的生命周期
Spring 框架中的 Bean 生命周期是指 Spring 容器如何创建 Bean 实例,初始化它,以及在应用程序上下文关闭时销毁它的整个过程。SpringBean 的生命周期主要由以下阶段组成:
(1).实例化
当 Spring 容器读取 Bean 定义并决定创建 Bean 实例时,它会调用无参构造函数或使用工厂方法来实例化 Bean。
(2).属性填充(Population)
在实例化之后,Spring 将根据配置文件中提供的信息,使用 setter 或其他方法注入所有依赖的属性。
(3).后置处理器(Post-Processors)
Spring 提供了 BeanPostProcessor 接口,允许在 Bean 初始化前后执行自定义操作。这个接口有两个方法: postProcessBeforeInitialization和postProcessAfterInitialization。
(4).初始化
InitializingBean 接口的 afterPropertiesSet()方法或带有 @PostConstruct 注解的方法会在所有属性填充完毕后被调用。 如果 Bean 定义中配置了初始化方法,那么这个方法也会在这个阶段被调用。
(5).正常运行
此时 Bean 已经完全初始化,可以被应用程序使用。
(6).销毁
当 Spring 容器关闭时,如果 Bean 实现了 DisposableBean 接口,其 destroy()方法会被调用。或者如果 Bean 定义中配置了销毁方法,那么这个方法将在容器关闭时被调用。在 Spring 中,Bean 的生命周期是由容器管理的,这意味着开发者可以通过实现特定的接口或使用注解来控制和扩展 Bean 生命周期的不同阶段。 以下是 Bean 生命周期的一个简化流程图:
实例化 -> 属性填充 -> 后置处理器 -> 初始化 -> 正常运行 -> 销毁
3.什么是单例Bean和原型Bean
在Spring框架中,Bean的作用域(scope)决定了Bean的生命周期和实例的创建方式。两种常用的Bean作用域是单例(Singleton)和原型(Prototype)。
单例Bean(Singleton)
-
定义:单例Bean是Spring容器中唯一的一个实例。无论你在应用中请求多少次该Bean,Spring始终返回同一个实例。
-
生命周期:在Spring容器启动时就被创建,直到容器关闭时才会销毁。
-
适用场景:适合状态无关、线程安全的场景,比如工具类、共享服务等。
如何定义单例Bean: 在Spring中,默认的Bean作用域就是单例。如果你不明确指定,Spring会将Bean视为单例。
原型Bean(Prototype)
-
定义:原型Bean是每次请求都会创建一个新的实例。当你从Spring容器中获取该Bean时,都会返回一个新的对象。
-
生命周期:当Bean被请求时创建,每个请求都生成新的实例;Spring容器不负责原型Bean的销毁,这需要由调用者自行管理。
-
适用场景:适合有状态的对象,例如用户请求时需要独立维护状态的服务或组件。
如何定义原型Bean: 在Spring中,可以通过设置@Scope
注解为prototype
来定义一个原型Bean。
总结
-
单例Bean:一个实例,共享,适合无状态的服务。
-
原型Bean:每次请求新实例,适合有状态的服务。