Spring IOC DI依赖注入 IOC容器 Spring Bean的声明周期

本文介绍了Spring框架中的IoC(控制反转)和DI(依赖注入)概念,通过造车例子展示DI如何简化依赖关系,降低代码耦合。深入讲解了Spring IOC容器的作用、功能以及核心接口,探讨了Spring Bean的声明周期和不同作用域。

了解Spring IOC

IOC(Inversion Of Control):控制反转。spring core 最核心的部分之一,可以说没有IOC spring就不会这么火。
想要理解IOC,需要先明白DI(Dependency Inversion)依赖注入。

什么DI 依赖注入,为什么要用依赖注入

通过模拟造汽车举例说明,DI具体做的了什么事情。
假设造一辆汽车Car,需要依赖汽车三大件:发动机 engine,底盘 underpan,变速箱 gearbox, 这三大件有依赖很多零件,用 Screw (螺丝)表示。

若要满足上面的需求,最早的做法,

假设零件的尺寸决定最终造出来什么的汽车。我们在造汽车的时候定义好零件的尺寸我10.
整个依赖关系就是:汽车–依赖–>三大件,三大件–依赖–>零件。
上层依赖于下层,如果我么需要修改下层的构造函数,如修改Screw 的构造函数,就需要修改上层所有类的构造函数。牵一发而动全身。

/**
 * @author lingyiwin
 * 造一辆汽车
 */
public class Test {
    public static void main(String[] args) {
        Car car = new Car(10);
        car.move();
    }
}
/**
 * 假设造一辆汽车需要依赖 发动机,变速箱,底盘
 */
public class Car {
    private Engine engine;
    private Gearbox gearbox;
    private Underpan underpan;
    public Car(int size) {
        this.engine = new Engine(size);
        this.gearbox = new Gearbox(size);
        this.underpan = new Underpan(size);
    }
    public void move(){
        //逻辑体
    }
}
public class Engine {
    private Screw screw;
    public Engine(int size) {
        this.screw = new Screw(size);
    }
}
public class Gearbox {
    private Screw screw;
    public Gearbox(int size) {
        this.screw = new Screw(size);
    }
}
public class Underpan {
    private Screw screw;
    public Underpan(int size) {
        this.screw = new Screw(size);
    }
}
/**
 * 螺丝,假设螺丝就是汽车三大件的必须依赖的散件
 */
public class Screw {
    int size;
    public Screw(int size) {
        this.size = size;
    }
}

使用DI示例

将整个依赖关系修改一下为:汽车–注入–>三大件,三大件–注入–>零件。
此时,如果需要改动零件的构造方法,将不需要修改上层的构造方法。
这样编程,更利于协同开发,单元测试。

public class Test {
    public static void main(String[] args) {
        Screw screw = new Screw(10);
        Engine engine = new Engine(screw);
        Gearbox gearbox = new Gearbox(screw);
        Underpan underpan = new Underpan(screw);
        Car car = new Car(engine, gearbox, underpan);
        car.move();
    }
}
public class Car {
    private Engine engine;
    private Gearbox gearbox;
    private Underpan underpan;

    public Car(Engine engine, Gearbox gearbox, Underpan underpan) {
        this.engine = engine;
        this.gearbox = gearbox;
        this.underpan = underpan;
    }

    public void move(){
        //逻辑体
    }
}
public class Engine {
    private Screw screw;

    public Engine(Screw screw) {
        this.screw = screw;
    }
}
public class Gearbox {
    private Screw screw;

    public Gearbox(Screw screw) {
        this.screw = screw;
    }
}
public class Underpan {
    private Screw screw;

    public Underpan(Screw screw) {
        this.screw = screw;
    }
}
public class Screw {
    int size;

    public Screw(int size) {
        this.size = size;
    }
}

控制反转IOC

需要上层控制下层,而不是下层控制 。使用DI依赖注入来实现控制反转IOC。
所谓的DI依赖注入:把底层类对象作为上层类的参数传递给上层类,实现上层对下层的“控制”。

