Spring 中 Bean 的生命周期详解

yizhihongxing

标题:Spring中Bean的生命周期详解

在Spring中,Bean的生命周期可以分为以下8个步骤:

1.实例化Bean对象
2.填充Bean属性
3.调用Bean的Aware方法
4.调用Bean的初始化方法
5.使用Bean
6.调用Bean的销毁方法
7.清除Bean的属性值
8.封存Bean

以下是对以上8个步骤的详细讲解:

1.实例化Bean对象

当Spring需要一个Bean时,会先查看Bean定义中是否有lazy-init="true"属性,如果该属性的值为true,则不会立即实例化Bean对象,而是等到第一次使用该Bean对象时再进行实例化。如果lazy-init="false"或者没有设置该属性,则会在容器启动时立即实例化Bean对象。可以通过以下配置方式来控制Bean的实例化时机:

<bean id="exampleBean" class="com.example.ExampleBean" lazy-init="true"/>

2.填充Bean属性

当Bean对象被实例化后,Spring会自动为该Bean对象注入所有在Bean定义中配置的属性,通常情况下这些属性会使用基于XML的依赖注入或基于注解的依赖注入方式来配置。示例代码如下:

XML配置方式:

<bean id="exampleBean" class="com.example.ExampleBean">
  <property name="name" value="John"/>
  <property name="age" value="30"/>
</bean>

注解方式:

@Component
public class ExampleBean {
    @Value("John")
    private String name;
    @Value("30")
    private int age;

    // getter and setter methods
}

3.调用Bean的Aware方法

在填充Bean属性的过程中,Spring会自动调用所有实现了Aware接口的Bean的setXXX()方法(例如实现了BeanNameAware接口的Bean会自动调用setBeanName()方法)。这些Aware接口包括以下几种:

  • BeanNameAware:获取Bean的ID
  • BeanFactoryAware:获取BeanFactory对象
  • ApplicationContextAware:获取ApplicationContext对象
  • ServletContextAware:获取ServletContext对象

示例代码如下:

public class ExampleBean implements BeanNameAware,
    BeanFactoryAware, ApplicationContextAware {

    // ...

    @Override
    public void setBeanName(String beanName) {
      this.beanName = beanName;
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
      this.beanFactory = beanFactory;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) 
        throws BeansException {
      this.applicationContext = applicationContext;
    }

    @Override
    public void setServletContext(ServletContext servletContext) {
      this.servletContext = servletContext;
    }

    // ...
}

4.调用Bean的初始化方法

在Bean属性的注入过程完成后,Spring会自动调用该Bean的初始化方法,该方法可以使用两种方式来定义:

  • 通过实现InitializingBean接口,在afterPropertiesSet()方法中定义初始化逻辑
  • 通过配置init-method属性,在XML配置文件中定义初始化方法

示例代码如下:

通过实现InitializingBean接口的初始化方法:

public class ExampleBean implements InitializingBean {

    // ...

    @Override
    public void afterPropertiesSet() throws Exception {
        // initialization logic here
    }

    // ...
}

通过配置init-method属性的初始化方法:

<bean id="exampleBean" class="com.example.ExampleBean"
      init-method="init">
</bean>

5.使用Bean

当Bean实例化和初始化完成后,就可以通过依赖注入或手动获取Bean对象来使用它。

6.调用Bean的销毁方法

当Spring容器关闭时,会自动调用所有实现了DisposableBean接口的Bean的destroy()方法,也可以通过配置destroy-method属性在XML配置文件中定义销毁方法。

示例代码如下:

通过实现DisposableBean接口的销毁方法:

public class ExampleBean implements DisposableBean {

    // ...

    @Override
    public void destroy() throws Exception {
        // destruction logic here
    }

    // ...
}

通过配置destroy-method属性的销毁方法:

<bean id="exampleBean" class="com.example.ExampleBean"
      destroy-method="destroy">
</bean>

7.清除Bean的属性值

当Bean的作用域为prototype时,Spring会在Bean使用完毕后自动清除Bean的属性值。如果Bean的作用域为singleton,则不会清除Bean的属性值,因为该Bean会一直存留在Spring容器中。

8.封存Bean

Spring提供了一个ScopedProxyFactoryBean,可以将Bean的作用域改为proxy。这样当Bean被封存时,Spring会先销毁Bean,然后通过代理的方式来获取Bean的实例。

