【Spring】控制反转 依赖注入(本文内容由大模型生成)

控制反转 & 依赖注入

  • 1.依赖注入就是控制反转吗
  • 2.能通俗易懂地解释一下 IOC 吗
    • 示例:老板、秘书、员工
  • 3.怎么理解反转这个概念的
    • 3.1 传统方式
    • 3.2 使用依赖注入(DI)
    • 3.3 示例:Spring 框架中的控制反转
  • 4.什么是 Java 中的 Bean
  • 5.注册 Bean 到 IOC 容器是什么意思
  • 6.Spring 中的依赖注入是什么
    • 6.1 构造器注入(Constructor Injection)
    • 6.2 设值注入(Setter Injection)
    • 6.3 字段注入(Field Injection)
  • 7.能通俗易懂地解释一下 Java 注入过程吗
  • 8.实现一个简单的 IOC 代码

1.依赖注入就是控制反转吗

依赖注入Dependency InjectionDI)和 控制反转Inversion of ControlIoC)这两个术语在软件开发中经常被用来描述相同的概念,尤其是在 Spring 框架的上下文中。它们描述的是一种设计模式,这种模式允许 通过外部来源动态地向一个对象提供其依赖项,而不是由对象自身负责创建或管理这些依赖项

具体来说:

  • 依赖注入:这是一种减少组件之间耦合的软件设计模式,通过将依赖项作为参数传递给组件,而不是让组件内部创建这些依赖项。这种方式有助于提高代码的可测试性和可重用性。
  • 控制反转:这个术语更抽象一些,它强调的是控制权的转移。在传统的编程模式中,程序控制了依赖项的创建和管理;而在 IoC 中,这种控制权被“反转”了,由外部的容器或框架来负责依赖项的管理和注入,从而降低了组件之间的直接依赖。

总结来说,依赖注入是一种具体的技术手段,而控制反转是一种更广泛的概念,描述了依赖注入所带来的设计模式上的变化。因此,在很多情况下,人们会认为它们是等价的,尤其是在 Spring 框架的语境中。

2.能通俗易懂地解释一下 IOC 吗

IOCInversion of Control)中文名为 控制反转,是面向对象编程中的一个重要概念。下面我用一个通俗易懂的例子来解释:

假设你是一个公司的老板,你需要管理你的员工。在没有 IOC 的情况下,你直接管理每个员工,比如你需要亲自安排每个员工的工作任务。

在编程中,这类似于你自己在代码中直接创建和管理所有的对象和它们之间的关系,这样做的问题是你需要控制所有的细节,代码会变得复杂和难以维护。

现在引入 IOC 的概念,你不再直接管理每个员工,而是雇佣一个秘书来帮你管理。你需要员工做任务时,你只要告诉秘书你需要什么样的员工,秘书会帮你找到合适的员工并安排任务。

在编程中,IOC 容器(如 Spring 框架)就像这个秘书。你不再在代码中直接创建和管理对象,而是通过配置文件或注解告诉 Spring 你需要什么对象,以及这些对象之间的依赖关系。Spring 会帮你创建对象,并把它们组装在一起。

简而言之,IOC 是一种设计思想,通过将对象的创建和管理责任交给一个框架(比如 Spring),使得代码更加简洁、易于维护和测试。这样,你就可以更专注于业务逻辑,而不是对象的管理细节。

示例:老板、秘书、员工

首先,定义一个员工接口和具体的员工实现:

// 员工接口
public interface Employee {void doTask();
}// 具体员工实现
public class Worker implements Employee {@Overridepublic void doTask() {System.out.println("Worker is doing a task.");}
}

然后,定义一个老板类,它不再直接管理员工,而是依赖于一个秘书(这里简化处理,不单独定义秘书类):