IOC DI DL的关系

DI(依赖注入)和DL(依赖查找)是IOC(控制反转)的两种形式。

DL(Dependency Lookup):依赖查找。相对DI更为主动一些

  • 使用框架提供的方法获取对象,获取时需要提供相关配置文件路径的信息来确定获取文件的状态。
  • ==DL已经被抛弃。==因为它需要用户自己使用API查找资源和组装对象,具有侵入性。

DI(Dependency Injection)当今主流实现。

  • set注入:setter Injection
  • 接口注入:Interface Injection
  • 注释注入:Annotation Injection
  • 构造器注入:Constructor Injection

依赖倒置原则、 IOC、 DI、 IOC容器

依赖倒置原则:高层模块不应该依赖底层模块,都应该依赖其抽象。
因倒置原则的思路,有了IOC控制反转。
实现IOC控制反转的方法,就是我们所说的DI。

spring框架基于IOC提出IOC容器的概念。

  • 管理bean的生命周期.
  • 控制bean的依赖注入.

控制反转容器做了什么事情

IOC容器:

  • 避免在到处使用new来创建类,且可以做到统一维护。
  • 创建实例的过程中,不需要了解容器实现的细节。

控制反转容器实现的细节就是如下代码块:

Screw screw = new Screw(10);
Engine engine = new Engine(screw);
Gearbox gearbox = new Gearbox(screw);
Underpan underpan = new Underpan(screw);
Car car = new Car(engine, gearbox, underpan);

Spring IOC容器:利用Java语言的反射功能实例化Bean,并建立Bean之间的依赖关系。
Spring IOC容器

Spring IOC支持的功能

  • 依赖注入
  • 依赖检查
  • 自动装配
  • 支持集合
  • 指定初始化方法和销毁方法
  • 支持回调方法

Spring IOC容器的核心接口

  • BeanFactory:spring框架最核心的接口,是spring框架的基础设施,面向Spring。
    1:提供IOC的配置机制
    2:包含Bean的各种定义,便于实例化Bean。
    3:建立对象的依赖关系。
    4:Bean声明周期的控制。
    BeanDefinition:描述Bean的定义。
    BeanDefinitionRegistry:提供向IOC容易注册BeanDefinition对象的方法。
  • ApplicationContext 面向使用Spring框架的开发者。继承多个接口
    1:BeanFactory:能够管理、装配Bean
    2:ResourcePatternResolver:能够加载资源文件
    3:MessageResource:能够实现国际化等功能
    4:ApplicationEventPublisher:能够注册监听器,实现监听机制。

Spring bean 的作用

  • singleton:Spring的默认作用域,容器里拥有唯一的Bean实例。无状态的Bean
  • prototype:针对每一个getBean请求,容器都会创建一个Bean实例。有状态的Bean。使用这种方式需要三思,频繁的创建和销毁Bean是需要开销的。
  • request:会为每一个Http请求创建一个Bean实例。
  • session:会为每一个session创建一个Bean实例。
  • globalSession:会为每一全局Http Session创建一个Bean实例,该作用域仅对Portlet有效。

Spring Bean的声明周期

创建

  1. 实例化Bean
  2. Aware(注入Bean ID、BeanFactory和AppCtx)
  3. BeanPostProcessor(s).postProcessBeforeInitalization
  4. InitalizingBean(s).afterPropertiesSet
  5. 定制的Bean init方法
  6. BeanPostProcessor(s).postProcessAfterInitalization
  7. Bean初始化完成

销毁

  1. 实现了DisposableBean接口,会调用destroy方法。
  2. 配置destry-method属性,则会调用其配置的销毁方法。
