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


    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区

    • 语法:
    • 作用:在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
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14

    3.5集合

    3.5.1 list注入

    
        
            
            
                
                    
                    
                
    
            
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    3.5.2 map注入

    
    
        
        
        
            
                
                    
                        101
                    
                     
                
                
                    
                        103
    
                    
                    
                
    
            
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    Vue底层术语解析以及存在关系
    Thymeleaf简要学习笔记(转自代码重工)
    css3实现一个3d楼梯动画
    【论文笔记】—低照度图像增强—Semi-Supervised—DRBN—2020-CVPR
    【python接口测试】requests库安装和导入
    let const var区别
    2023年汉字小达人市级比赛什么时候进行?如何准备市级比赛?
    华为od德科面试数据算法解析 2022-6-1 IP地址转换成整数
    数据中台:中台实践与总结
    ElasticSearch从入门到精通--第五话(整合SpringBoot高效开发、分页高亮等、Kibana使用篇)
  • 原文地址:https://blog.csdn.net/m0_67393593/article/details/126116903