// 老板类
public class Boss {// 通过 Spring 的 @Autowired 注解,让 Spring 框架自动注入 Employee 的实例@Autowiredprivate Employee employee;public void assignTask() {employee.doTask();}public static void main(String[] args) {// 创建 Spring 应用上下文ApplicationContext context = new AnnotationConfigApplicationContext(BossConfig.class);// 从上下文中获取 Boss 实例Boss boss = context.getBean(Boss.class);// 老板分配任务boss.assignTask();}
}

最后,配置 Spring 如何创建和注入这些对象:

// Spring 配置类
@Configuration
public class BossConfig {// 告诉 Spring 创建 Worker 对象,并将其注册为 Bean@Beanpublic Employee worker() {return new Worker();}// 告诉 Spring 创建 Boss 对象,并注入 Employee 的 Bean@Beanpublic Boss boss(Employee employee) {return new Boss();}
}

这段代码展示了如何使用 Spring 框架实现控制反转(IOC):

  • Employee 接口和 Worker 类定义了员工和具体员工的实现。
  • Boss 类展示了老板不再直接管理员工,而是依赖于 Spring 框架来注入员工对象。
  • BossConfig 类是 Spring 的配置类,用来定义和注入 Bean(对象)。

通过这种方式,老板(即代码中的业务逻辑)不再负责对象的创建和管理,而是由 Spring 框架来控制和反转这种依赖关系,使得代码更加简洁和易于维护。

3.怎么理解反转这个概念的

反转Inversion)这个概念在面向对象编程中通常是指 控制权的反转。我们可以通过一个简单的例子来理解这个概念。

假设你要创建一个类来使用某个服务:

3.1 传统方式

// 传统方式
public class MyClass {public void doSomething() {Service service = new Service();service.execute();}
}public class Service {public void execute() {System.out.println("Executing service...");}
}

在这种方式中,MyClass 直接负责创建和调用 Service 类的实例。控制权在 MyClass 手中。

3.2 使用依赖注入(DI)

// 使用依赖注入方式
public class MyClass {private final Service service;public MyClass(Service service) {this.service = service;}public void doSomething() {service.execute();}
}public class Service {public void execute() {System.out.println("Executing service...");}
}

在这种方式中,MyClass 不再直接创建 Service 的实例,而是通过构造器注入。这意味着,提供 Service 实例的责任被 “反转” 到了某个外部实体(比如一个框架或者工厂类)。

详细解释

  • 传统方式:对象自己负责创建和管理它所依赖的对象,控制权在对象本身。
  • 反转方式:对象的依赖由外部负责创建和注入,控制权被 “反转” 到了外部。

3.3 示例:Spring 框架中的控制反转

在 Spring 框架中,控制反转(IoC)通常通过配置文件或注解来实现:

  • 在配置文件中,你可以定义一个 Bean,并指定它依赖的其它 Bean。
  • 在代码中,你可以通过注解的方式告诉 Spring 框架,某个 Bean 依赖另一个 Bean。

这样,Spring 框架会负责创建和注入这些依赖,而不是对象本身。

@Configuration
public class AppConfig {@Beanpublic Service service() {return new Service();}@Beanpublic MyClass myClass(Service service) {return new MyClass(service);}
}
  • service() 方法创建 Service 的实例并注册为 Bean。
  • myClass() 方法创建 MyClass 的实例,并注入 Service 的 Bean。

这样,MyClass 的实例在运行时由 Spring 框架创建,并且依赖关系由框架负责注入,这就是控制反转的具体表现。通过这种方式,代码的耦合度降低,更易于测试和维护。

总之,"反转"是指控制权的转移,从代码内部转移到外部(如框架或工厂类),使得依赖关系的管理变得更加灵活和可控。

4.什么是 Java 中的 Bean

在 Java 编程中,Bean 是一个术语,用来描述一种特殊的 Java 类,这种类符合一定的规范,主要用于在容器(如 Spring 容器)中进行管理。Bean 的概念源自 Java 平台早期的一种组件模型,叫做 JavaBean。

