Spring Bean生命周期源码原理图解

yizhihongxing

标准化的Markdown文本通常会包含以下内容:

标题

子标题

次级子标题

正文内容

  • 列表项1
  • 列表项2
  • 列表项3

  • 数字列表项1

  • 数字列表项2
  • 数字列表项3

代码块如下:

这里是代码块
int a = 1;
String str = "hello";
System.out.println(str);

以下是“Spring Bean生命周期源码原理图解”的完整攻略:

Spring Bean生命周期源码原理图解

概述

Spring作为一个典型的IOC(Inversion of Control,控制反转)框架,它的核心就是Bean容器的管理。对于每个Spring Bean,它会经历Bean的加载、实例化、属性注入、初始化、销毁等一系列的生命周期过程。了解Spring Bean生命周期的过程以及源码原理是我们深入学习Spring框架的前提。

Spring Bean的生命周期

Bean定义的加载和解析

Bean定义的加载和解析最终都会调用到BeanDefinitionRegistry的registerBeanDefinition方法,该方法的作用是用BeanDefinition向容器注册Bean,并将BeanDefinition放入一个名为beanDefinitionMap的缓存中。

Bean的实例化

Bean实例化的操作是通过BeanDefinition创建对应的实例对象,这个过程发生在BeanFactory的getBean方法中。

public Object getBean(String name) throws BeansException {
    return getBean(name, (Object[]) null);
}

其中,name参数对应的就是Bean的id,如果Bean还没有被实例化,则会首先进行实例化. Bean实例化的过程通过DefaultSingletonBeanRegistry的getSingleton进行管理。getSingleton方法首先会从singletonObjects缓存中获取对应的单例对象,如果没有获取到,则会首先进行BeanDefinition的实例化操作,最终将实例化后的Bean对象缓存到singletonObjects中。

Bean的依赖注入

在Bean实例化完成之后,Spring会首先进行Bean的属性注入操作。属性注入是Spring IOC容器最核心的功能之一。对于注入依赖的方式,我们平时使用的最多的就是Setter注入和Constructor注入两种方式。

Setter注入:

@Component
public class UserServiceImpl implements UserService{
    private UserDao userDao;

    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }
}

Constructor注入:

@Component
public class UserServiceImpl implements UserService{
    private UserDao userDao;

    public UserServiceImpl(UserDao userDao){
        this.userDao = userDao;
    }
}

Bean的初始化

Bean的初始化操作主要是为了解决Bean在实例化后,其属性仍然处于未赋值状态的问题。Bean的初始化操作分为两个阶段:afterPropertiesSet和init-method。其中,afterPropertiesSet方法是在Bean实例化后、属性注入完成之后被调用的,如果Bean实现了InitializingBean接口,则afterPropertiesSet方法会被调用。

Init-method方法是在相对独立的方法中定义的,是为了让开发人员有机会在Bean初始化的过程中加入额外的逻辑处理。

Bean的销毁

Bean的销毁是生命周期的最后一个阶段。在销毁Bean之前,需要先完成对Bean的某些操作,比如资源关闭等。Bean的销毁操作是通过DisposableBean接口中的destroy方法来实现的。如果一个Bean定义了destory-method方法,则其会被调用。

示例说明

示例1:Setter注入

下面是一个基于Setter注入方式的示例:

@Component
public class UserServiceImpl implements UserService{
    private UserDao userDao;

    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }
}

在上述代码中,UserServiceImpl中的UserDao对象是通过定义setUserDao方法来进行注入的。

示例2:Init-method

下面是一个使用了Init-method的示例:

@Component
public class User {
    private String name;

    public void setName(String name) {
        this.name= name;
    }

    public void init() {
        System.out.println("User has been initialized");
    }
}

在上述代码中,我们定义了init()方法,并在类的注解中使用了initMethod="init"来声明使用的初始化方法。在初始化的过程中,会输出"User has been initialized"。

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

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

