Spring启动过程中实例化部分代码的分析之Bean的推断构造方法

这里就来详细讲解一下Spring启动过程中实例化部分代码的分析之Bean的推断构造方法。

背景知识

在Spring框架中,Bean是指由IOC容器管理的对象。在IOC容器初始化的过程中,需要实例化Bean类并将实例对象放入容器中,在这个过程中需要调用Bean的构造函数,Spring默认使用无参构造函数进行实例化。但如果Bean没有无参构造函数,就需要使用其他构造函数进行实例化。

对于存在多个构造函数的情况,Spring会使用构造函数注解或者参数类型匹配的方式进行构造函数的推断。

构造函数注解方式推断

假设我们有一个名为UserService的Bean类,它有两个构造函数,一个是无参构造函数,另一个是使用@ Autowired注解进行依赖注入的构造函数。

public class UserService {
    private UserDao userDao;

    public UserService() {}

    @Autowired
    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }
    // ...
}

在这种情况下,Spring会选择使用带有@Autowired注解的构造函数进行实例化。

参数类型匹配方式推断

如果没有使用@Autowired注解进行标注,Spring会尝试使用参数类型匹配的方式进行构造函数的推断。在这种情况下,Spring会遍历Bean类的所有构造函数,按照参数的类型进行匹配,找到匹配度最高的构造函数进行实例化。

下面示例我们有一个名为OrderService的Bean类,它有三个构造函数,分别是:

public class OrderService {
    private UserDao userDao;
    private OrderDao orderDao;
    private LogDao logDao;

    public OrderService() {}

    public OrderService(UserDao userDao, OrderDao orderDao) {
        this.userDao = userDao;
        this.orderDao = orderDao;
    }

    public OrderService(UserDao userDao, OrderDao orderDao, LogDao logDao) {
        this.userDao = userDao;
        this.orderDao = orderDao;
        this.logDao = logDao;
    }
    // ...
}

在这种情况下,假设我们在Spring配置文件中只注入了UserDao和OrderDao两个Bean,则Spring会选择使用有两个参数的构造函数进行实例化,因为这个构造函数的参数类型是与注入的Bean类型最匹配的。

如果我们在Spring配置文件中既注入了UserDao和OrderDao,又注入了LogDao,则Spring会选择使用有三个参数的构造函数进行实例化,因为这个构造函数的参数类型是与注入的Bean类型最匹配的。

综上所述,Spring会使用构造函数注解或参数类型匹配的方式进行构造函数的推断,如果都没有匹配上,就会抛出异常。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring启动过程中实例化部分代码的分析之Bean的推断构造方法 - Python技术站

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

相关文章

  • 人脸识别-论文阅读-arcface及其由来(sphereface、cosface)

    人脸识别-论文阅读-arcface及其由来(sphereface、cosface)攻略 1. 了解人脸识别算法 人脸识别是计算机视觉领域的一个重要研究方向。在人脸识别中,人脸特征提取是关键的步骤。深度学习是当前人脸识别领域的主流方法,其中基于深度学习的人脸识别算法可以分为两类:基于特征提取的方法和基于度量学习的方法。基于特征提取的方法将人脸图像映射到一个低维…

    other 2023年5月7日
    00
  • 苹果发布iOS13.4/iPadOS13.4开发者预览版beta3详细介绍

    苹果发布iOS 13.4/iPadOS 13.4开发者预览版beta3详细介绍 近日,苹果公司发布了iOS 13.4/iPadOS 13.4开发者预览版beta3,本次更新加入了多项新功能和改进。下面将对此次更新进行详细介绍。 新功能 1. iCloud 文件夹共享 此次更新中,iCloud Drive 可以分享的文件夹增加为共享文件夹。用户可以将文件放置在…

    other 2023年6月26日
    00
  • python 如何对logging日志封装

    下面是Python对logging日志的封装攻略: 1. 理解 logging 模块的基本概念 logging 模块是Python内置的日志管理库,用于输出程序运行时的日志信息。为了更好的封装 logging 模块,我们需要先理解它的基本概念。 logging 模块中包含以下几个重要的类: Logger:logger是一个提供了应用程序可直接使用的接口。它负…

    other 2023年6月25日
    00
  • IDEA中使用Git拉取代码时报 Git pull failed原因及解决方法

    下面是 “IDEA中使用Git拉取代码时报 Git pull failed原因及解决方法”的完整攻略: 1. Git pull failed的常见原因 在使用IDEA中进行Git拉取代码时,可能会遇到Git pull failed的错误提示,原因主要包括以下几种: 1.1 远程仓库不存在 Git pull failed的原因之一是指定的远程仓库不存在。比如,…

    other 2023年6月27日
    00
  • 填坑!线上Presto查询Hudi表异常排查

    填坑!线上Presto查询Hudi表异常排查 背景 最近我们使用Presto来查询Hudi表的时候,遇到了一些异常。我们的查询语句没有任何错误,但是查询结果始终为0,而且并没有任何报错信息。针对这个问题,我们进行了一些排查并解决了问题。在这里,我们分享一下我们的排查过程和解决方法。 排查过程 首先我们检查了数据是否有问题,使用Hadoop FSCK命令查看文…

    其他 2023年3月28日
    00
  • javascript文件加载管理简单实现方法

    下面我将详细讲解“JavaScript文件加载管理简单实现方法”的完整攻略,包含以下几个部分: 背景介绍 加载管理原理 实现方法 代码示例 应用场景 背景介绍 在Web开发过程中,我们常常需要引入多个JavaScript文件,这些文件之间可能存在依赖关系,如何有效地管理文件的加载顺序和避免重复加载是一个让人头痛的问题。因此,我们需要一个JavaScript文…

    other 2023年6月25日
    00
  • Hbuilder开发HTML5 APP之创建子页面

    Hbuilder开发HTML5 APP之创建子页面 在Hbuilder中开发HTML5 APP,创建多个页面是必不可少的。创建多个子页面可以更好地组织你的APP结构,丰富你的APP功能,提升用户体验。在本篇文章中,我们将提供详细的步骤指导,教你如何创建一个子页面。 第一步:创建父页面 在Hbuilder中创建父页面相对简单。打开Hbuilder,选择项目文件…

    其他 2023年3月28日
    00
  • 基于Eclipse中SVN图标不显示的解决方法

    基于Eclipse中SVN图标不显示的解决方法攻略 当在Eclipse中使用SVN插件时,有时候可能会遇到SVN图标不显示的问题。这可能是由于插件配置问题或者Eclipse本身的问题导致的。下面是解决这个问题的完整攻略。 步骤一:检查插件配置 打开Eclipse,点击菜单栏的 \”Window\”(窗口)选项。 选择 \”Preferences\”(首选项)…

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