Spring学习(2) Spring的IOC底层实现

矫情吗;* 2023-09-28 12:26 170阅读 0赞

#

  • 1.Spring IOC容器
    • 1.1.BeanFactory与ApplicationContext
    • 1.2.IOC类的结构
    1. Spring Bean的定义
  • 3.Spring依赖注入数值问题
    • 3.1 字面量数值
    • 3.2 CDATA区
  • 3.3 外部已声明bean以及级联属性赋值
  • 3.4内部bean(不会影响到外部bean)
  • 3.5集合
    • 3.5.1 list注入
    • 3.5.2 map注入

1.Spring IOC容器

  • Spring 容器是 Spring 框架的核心。
  • 容器管理他们的整个生命周期从创建到销毁。
  • Spring 容器使用依赖注入(DI)来管理组成一个应用程序的组件。这些对象被称为 Spring Beans
  • IOC:把对象的控制权反转给Spring
  • IOC 容器具有依赖注入功能的容器,它可以创建对象,IOC 容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
  • 通常new一个实例,控制权由程序员控制,而”控制反转”是指new实例工作不由程序员来做而是交给Spring容器来做。
  • 在Spring中BeanFactory是IOC容器的实际代表者。
  • 在这里插入图片描述

1.1.BeanFactory与ApplicationContext

在创建Bean之前,首先需要创建IOC容器,Spring提供了IOC容器的两种实现方式:

  1. BeanFactory:IOC容器的基本实现,是Spring内部的使用接口,是面向Spring本身的,不是提供给开发人员实现的
  2. ApplicationContext:BeanFactory的子接口,提供了更多高级特性。面向Spring的使用者,几乎所有场合都使用ApplicationContext,而不是底层的FactoryBean

1.2.IOC类的结构

在这里插入图片描述

  • BeanFactory:Spring底层的IOC实现(面向Spring框架)

      • ApplicationContext:面向程序员

        • ConfigurableApplicationContext:提供关闭或刷新容器对象方法

            • ClassPathXmlApplicationContext:基于类路径检索xml文件
            • FileSystemXmlApplicationContext:基于文件系统检索xml文件

2. Spring Bean的定义

  • bean对象是由Spring IOC容器管理的
  • bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象。
  • 这些 bean 是由用容器提供的配置元数据创建的,例如,在 XML 的表单中的 定义。
  • bean的常见属性











































属性 描述
class 这个属性是强制性的,并且指定用来创建 bean 的 bean 类。
name 这个属性指定唯一的 bean 标识符。在基于 XML 的配置元数据中,你可以使用 ID 和/或 name 属性来指定 bean 标识符。
scope 这个属性指定由特定的 bean 定义创建的对象的作用域
constructor-arg 它是用来注入依赖关系的
properties 它是用来注入依赖关系的
autowiring mode 它是用来注入依赖关系的
lazy-initialization mode 延迟初始化的 bean 告诉 IoC 容器在它第一次被请求时,而不是在启动时去创建一个 bean 实例。
initialization 方法 在 bean 的所有必需的属性被容器设置之后,调用回调方法。
destruction 方法 当包含该 bean 的容器被销毁时,使用回调方法。它将会在 bean 的生命周期章节中进行讨论。

在这里插入图片描述

3.Spring依赖注入数值问题

3.1 字面量数值

  • 数据类型:基本数据类型及其包装类、String
  • 语法:可以使用value属性或value标签
  • 在这里插入图片描述

3.2 CDATA区

  • 语法:<!CDATA[]>
  • 作用:在xml中定义特殊字符的时候,使用CDATA区
  • 比如,在Spring中,我们想要为一个属性进行赋值的时候,我们可以通过value属性或者是value标签来为属性赋值,如果赋值涉及一些特殊的字符,那么,我们就不能通过属性来赋值,而是要用value标签了赋值
  • 在这里插入图片描述

3.3 外部已声明bean以及级联属性赋值

在这里插入图片描述
如果一个类中,有一个属性不是基本类型,包装类,String类,而是自定义的类型,那么我们就不可以使用value标签或value属性来为它赋值,而要使用ref来进行引用
在这里插入图片描述
在这里插入图片描述
级联属性更改数值会影响外部声明bean(ref赋值的是引用)
在这里插入图片描述
在这里插入图片描述

3.4内部bean(不会影响到外部bean)

  • 概述

    • 内部类:在一个类中完整定义另一个类,当前类称之为内部类
    • 内部bean:在一个bean中完整定义另外一个bean,当前bean称之为内部bean
  • 注意:内部bean不会直接装配到IOC容器中

    • 代码
    1. <bean id="emp2" class="com.zyh.pojo.Employee">
    2. <property name="id" value="102"></property>
    3. <property name="lastName" value="xx"></property>
    4. <property name="email" value="xx@163.com"></property>
    5. <property name="salary" value="60"></property>
    6. <property name="dept">
    7. <bean id="dept" class="com.zyh.pojo.Dept">
    8. <property name="deptId" value="2"></property>
    9. <property name="deptName" value="人事部"></property>
    10. </bean>
    11. </property>
    12. </bean>

3.5集合

3.5.1 list注入

  1. <!-- 测试list注入-->
  2. <bean id="dept2" class="com.zyh.pojo.Dept">
  3. <property name="deptName" value="策划部"></property>
  4. <property name="empList">
  5. <list>
  6. <ref bean="emp1"></ref>
  7. <ref bean="emp2"></ref>
  8. </list>
  9. </property>
  10. </bean>

在这里插入图片描述

3.5.2 map注入

  1. <!--测试map-->
  2. <bean id="dept5" class="com.zyh.pojo.Dept">
  3. <property name="deptId" value="5"></property>
  4. <property name="deptName" value="采购部"></property>
  5. <property name="empMap">
  6. <map>
  7. <entry>
  8. <key>
  9. <value>101</value>
  10. </key>
  11. <ref bean="emp2"></ref>
  12. </entry>
  13. <entry>
  14. <key>
  15. <value>103</value>
  16. </key>
  17. <ref bean="emp1"></ref>
  18. </entry>
  19. </map>
  20. </property>
  21. </bean>

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,170人围观)

还没有评论,来说两句吧...

相关阅读