identity身份认证 购VIP最低享 7 折!trianglevip30元优惠券将在26:26:5后过期 去使用triangle在CAD(计算机辅助设计)软件中,线性是构建采矿工程图的重要元素。"cad采矿用各种线性"指的是在CAD环境下,为了精确地表示采矿工程的地质结构、开采路径、巷道布局等,所使用的一系列特定线型。这些线型通常包括连续线、虚线、点划线以及定制的特殊线型,以便清晰地标识不同类型的地质特征、开采边界和安全区域。线型在CAD中起到区分和标识不同对象的作用。例如,连续线可能用于表示巷道的实际走向,虚线可能用于表示规划中的巷道或尚未施工的部分,点划线则可能用于显示支撑结构或危险区域。通过选择合适的线型,工程师们可以更直观地理解采矿工程的设计和进度。`.lin`文件是CAD中的线型文件,它包含了线型的定义。用户可以自定义线型,如设置线型的比例因子、每个线段的长度和间隔,以及它们的组合方式。`.lin`文件可以被CAD软件读取,使得用户在绘图时能够选择并应用这些预定义的线型。`.shp`和`.shx`文件则是与CAD中的形状文件相关的。`.shp`文件是一种存储地理空间数据的标准格式,通常包含几何对象(如点、线和多边形)的信息。在采矿领域,这些文件可能用于表示矿体的边界、巷道的位置或其他地质特征。`.shx`文件是`.shp`文件的索引,用于快速访问和处理数据,提高软件的性能。结合这些文件,我们可以创建一个全面的采矿工程图,其中包括了各种定制的线性表示,使设计和分析工作更为准确高效。在实际操作中,工程师首先会根据需求定义或导入`.lin`文件,然后在绘制巷道、矿体和其他元素时选择相应的线型。同时,他们会利用`.shp`和`.shx`文件来加载和管理地理空间数据,以便在CAD环境中呈现采矿区域的三维视图和二维平面图。通过熟练掌握CAD中的线性操作,采矿工程师能够更好地进行规划、模拟和沟通,确保采矿作业的安全性和经济性。此外,这些技术也可以应用于其他工程领域,如土木工程、地质调查等,因为线型的使用是通用的,旨在提供清晰的视觉表示和专业信息的传递。因此,深入理解和应用CAD中的线性是现代工程设计不可或缺的一部分。
LLM交互程序功能详细说明## 1. 程序概述LLM交互界面是一个基于Python和Tkinter开发的图形化应用程序,用于连接和使用各种大型语言模型(LLM)服务,如OpenAI兼容API、Ollama等。程序提供了丰富的配置选项和交互功能,允许用户自定义提示词、管理知识库文件,并与语言模型进行多种形式的交互。## 2. 界面结构程序界面由四个主要标签页组成:### 2.1 交互界面- **输入区域**:用于输入用户文本- **信息显示**:展示当前使用的提示词名称和加载的知识库文件数量- **结果区域**:显示模型响应和请求过程信息- **控制按钮**:发送请求和清除结果### 2.2 提示词与知识库- **提示词管理部分**: - 提示词列表显示 - 提示词编辑区(名称和内容) - 提示词操作按钮(添加、删除、应用、保存)- **知识库管理部分**: - 文件列表 - 文件操作按钮(添加、移除、清除、保存) - 文件预览区域### 2.3 模型配置- **服务器设置**:服务器URL、模型名称、API密钥- **模型参数**:温度、top-p、top-k、重复惩罚、最大生成长度- **配置保存**:保存所有配置到本地文件### 2.4 高级设置- **API配置**:端点路径、请求格式、响应格式- **快速API预设**:用于快速切换不同服务类型的配置- **原始请求预览**:查看和编辑原始JSON请求格式## 3. 核心功能详解### 3.1 提示词管理系统提示词系统允许用户创建、保存和管理多个命名的提示词模板:- **创建提示词**:用户可以输入提示词名称和内容,点击"添加"或"保存"按钮- **编辑提示词**:选择已有提示词,修改内容后保存-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EngineerForSoul

你的鼓励是我孜孜不倦的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值