简单来说,Java 中的 Bean 是一个符合以下约定的类:

  • 具有无参构造方法:Bean 类必须有一个公共的无参构造方法,以便容器在实例化 Bean 时能够成功创建对象。
  • 属性封装:Bean 类通常包含私有属性,并通过公共的 getter 和 setter 方法来访问这些属性。这种设计模式有助于封装内部状态,并通过接口控制对这些状态的访问。
  • 可序列化:虽然这不是必须的,但很多 Bean 都是可序列化的,这意味着它们的状态可以被转换为字节流,从而可以跨网络传输或持久化。

Java Bean 通常具有以下特点:

  • 构造方法:Java Bean 通常提供一个无参的构造方法,以便在创建 Bean 时初始化。
  • 属性Properties):Java Bean 包含一些私有成员变量,这些变量被称为 Bean 的属性。
  • Getter 和 Setter 方法:对于每个属性,Java Bean 提供一个公共的 getter 方法和一个公共的 setter 方法,以便读取和设置属性值。
  • 内省Introspection):Java Bean 的设计允许程序通过反射机制动态地发现和使用这些属性和方法。

示例:

public class PersonBean {private String name;private int age;// 无参构造方法public PersonBean() {}// getter 和 setter 方法public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

在这个例子中,UserBean 遵循了 Java Bean 的约定,包含了属性(nameage)以及它们对应的 gettersetter 方法。

在其他类中使用这个 Java Bean,例如在一个 Main.java 文件中:

public class Main {public static void main(String[] args) {PersonBean person = new PersonBean();person.setName("Alice");person.setAge(30);System.out.println("Name: " + person.getName());System.out.println("Age: " + person.getAge());}
}

这个示例展示了如何创建和使用一个简单的 Java Bean。你可以通过 gettersetter 方法来访问和设置 Java Bean 的属性。Java Beans 通常用于封装数据,并且它们的设计使得属性可以被方便地访问和修改。

Java Bean 的常见用途包括:

  • 作为数据库记录的封装。
  • 作为 Web 表单的数据载体。
  • 在 Spring 框架中,作为依赖注入的管理对象

下面是相应的 XML 表示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 定义一个名为 personBean 的 Bean --><bean id="personBean" class="com.example.PersonBean"><!-- 设置 name 属性 --><property name="name" value="John Doe"/><!-- 设置 age 属性 --><property name="age" value="30"/></bean></beans>

在这个 XML 文件中:

  • <beans> 标签是根元素。
  • xmlnsxsi 命名空间以及 xsi:schemaLocation 属性确保 XML 文件符合 Spring 的模式。
  • <bean> 标签定义了一个 Bean,id 属性是 Bean 的唯一标识符,class 属性是 Bean 对应的 Java 类的全限定名。
  • <property> 标签用于设置 Bean 的属性值,name 属性指定要设置的属性名,value 属性包含要设置的属性值。

这样,你就可以在 XML 配置文件中定义并配置一个 PersonBean 的实例。当然,实际使用中,你可能还会根据需要配置更多的属性或依赖。

5.注册 Bean 到 IOC 容器是什么意思

注册 Bean 到 IOC 容器是框架 Spring 中的一个概念。理解这个概念,需要了解两个关键词:Bean 和 IOC 容器。

Bean:

  • Bean 是 Spring 框架中的一个核心概念,指应用程序中的一个对象,由 Spring 的 IoC 容器管理和创建。
  • Bean 通常是用 Java 编写的类,通过 Spring 的配置元数据(如 XML 或 Java 配置类)定义和管理。

IOC 容器:

  • IOC(Inversion of Control,控制反转)容器是 Spring 框架中的核心组件,负责管理 Bean 的生命周期、依赖注入等。
  • IOC 容器在 Spring 中以多种形态出现,如 ApplicationContextBeanFactory 等。

注册 Bean 到 IOC 容器:

