Spring bean的实例化和IOC依赖注入详解

yizhihongxing

请看下面的详细讲解:

Spring Bean的实例化

Spring Bean 是由 Spring IOC 容器进行管理的对象,它的实例化过程分为两种:基于构造函数的实例化和基于静态工厂方法的实例化。

基于构造函数的实例化

基于构造函数的实例化是 Spring IOC 容器最基本的实例化方式,其基本流程如下:

  1. 在 Spring 配置文件中定义 Bean;
  2. 根据配置文件的定义,在 Spring 容器中找到对应的 BeanDefinition,其中 BeanDefinition 包含了 Bean 的属性值、依赖项等信息;
  3. Spring 容器根据 BeanDefinition 中的信息,调用 Bean 的构造函数创建 Bean 的实例;
    4.Spring 容器通过反射机制,在 Bean 上设置属性或调用它的 set 方法装配依赖项。

示例一:

<bean id="person" class="com.example.Person">
    <constructor-arg name="name" value="张三"></constructor-arg>
    <constructor-arg name="age" value="18"></constructor-arg>
</bean>

上述代码中,我们定义了一个 id 为 person 的 Bean,它的类为 com.example.Person,在创建实例时,我们调用了带两个参数的构造函数,分别设置了属性 nameage 的值。

基于静态工厂方法的实例化

基于静态工厂方法的实例化是一种比较灵活的实例化方式,常常用于有特殊需求的对象实例化,它的基本流程如下:

  1. 在 Spring 配置文件中定义 Bean;
  2. 根据配置文件的定义,在 Spring 容器中找到对应的 BeanDefinition,其中 BeanDefinition 包含了 Bean 的属性值、依赖项等信息;
  3. Spring 容器调用静态工厂方法创建 Bean 实例;
  4. Spring 容器通过反射机制,在 Bean 上设置属性或调用它的 set 方法装配依赖项。

示例二:

<bean id="personFactory" class="com.example.PersonFactory"/>
<bean id="person" factory-bean="personFactory" factory-method="createPerson">
    <constructor-arg name="name" value="张三"></constructor-arg>
    <constructor-arg name="age" value="18"></constructor-arg>
</bean>

上述代码中,我们定义了 id 为 personFactory 的工厂类,它的类为 com.example.PersonFactory,在创建类实例时,我们调用了无参数构造函数;

我们在创建 id 为 person 的 Bean 时,通过 factory-bean 属性指定了工厂类实例,通过 factory-method 属性指定了静态工厂方法 createPerson,即我们可以在 PersonFactorycreatePerson 方法中进行一些特殊处理。

IOC依赖注入详解

IOC(Inversion of Control,控制反转)是 Spring 中最核心的思想之一,它将应用程序中各个组件之间的关系的管理从应用程序代码中解耦,由 Spring 容器来完成控制和维护。从而实现了更加松散耦合、方便测试和更高效的重构等优点。而依赖注入(Dependency Injection,DI)恰恰是控制反转的一种实现方式。

IOC 的实现方式主要有两种:基于构造函数的依赖注入和基于 Setter 方法的依赖注入。

基于构造函数的依赖注入

通过构造函数进行依赖注入,即在创建 Bean 实例时,需要将依赖项作为构造函数的参数传入,Spring 会自动创建对象并为其注入依赖项。示例代码如下:

<bean id="person" class="com.example.Person">
    <constructor-arg name="name" value="张三"></constructor-arg>
    <constructor-arg name="age" value="18"></constructor-arg>
    <constructor-arg ref="sex"></constructor-arg>
</bean>

<bean id="sex" class="com.example.Sex">
    <constructor-arg name="name" value="男"></constructor-arg>
</bean>

上述代码中,我们创建了 id 为 personcom.example.Person 实例,并将 sex 对象作为构造函数的参数传入(注意这里的 sex 实例是通过 id 注入的)。

基于 Setter 方法的依赖注入

通过 Setter 方法进行依赖注入,即使用 setProperty() 方法将依赖项作为实例属性进行赋值,Spring 会自动根据属性类型和名称自动装配依赖项。示例代码如下:

<bean id="person" class="com.example.Person">
    <property name="name" value="张三"></property>
    <property name="age" value="18"></property>
    <property name="sex" ref="sex"></property>
</bean>

<bean id="sex" class="com.example.Sex">
    <constructor-arg name="name" value="男"></constructor-arg>
</bean>