相关文章

  • js封装成插件的步骤方法

    下面是“JS封装成插件的步骤方法”的完整攻略: 1. 确定插件功能 首先需要确定插件要实现的功能,以及此插件的应用场景。根据功能的不同,插件的思路和实现方式也会有所不同。 举个例子,比如我们要开发一个轮播图插件,那么我们就需要确定插件的功能:自动播放、手动切换、可配置参数等。 2. 设计插件接口 设计插件接口,即插件提供的方法和参数。接口设计要考虑到插件的扩…

    other 2023年6月25日
    00
  • C语言中.c和.h文件区别讲解

    下面是详细讲解“C语言中.c和.h文件区别讲解”的完整攻略。 .c文件 .c文件是C程序代码文件,它包含了真正的程序代码和函数定义。当我们写程序时,一般都是把程序代码和函数定义写在.c文件中。.c文件需要被编译成可执行文件才能运行。 下面是一个简单的示例,演示了如何在.c文件中定义函数并使用: #include <stdio.h> // 函数声明…

    other 2023年6月27日
    00
  • 关于bootstrap.yml和bootstrap.properties的优先级问题

    关于 bootstrap.yml 和 bootstrap.properties 的优先级问题 在 Spring Boot 中,我们可以使用 bootstrap.yml 或 bootstrap.properties 文件来配置应用程序的启动属性。这些文件的主要用途是在应用程序初始化之前加载外部属性,例如配置中心的配置、加密属性等。它们被设计为在应用程序的无需依…

    other 2023年6月28日
    00
  • JavaScript的原型是什么你知道吗

    JavaScript的原型是什么你知道吗 JavaScript中的原型是一种特殊的对象,它用于实现对象之间的继承关系。每个JavaScript对象都有一个原型,它定义了对象的属性和方法。当我们访问一个对象的属性或方法时,如果对象本身没有定义该属性或方法,JavaScript会自动查找并使用原型中的对应属性或方法。 原型链 JavaScript中的原型通过原型…

    other 2023年10月15日
    00
  • 后缀名为.td的是什么文件td文件用什么打开?

    后缀名为.td的文件是通常用于存储表格数据的文件,它是Tableau软件的一种数据文件格式。Tableau是一款用于数据可视化和分析的强大工具,可以帮助用户将数据转化为易于理解和交互的图表和报表。 要打开.td文件,您需要安装Tableau软件,并按照以下步骤进行操作: 下载和安装Tableau软件:您可以从Tableau官方网站(https://www.t…

    other 2023年8月5日
    00
  • 如何在苹果Mac电脑上更改文件的扩展名?

    当你在苹果Mac电脑上需要更改文件的扩展名时,可以按照以下步骤进行操作: 首先,找到你想要更改扩展名的文件。你可以通过Finder或者桌面上的图标来找到它。 选中该文件,然后按下\”回车\”键或者右键点击该文件并选择\”重命名\”。 文件名会被选中并进入编辑模式。现在,你可以更改文件名和扩展名。 要更改扩展名,你需要在文件名后面添加一个句点(.)和新的扩展名…

    other 2023年8月5日
    00
  • 网站设计中如何详细的自定义404错误页面的制作和设置

    制作和设置自定义404错误页面是一个重要的网站设计方面,因为当访问者访问一个不存在的页面时,这个页面会显示一个默认的错误页面,但是这个默认页面可能不够友好和精确,无法满足用户的需求。制作自定义的404错误页面可以为用户提供更好的体验,并且更好地指导他们重新找到想要的内容。 下面是一些详细的攻略步骤,帮助您详细制作和设置自定义404错误页面: 1. 设计404…

    other 2023年6月25日
    00
  • 总结Visual Studio下ASP.NET模板化控件中的数据绑定

    下面是详细讲解“总结Visual Studio下ASP.NET模板化控件中的数据绑定”的完整攻略。 什么是数据绑定 数据绑定是将网页控件与数据源相关联的一种技术,可以将数据库中的数据展示在网页中。ASP.NET提供多种数据绑定方式,其中模板化数据绑定是比较常用和灵活的方式。 模板化数据绑定的特点 模板化数据绑定的特点是可以自定义数据的展示形式。通过模板可以控…

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