  • 这个过程涉及定义和配置 Bean,使其成为 Spring 管理的对象。
  • 通过在 Spring 的配置文件(如 XML 文件)或 Java 配置类中声明 Bean,Spring 框架会负责创建该 Bean 的实例,并将其放入 IOC 容器中。
  • 在 IOC 容器中的 Bean 可以通过 Spring 提供的依赖注入(Dependency Injection,DI)功能与其他 Bean 相互依赖和使用。

举个例子,如果你有一个 Java 类 MyService,你想让它成为 Spring 管理的 Bean,你可以在配置文件中这样写:

<bean id="myService" class="com.example.MyService"/>

或者使用 Java 配置类:

@Configuration
public class AppConfig {@Beanpublic MyService myService() {return new MyService();}
}

这样,当 Spring 框架启动时,会自动创建 MyService 的实例,并将其放入 IOC 容器中,供其他需要它的组件使用。
常见的注册方式包括:

  • 使用注解,如 @Component、@Service、@Repository、@Controller 等。
  • 使用 XML 配置文件。
  • 使用 Java 配置类。

6.Spring 中的依赖注入是什么

在 Spring 框架中,依赖注入Dependency InjectionDI)是一种设计模式的实现,用于管理组件之间的依赖关系。依赖注入的核心目标是降低组件之间的耦合,增强系统的可维护性和可测试性。

具体来说,依赖注入意味着 一个类的依赖项(即它所依赖的对象)不是由类自身创建或查找,而是由外部(通常是Spring 的 IoC 容器)在运行时自动注入到类中。

Spring 框架通过以下几种方式实现依赖注入:

6.1 构造器注入(Constructor Injection)

通过类的构造函数传递依赖项。这种方式确保了依赖项在类实例化时就已经确定,有利于实现强制依赖和不可变对象。

public class MyClass {private final MyDependency dependency;@Autowiredpublic MyClass(MyDependency dependency) {this.dependency = dependency;}
}

6.2 设值注入(Setter Injection)

通过 setter 方法注入依赖项。这种方式比较灵活,但可能导致对象在使用时还未完全初始化。

public class MyClass {private MyDependency dependency;@Autowiredpublic void setDependency(MyDependency dependency) {this.dependency = dependency;}
}

6.3 字段注入(Field Injection)

直接通过类的字段注入依赖项。这是最简单但也是争议最多的方式,因为它违反了类的封装性。

public class MyClass {@Autowiredprivate MyDependency dependency;
}

尽管字段注入因其简洁性而被广泛使用,但 Spring 官方更推荐构造器注入和设值注入,因为它们更符合面向对象的原则,能更好地保证对象的完整性和稳定性。

通过依赖注入,Spring 框架能够管理组件的生命周期,优化配置,使得开发者可以专注于业务逻辑的实现,而不是组件之间的耦合问题。

7.能通俗易懂地解释一下 Java 注入过程吗

当然可以!让我们用一个简单的例子来通俗地解释 Java 中 Spring 框架的依赖注入过程。

假设你正在经营一家咖啡店,店里有各种各样的咖啡机(依赖项),而你(类)需要一台咖啡机来为顾客制作咖啡。在传统的编程方式中,你可能需要自己去市场上挑选并购买一台咖啡机,然后带回来使用。但在 Spring 框架的**依赖注入**机制下,这个过程就大不相同了。

在 Spring 的世界里,有一个特别的角色,我们称之为 Spring 容器(或 IoC 容器),它就像是你的一个超级助理,负责根据你的需要为你准备好所有的东西(依赖项)。你不需要亲自去市场买咖啡机,而是告诉你的助理你需要一台咖啡机,然后你的助理会在合适的时间,把咖啡机送到你手上。

具体到代码中,假设你有一个类叫 Barista(咖啡师),它需要一个 CoffeeMachine(咖啡机)来工作。