上述代码中,我们创建了 id 为 personcom.example.Person 实例,并使用 setProperty() 方法将 sex 对象作为实例属性进行赋值(注意这里的 sex 实例也是通过 id 注入的)。

至此,我们讲述了 Spring Bean 的实例化和 IOC 依赖注入的详细攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring bean的实例化和IOC依赖注入详解 - Python技术站

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

相关文章

  • js实现嵌套数组重排序

    当我们需要对嵌套数组进行重排序时,可以使用JavaScript来实现。下面是一个完整的攻略,包含了详细的步骤和两个示例说明。 步骤 创建一个递归函数,用于遍历嵌套数组的每个元素。 在递归函数中,首先检查当前元素是否为数组。如果是数组,则递归调用该函数来处理子数组。 如果当前元素不是数组,将其添加到一个新的数组中。 对新数组进行排序,可以使用JavaScrip…

    other 2023年7月28日
    00
  • Windows 2003部署软件

    Windows Server 2003 是微软推出的一种服务器操作系统,下面介绍具体的软件部署攻略。 安装软件包管理工具 首先需要安装软件包管理工具来管理软件包。Windows Server 2003 使用 msiexec.exe 程序来部署程序。可以通过以下步骤来安装软件包管理工具: 下载并安装 Windows Installer 3.1。 安装 mdac…

    other 2023年6月25日
    00
  • 电脑常见故障及处理方法汇总

    电脑常见故障及处理方法汇总 前言 随着电脑使用量的增加,出现故障的概率也就越来越高。有些故障可能对于资深电脑用户来说,轻而易举就可以解决,但是对于新手用户来说,这些问题可能会让他们束手无策,影响到正常的使用。因此,本文对电脑常见故障进行汇总,并提供相应的解决方案,帮助大家尽快恢复正常使用。 电脑常见故障及处理方法 问题1:电脑启动速度变慢 解决方法: 清理系…

    other 2023年6月27日
    00
  • 华为mate7打开和关闭开发人员选项方法图解

    华为Mate7打开和关闭开发人员选项方法 为什么需要开启开发人员选项? 在华为Mate7手机上开启开发人员选项可以让用户进行一些高级操作,如启用USB调试、查看和保持手机状态、CPU使用情况、查看电池使用状态等等。这些操作需要在开发人员选项中启用,才可以使用。所以,如果你是一名开发人员或需要进行高级操作的用户,开启开发人员选项是非常必要的。 如何打开开发人员…

    other 2023年6月26日
    00
  • win11怎么剪切文件并粘贴? win11系统复制剪切粘贴的使用方法

    Win11如何剪切文件并粘贴 剪切文件 剪切是指将选定的文件或文件夹从原来的位置移动到剪贴板上,等待粘贴到另一个位置。Win11系统中,剪切文件的方法如下: 首先选中需要剪切的文件或文件夹,可以通过鼠标左键单击或者键盘上的Shift键加上方向键进行多选。 选中文件后,可以使用快捷键Ctrl+X进行剪切,或者通过右键菜单选择“剪切”选项。 示例:比如需要将D盘…

    other 2023年6月27日
    00
  • 基于python3 类的属性、方法、封装、继承实例讲解

    基于Python3 类的属性、方法、封装、继承实例讲解 1. 属性 属性是类的成员变量,用于存储对象的数据。在Python中,属性可以分为类属性和实例属性。 1.1 类属性 类属性是被该类的所有实例共享的变量。可以通过类名或实例进行访问和修改。 class MyClass: class_attr = 10 # 类属性 # 访问类属性 print(MyClas…

    other 2023年6月28日
    00
  • c#usercontrol用法

    C# UserControl用法 UserControl是C#中常用的控件之一,它可以用于创建自定义的用户界面。本文将详细讲解C# UserControl的用法,包括创建、使用和常见问题的解决方法。 创建UserControl 创建UserControl的步骤如下: 在Visual Studio中创建一个新的Windows Forms应用程序。 解决方案资源…

    other 2023年5月7日
    00
  • 基于jquery的当鼠标滚轮到最底端继续加载新数据思路分享(多用于微博、空间、论坛 )

    下面是基于jQuery实现”当鼠标滚轮到最底端继续加载新数据”的完整攻略。 思路 监听页面滚动事件,判断是否滚到底部。 如果滚动到底部,触发加载事件。 加载事件中通过AJAX获取新数据并添加到页面中。 具体实现 下面我们将通过两个示例来详细讲解如何实现该功能。 示例1:模拟加载微博数据 HTML结构: <div id="weibo-list&…

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