示例代码如下:

<bean id="exampleBean" class="com.example.ExampleBean"
      scope="prototype">
  <aop:scoped-proxy/>
</bean>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring 中 Bean 的生命周期详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 深入聊聊MySQL中各种对象的大小长度限制

    MySQL中各种对象的大小长度限制 MySQL中的各种对象都有其自身的大小和长度限制,了解这些限制可以帮助开发人员更好地规划数据库结构和存储数据。本文将深入探讨MySQL中常见对象的大小长度限制。 字符串类型 字符串类型是MySQL中最常用的数据类型之一,以下是各个字符串类型的大小限制: CHAR: 最长可达255个字节,为定长类型,所以占用空间为固定长度。…

    other 2023年6月25日
    00
  • webpack的懒加载和预加载详解

    Webpack的懒加载和预加载详解 Webpack是一个有着强大功能的模块打包工具,其又提供了一些有用的特性,如懒加载和预加载,允许你以更高效的方式加载你的应用程序。 懒加载 懒加载也称为延迟加载,其允许你在需要时才去加载某些组件或模块,而不是在应用程序启动时全局加载。这样做可以显著提高应用程序的性能,因为不需要加载所有内容。 懒加载通过分割你的代码包来实现…

    other 2023年6月25日
    00
  • Java8 Optional原理及用法解析

    Java 8 Optional原理及用法解析 1. Optional的原理 Optional是Java 8引入的一个容器类,用于解决空指针异常的问题。它可以包含一个非空的值,也可以表示一个空值。Optional类的设计目的是为了更好地处理可能为空的值,避免使用传统的null检查。 Optional类的实现原理如下: Optional类是一个泛型类,可以包含任…

    other 2023年10月16日
    00
  • Android 实现左滑出现删除选项

    当在Android应用中实现左滑出现删除选项时,可以使用RecyclerView和ItemTouchHelper类来完成。以下是实现该功能的完整攻略: 首先,在你的布局文件中添加一个RecyclerView组件,用于显示列表项。例如: <androidx.recyclerview.widget.RecyclerView android:id=\&quo…

    other 2023年9月7日
    00
  • maya怎么制作一个四条腿的椅子模型?

    制作椅子模型可以分为以下步骤: 设置参考图片 可以找到一张具有椅子四条腿特征的参考图片。在Maya的3D视图中,可以使用“Create Camera from View”命令创建一个相机视图。然后,在属性编辑器(Attribute Editor)中,找到相机的“Image Plane”(图像平面)选项。可以选择该选项的“Browse”按钮来选择参考图片。此外…

    other 2023年6月27日
    00
  • U盘分配单元大小怎么设置?U盘分配单元大小设置方法

    U盘分配单元大小指的是U盘格式化时每个文件占据的空间大小,它对于U盘的文件存储和传输有很大的影响。因此,如何设置U盘分配单元大小,是每个需要使用U盘的人都需要了解的知识点。以下是设置U盘分配单元大小的完整攻略,详细讲解了设置U盘分配单元大小的方法和注意事项。 设置U盘分配单元大小的方法 方法一:使用Windows自带的磁盘管理工具 将U盘插入电脑,打开“我的…

    other 2023年6月28日
    00
  • JS继承与工厂构造及原型设计模式详解

    JS继承与工厂构造及原型设计模式详解 什么是继承? 继承是指一个对象直接使用另一个对象的属性和方法。在JavaScript中,对象可以通过继承原型链上的属性和方法。 继承的方式 JavaScript中实现继承的方式有以下几种: 1. 原型链继承 原型链继承是指将父类的实例作为子类的原型。实现方式如下: function Parent() { this.nam…

    other 2023年6月26日
    00
  • pyecharts绘制各种数据可视化图表案例附效果+代码

    Pyecharts绘制各种数据可视化图表案例附效果+代码攻略 Pyecharts是一个基于Echarts的Python数据可视化库,它提供了丰富的图表类型和灵活的配置选项,可以帮助我们快速生成各种数据可视化图表。本攻略将详细介绍如何使用Pyecharts绘制各种数据可视化图表,并附带两个示例说明。 安装Pyecharts 首先,我们需要安装Pyecharts…

    other 2023年7月28日
    00
合作推广
合作推广
分享本页
返回顶部