// 咖啡机接口
public interface CoffeeMachine {// 煮咖啡void brewCoffee();
}// 具体的咖啡机实现
public class EspressoMachine implements CoffeeMachine {@Overridepublic void brewCoffee() {// Espresso: 意式浓缩咖啡System.out.println("Brewing espresso coffee.");}
}
// 咖啡师类,使用构造器注入咖啡机
public class Barista {private final CoffeeMachine coffeeMachine;// Spring 会负责通过构造器注入 EspressoMachine 实例@Autowiredpublic Barista(CoffeeMachine coffeeMachine) {this.coffeeMachine = coffeeMachine;}public void makeCoffee() {coffeeMachine.brewCoffee();}
}
  • Barista 类:这是一个使用咖啡机来制作咖啡的类。它通过构造器注入的方式获取 CoffeeMachine 的实例。makeCoffee() 方法调用 coffeeMachine 的 brewCoffee() 方法来制作咖啡。

在 Spring 的配置文件或基于 Java 的配置中,你会告诉 Spring 如何创建和管理这些对象:

@Configuration
public class CoffeeShopConfig {@Beanpublic CoffeeMachine coffeeMachine() {return new EspressoMachine();}@Beanpublic Barista barista(CoffeeMachine coffeeMachine) {return new Barista(coffeeMachine);}
}

在这个例子中,CoffeeShopConfig 配置类扮演了“助理”的角色。它定义了如何创建和配置咖啡机(CoffeeMachine)和咖啡师(Barista)。当你运行应用时,Spring 容器会读取这个配置,创建 EspressoMachine 的实例,并自动将其注入到 Barista 中,这样 Barista 就可以直接使用咖啡机来制作咖啡了。

这就是依赖注入的过程:你只需要声明你需要什么(通过构造器、setter 方法或字段上的注解),Spring 框架会负责在运行时将所需的对象实例化并注入到你的类中,从而减少了代码中的耦合度,让组件更容易测试和维护。

8.实现一个简单的 IOC 代码

要实现一个简单的 IOC 容器,我们可以参考 Spring 框架中的实现。下面是一个非常基础的示例,展示了如何通过 Java 纯代码来实现一个简单的 IOC 容器。这个例子中,我们将使用一个简单的 Map 来存储和管理对象。

首先,定义一个简单的接口和实现类:

// 定义一个接口
public interface FortuneService {String getFortune();
}// 实现类
public class FakeFortuneService implements FortuneService {@Overridepublic String getFortune() {return "You will have a great day!";}
}

接下来,创建一个简单的 IOC 容器:

public class SimpleIoCContainer {private final Map<String, Object> beans = new HashMap<>();// 注册 bean 到 IOC 容器public void registerBean(String name, Object bean) {beans.put(name, bean);}// 获取注册的 beanpublic Object getBean(String name) {return beans.get(name);}
}

使用 IOC 容器:

// 使用 IOC 容器的示例
public class IoCDemo {public static void main(String[] args) {SimpleIoCContainer iocContainer = new SimpleIoCContainer();// 注册 FortuneService 和它的实现类FortuneService fakeFortuneService = new FakeFortuneService();iocContainer.registerBean("fortuneService", fakeFortuneService);// 从 IOC 容器中获取 FortuneService 的实例FortuneService fortuneService = (FortuneService) iocContainer.getBean("fortuneService");System.out.println(fortuneService.getFortune());}
}

在这个简单的 IOC 容器示例中,我们创建了一个 SimpleIoCContainer 类,它使用一个 Map 来存储(注册)和获取(解析)对象。然后在 IoCDemo 类中,我们实例化了这个容器,注册了 FortuneService 的实现类 FakeFortuneService,并从中获取了这个服务的实例。

这个例子虽然简单,但展示了 IOC 容器的基本原理:通过注册和解析对象,实现对象的依赖管理,从而提高代码的解耦合和可管理性。在实际开发中,Spring 框架提供了更复杂和强大的 IOC 容器功能,包括依赖注入、生命周期管理、作用域管理等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58031.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python浪漫之星星与文字构造的错位图

效果图&#xff1a; 完整代码&#xff1a; import tkinter as tk import random import math from tkinter.constants import *width 888 height 500 heartx width / 2 hearty height / 2 side 11class Star:def __init__(self, canvas, x, y, size):self.canvas canvas…

精准医疗沟通新体验:开源语音识别(ASR)如何提升医生与患者对话

需求背景&#xff1a;一家远程医疗公司在为偏远地区提供在线医疗服务的过程中&#xff0c;发现传统手动记录方式效率太低&#xff0c;无法满足需求&#xff0c;影响就诊的效率。 解决方案&#xff1a;使用思通数科的ASR平台&#xff0c;公司可以实现多话者对话转录和自动病历生…

MySql中的事务、MySql事务详解、MySql隔离级别

文章目录 一、什么是事务&#xff1f;二、事务四大特性ACID2.1、原子性&#xff08;Atomicity&#xff09;2.2、一致性&#xff08;Consistency&#xff09;2.3、隔离性&#xff08;Isolation&#xff09;2.4、持久性&#xff08;Durability&#xff09; 三、事务操作/事务的用…

MySQL-27.多表查询-案例

一.数据准备 -- 分类表 create table category (id int unsigned primary key auto_increment comment 主键ID,name varchar(20) not null unique comment 分类名称,type tinyint unsigned not null comment 类型 1 菜品分类 2 套餐分类,sort …

今日所学1024和1026

1 简便方法&#xff1a; 在文件夹里找到dll的文件路径&#xff0c;然后在系统变量里添加对应路径&#xff0c; 就不会报错了。 2关于报Qt插件的错,解决办法如下 1026Github的2FA 超级详细的github双重验证密码忘记或者获取不了了怎么办&github recovery code忘记怎么办…

计算机网络:网络层 —— IPv4 地址与 MAC 地址 | ARP 协议

文章目录 IPv4地址与MAC地址的封装位置IPv4地址与MAC地址的关系地址解析协议ARP工作原理ARP高速缓存表 IPv4地址与MAC地址的封装位置 在数据传输过程中&#xff0c;每一层都会添加自己的头部信息&#xff0c;最终形成完整的数据包。具体来说&#xff1a; 应用层生成的应用程序…

洛谷 P3130 [USACO15DEC] Counting Haybale P

原题链接 题目本质&#xff1a;线段树 感觉我对线段树稍有敏感&#xff0c;线段树一眼就看出来了&#xff0c;思路出来得也快&#xff0c;这道题也并不是很难。 解题思路&#xff1a; 这道题能看出来是线段树就基本成功一半了&#xff0c;区间修改区间查询&#xff0c;就基…

「二叉树进阶题解:构建、遍历与结构转化全解析」

文章目录 根据二叉树创建字符串思路代码 二叉树的层序遍历思路代码 二叉树的最近公共祖先思路代码 二叉搜索树与双向链表思路代码 从前序与中序遍历序列构造二叉树思路代码 总结 根据二叉树创建字符串 题目&#xff1a; 样例&#xff1a; 可以看见&#xff0c;唯一特殊的就…

深度学习-循环神经网络-LSTM对序列数据进行预测

项目简介: 使用LSTM模型, 对文本数据进行预测, 每次截取字符20, 对第二十一个字符进行预测, LSTM层: units100, activationrelu Dense层: units输入的文本中的字符种类, 比如我使用的文本有644个不同的字符, 那么units64 激活函数: 因为是多分类, 使用softmax 因为这是最…

使用Vue.js构建响应式Web应用

&#x1f496; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4bb; Gitee主页&#xff1a;瑕疵的gitee主页 &#x1f680; 文章专栏&#xff1a;《热点资讯》 使用Vue.js构建响应式Web应用 1 引言 2 Vue.js简介 3 安装Vue CLI 4 创建Vue项目 5 设计应用结构 6 创建组件 7 使用…

2024“源鲁杯“高校网络安全技能大赛-Misc-WP

Round 1 hide_png 题目给了一张图片&#xff0c;flag就在图片上&#xff0c;不过不太明显&#xff0c;写个python脚本处理一下 from PIL import Image ​ # 打开图像并转换为RGB模式 img Image.open("./attachments.png").convert("RGB") ​ # 获取图像…

GCN+BiLSTM多特征输入时间序列预测(Pytorch)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GCNBiLSTM多特征输入时间序列预测&#xff08;Pytorch&#xff09; 可以做风电预测&#xff0c;光伏预测&#xff0c;寿命预测&#xff0c;浓度预测等。 Python代码&#xff0c;基于Pytorch编写 1.多特征输入单步预测…

【大数据学习 | kafka】kafuka的基础架构

1. kafka是什么 Kafka是由LinkedIn开发的一个分布式的消息队列。它是一款开源的、轻量级的、分布式、可分区和具有复制备份的&#xff08;Replicated&#xff09;、基于ZooKeeper的协调管理的分布式流平台的功能强大的消息系统。与传统的消息系统相比&#xff0c;KafKa能够很好…

MySQL-DQL练习题

文章目录 简介初始化表练习题 简介 本节简介: 主要是一些给出一些习题, 关于DQL查询相关的, DQL查询语句是最重要的SQL语句, 功能性最复杂, 功能也最强, 所以本节建议适合以及有了DQL查询基础的食用, 另外注意我们使用的是Navicat, SQL编辑的格式规范也是Navicat指定的默认格式…

Android 15: 探索未来的可能性

Android 15: 探索未来的可能性 随着技术的不断进步,我们的智能手机系统也在不断地进化。Android 15,作为谷歌最新推出的操作系统版本,带来了一系列令人兴奋的新特性和改进,让我们的数字生活更加丰富多彩。本文将带你一探Android 15的新特性,感受科技的魅力。 低光增强:…

《云原生安全攻防》-- K8s攻击案例:权限维持的攻击手法

在本节课程中&#xff0c;我们将一起深入了解K8s权限维持的攻击手法&#xff0c;通过研究这些攻击手法的技术细节&#xff0c;来更好地认识K8s权限维持所带来的安全风险。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; K8s权限维持&#xff1a;简单介绍K8s权限维持…

安装OpenResty

OpenResty OpenResty 是一个基于 Nginx的高性能 Web 平台&#xff0c;用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。具备下列特点&#xff1a; 具备Nginx的完整功能 基于Lua语言进行扩展&#xff0c;集成了大量精良的 Lua 库、第三方模块…

python多线程处理xlsx,多进程访问接口

import pandas as pd from concurrent.futures import ThreadPoolExecutor# 读取Excel文件 file_path scence.xlsx df pd.read_excel(file_path)# 定义每10行处理逻辑 def process_rows(start_idx):end_idx min(start_idx 10, len(df)) # 处理每10行for i in range(start_…

【Linux系统】进程终止

一、进程退出方式 1、正常终止 主要两种类型&#xff1a;从 main 返回、调用 exit 和 _exit 具体讲解如下&#xff1a; &#xff08;1&#xff09;从 main 返回 这个的使用就不用多说了吧&#xff0c;相信你们已经烂熟于心了 作用&#xff1a;return 语句用于从函数中返回…

一篇文章了解RocketMQ基础知识。

目录 一. 为什么选择了 RocketMQ &#xff1f; 二. RocketMQ 介绍 名词说明 1. Topic (主题) 1.1 Topic 核心作用 1.2 Topic 常见问题 2. Tag (标签) 3. Queue (队列) 3.1 Queue 读写队列 4. Message &#xff08;消息&#xff09; 4.1 Message 类型 5. Produ…