【革命启示录】Spring框架:Java开发的“核聚变”能量源!

Hello,我是阿佑,今天给大家整的活是 《Java开发的“核聚变”能量源》

文章目录

  • Spring框架原理详解
    • 一、引言
      • 简介
      • 目的
      • 特点
      • 例子
    • 二、背景介绍
      • 问题
      • 解决方案
      • 例子
    • 三、核心概念
      • 3.1 控制反转(Inversion of Control, IoC)
        • 定义
        • 实现
        • 例子与代码
      • 3.2 面向切面编程(Aspect-Oriented Programming, AOP)
        • 定义
        • 组件
        • 例子与代码
      • 3.3 依赖注入(Dependency Injection, DI)
        • 方式
        • 目的
        • 例子与代码
    • 四、Spring架构与模块
      • 核心容器(Core Container)
        • BeanFactory
        • ApplicationContext
        • 例子与代码
      • AOP模块
        • 例子
      • 数据访问/集成(Data Access/Integration)
        • JDBC
        • ORM
      • Web模块
        • Spring MVC
        • 例子与代码
      • 测试模块
        • 例子与代码
      • Spring框架的国际化和本地化
        • 本地化消息支持
        • 国际化日期和数字格式
        • 地区敏感信息处理
        • 集成第三方库
        • 测试国际化和本地化

在这里插入图片描述

Spring框架原理详解

一、引言

想象一下,如果你是一位厨师,你的厨房里堆满了食材和工具,但它们都是乱七八糟的。你需要花费大量的时间去寻找一把刀或者一个锅,这无疑会降低你的工作效率。在软件开发的世界里,Spring框架就像是那个帮你整理厨房的助手,它将所有的食材(组件)和工具(服务)都井井有条地放好,让你可以快速地找到你需要的东西,专注于烹饪出美味的“软件大餐”。

简介

Spring是一个开源的、轻量级的Java开发框架,它就像是那个神奇的魔法棒,轻轻一挥,就能让复杂的企业级应用开发变得简单而高效。

目的

Spring的使命是简化企业级应用开发的复杂性,它通过一系列创新的设计模式和编程范式,让开发者能够更加专注于业务逻辑,而不是被底层的复杂性所困扰。

特点

Spring的三大法宝是分层架构、控制反转(IoC)和面向切面编程(AOP)。

  • 分层架构:就像一个精美的蛋糕,每一层都有其独特的风味和作用,Spring的分层架构保证了系统的清晰和模块化。
  • 控制反转(IoC):这是一种设计模式,它让对象的创建和依赖关系管理变得自动化,就像是有一个隐形的服务员,在你点菜后,自动为你准备好所有需要的食材。
  • 面向切面编程(AOP):这是一种编程范式,它允许你将那些与业务逻辑无关的横切关注点(如日志记录、安全性等)从业务逻辑中分离出来,就像是在厨房里安装了一个自动洗碗机,让你可以专注于烹饪,而不用担心清洗工作。

例子

让我们以一个餐厅点餐系统为例。在这个系统中,顾客(用户)可以通过菜单(界面)选择他们想要的菜品(功能)。在没有Spring的情况下,顾客可能需要直接与厨师(开发者)沟通,告诉他们需要什么菜品,然后厨师再去寻找食材和工具来制作菜品。这个过程不仅效率低下,而且如果厨师很忙,顾客可能就需要等待很长时间。

而有了Spring,这个过程就变得完全不同了。顾客只需要通过菜单选择他们想要的菜品,然后后厨(Spring容器)就会自动为他们准备好一切。厨师只需要专注于烹饪,而不需要担心其他的事情。这样,不仅提高了效率,而且也让整个餐厅的运营变得更加流畅。

接下来,我们将深入探讨Spring的背景介绍,看看它是如何一步步解决传统J2EE应用开发中遇到的问题的。

二、背景介绍

在Spring框架出现之前,Java企业级应用开发就像是在没有GPS导航的情况下开车穿越一座迷宫城市。开发者需要手动处理各种复杂的配置和依赖关系,就像是在没有地图的情况下寻找目的地,既费时又容易迷路。

问题

传统的J2EE应用开发面临的问题主要包括:

  • 复杂性高:企业级应用通常包含大量的组件和服务,这些组件之间的依赖关系错综复杂,导致整个系统的管理和维护变得非常困难。
  • 耦合度大:在传统的开发模式下,组件之间的依赖关系通常是硬编码的,这就意味着一旦某个组件发生变化,所有依赖它的组件都可能受到影响,从而导致整个系统的稳定性和可维护性大大降低。

解决方案

Spring框架的出现,就像是为这座迷宫城市带来了GPS导航系统,它通过引入新的设计模式和编程范式,为开发者提供了一种更加清晰和高效的开发方式。

  • 控制反转(IoC):Spring通过IoC机制,将对象的创建和依赖关系的管理从程序代码中分离出来,交由框架的容器来管理。这样,开发者就不需要再手动创建和管理对象,只需要通过简单的配置,就可以让容器自动为他们创建和管理对象,从而大大简化了开发过程。
  • 面向切面编程(AOP):Spring通过AOP机制,允许开发者将那些与业务逻辑无关的横切关注点(如日志记录、安全性等)从业务逻辑中分离出来,封装成独立的模块。这样,就可以在不修改业务逻辑代码的情况下,灵活地添加或修改这些横切关注点,从而提高了系统的模块化和可维护性。

例子

让我们继续以餐厅点餐系统为例。在传统的开发模式下,如果餐厅想要增加一个新的菜品,厨师可能需要手动修改整个点餐系统的代码,以添加这个新菜品。这个过程不仅繁琐,而且如果修改不当,还可能影响到其他菜品的制作。

而有了Spring,这个过程就变得非常简单了。厨师只需要定义一个新的菜品(Bean),然后通过简单的配置,就可以让Spring容器自动为这个新菜品创建和管理所需的食材和工具。这样,厨师就可以专注于烹饪,而不需要担心系统的复杂性。

通过引入IoC和AOP,Spring为Java企业级应用开发带来了革命性的变化,它极大地简化了开发过程,提高了系统的模块化和可维护性。在下一章中,我们将深入探讨Spring的核心概念,包括控制反转(IoC)、面向切面编程(AOP)和依赖注入(DI),看看这些概念是如何在Spring中发挥作用的。
在这里插入图片描述

三、核心概念

Spring框架的核心概念是构建Java企业级应用的基石。下面我们来一一探讨。

3.1 控制反转(Inversion of Control, IoC)

控制反转是一种设计原则,它将传统编程中由程序代码直接管理对象创建和依赖关系的方式,转变为由外部容器(如Spring IoC容器)来管理。

定义

在IoC中,对象不是由程序代码创建的,而是由容器在运行时动态创建和注入的。

实现

Spring通过BeanFactoryApplicationContext接口来实现IoC,使用BeanDefinition来描述Bean的配置信息。

例子与代码

假设我们有一个简单的MessageService接口和它的实现ConsoleMessageService

// 定义一个简单的服务接口
public interface MessageService {void showMessage(String message);
}// 实现这个接口
public class ConsoleMessageService implements MessageService {public void showMessage(String message) {System.out.println(message);}
}

在Spring配置文件中,我们可以这样定义Bean:

<!-- Spring配置文件 -->
<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"><!-- 定义一个MessageService的Bean --><bean id="messageService" class="com.example.ConsoleMessageService"/>
</beans>

现在,我们不需要在代码中创建ConsoleMessageService的实例,而是通过Spring容器来获取:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Client {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");MessageService messageService = context.getBean("messageService", MessageService.class);messageService.showMessage("Hello, Spring IoC!");}
}

3.2 面向切面编程(Aspect-Oriented Programming, AOP)

面向切面编程是一种编程范式,它允许将横切关注点(如日志、事务管理等)与业务逻辑分离。

定义

AOP通过将这些横切关注点模块化,可以对它们进行单独的管理和维护。

组件
  • Joinpoint:程序执行的特定点,如方法的调用或异常的处理。
  • Pointcut:定义一个或多个Joinpoint的表达式。
  • Advice:在Joinpoint处执行的代码,分为前置、后置、环绕和异常处理等类型。
  • Aspect:一个或多个Advice的集合,它可以根据Pointcut表达式应用到Joinpoint上。
例子与代码

假设我们想要在调用MessageService时添加日志记录功能。

// 定义一个日志切面
public class LoggingAspect {public void beforeAdvice(Method method, Object[] args) {System.out.println("Before the method: " + method.getName());}public void afterAdvice(Method method) {System.out.println("After the method: " + method.getName());}
}

在Spring配置文件中,我们可以这样定义切面:

<!-- 定义一个切面 -->
<bean id="loggingAspect" class="com.example.LoggingAspect"/><!-- 定义一个切入点 -->
<bean id="loggingPointcut" class="org.springframework.aop.aspectj.AspectJExpressionPointcut"><property name="expression" value="execution(* com.example.MessageService.*(..))"/>
</bean><!-- 将Advice应用到切入点 -->
<aop:config><aop:aspect id="loggingAspectBean" ref="loggingAspect"><aop:before method="beforeAdvice" pointcut-ref="loggingPointcut"/><aop:after method="afterAdvice" pointcut-ref="loggingPointcut"/></aop:aspect>
</aop:config>

3.3 依赖注入(Dependency Injection, DI)

依赖注入是一种实现IoC的技术,它允许容器动态地将依赖关系注入到需要它们的组件中。

方式
  • 构造器注入:通过构造器参数来注入依赖。
  • Setter方法注入:通过公共的Setter方法来注入依赖。
  • 字段注入:直接在字段上注入依赖(不推荐,因为会丧失灵活性)。
目的

降低组件之间的耦合,提高代码的可测试性和可维护性。

例子与代码

假设ConsoleMessageService需要一个NotificationService来发送通知。

public class NotificationService {public void sendNotification(String message) {System.out.println("Notification: " + message);}
}

我们可以通过构造器注入来提供这个依赖:

public class ConsoleMessageService implements MessageService {private NotificationService notificationService;// 通过构造器注入NotificationServicepublic ConsoleMessageService(NotificationService notificationService) {this.notificationService = notificationService;}public void showMessage(String message) {System.out.println(message);notificationService.sendNotification(message);}
}

在Spring配置文件中,我们可以这样定义这个Bean,并注入依赖:

<bean id="messageService" class="com.example.ConsoleMessageService"><constructor-arg ref="notificationService"/>
</bean><bean id="notificationService" class="com.example.NotificationService"/>

通过这些核心概念,Spring提供了一种强大而灵活的方式来构建和管理复杂的Java企业级应用。接下来,我们将探讨Spring的架构与模块,了解它们是如何协同工作的。
在这里插入图片描述

四、Spring架构与模块

Spring框架的架构设计非常灵活,它由多个模块组成,每个模块都负责特定的功能,这些模块可以独立使用,也可以组合使用以构建更复杂的应用。

核心容器(Core Container)

核心容器是Spring框架的核心,它提供了基本的IoC容器功能,以及对DI的支持。

BeanFactory

BeanFactory是Spring框架中最基本的IoC容器,它负责管理Bean的生命周期和依赖关系。BeanFactory是延迟初始化的,只有在第一次请求一个Bean时,它才会被创建和初始化。

ApplicationContext

ApplicationContextBeanFactory的子接口,它提供了更多的高级功能,如事件发布和监听、国际化消息支持等。ApplicationContext通常用于应用程序的整个生命周期。

例子与代码

以下是如何使用ApplicationContext来获取一个Bean的示例:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class ApplicationContextExample {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");MessageService messageService = context.getBean(MessageService.class);messageService.showMessage("Hello, Spring ApplicationContext!");}
}

AOP模块

AOP模块提供了面向切面编程的支持,允许开发者将横切关注点与业务逻辑分离。

例子

假设我们有一个UserService,我们希望在执行每个方法之前记录日志:

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;@Aspect
public class UserServiceLoggingAspect {@Before("execution(* com.example.UserService.*(..))")public void logBefore(JoinPoint joinPoint) {System.out.println("Before method: " + joinPoint.getSignature().getName());}
}

数据访问/集成(Data Access/Integration)

数据访问/集成模块提供了对各种数据访问技术的集成,如JDBC、ORM(对象关系映射)和事务管理。

JDBC

Spring的JDBC模块简化了JDBC的使用,通过使用JdbcTemplate,可以减少样板代码,提高数据访问层的可维护性。

ORM

Spring支持多种ORM框架,如Hibernate、JPA等,提供了事务管理的支持。

Web模块

Web模块提供了构建Web应用的支持,包括MVC模型和其他Web集成特性。

Spring MVC

Spring MVC是一个基于模型-视图-控制器的Web应用框架,它通过注解或XML配置来简化Web应用的开发。

例子与代码

以下是使用Spring MVC的控制器示例:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class MyController {@GetMapping("/hello")public String sayHello() {return "hello"; // 返回视图的名称}
}

测试模块

测试模块提供了对JUnit等测试框架的集成支持,使得编写单元测试和集成测试变得更加容易。

例子与代码

以下是使用Spring的测试模块进行单元测试的示例:

import org.springframework.beans.factory.annotation.Autowired;
import org.junit.jupiter.api.Test;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;class UserServiceTest {@Autowiredprivate UserService userService;@Testvoid testFindUser() {// 创建模拟的用户User user = new User("John");// 配置模拟对象返回特定的用户when(userService.findUser(1L)).thenReturn(user);// 调用方法并断言结果User result = userService.findUser(1L);assertEquals(user, result);}
}

通过这些模块的协同工作,Spring框架为开发者提供了一个强大而灵活的平台,用于构建各种类型的Java应用。

Spring框架的国际化和本地化

在全球化的软件开发背景下,国际化(Internationalization,通常缩写为 I18N)和本地化(Localization,通常缩写为 L10N)变得越来越重要。国际化是指设计和开发能够无障碍地适应不同文化和语言环境的产品的过程。本地化则是指将国际化的产品调整、翻译和适应特定地区的过程。

本地化消息支持

在Spring框架中,可以使用MessageSource接口来支持本地化消息。这通常涉及到在应用程序中使用键值对来存储消息,并根据用户的地区设置从相应的属性文件中检索翻译后的文本。

示例代码:使用MessageSource

@Controller
public class MessageController {@Autowiredprivate MessageSource messageSource;@GetMapping("/message")public String showMessage(@RequestParam String code, Model model) {model.addAttribute("message", messageSource.getMessage(code, null, null));return "message";}
}

在资源文件(例如:messages.properties 用于默认区域设置,messages_es.properties 用于西班牙语区域设置)中,消息被定义如下:

# messages.properties
message.welcome=Welcome to our store!
# messages_es.properties
message.welcome=¡Bienvenido a nuestra tienda!
国际化日期和数字格式

Spring框架支持国际化的日期和数字格式,这通常是通过Java的Locale类和java.text包来实现的。

示例代码:国际化日期格式

@GetMapping("/format-date")
public String formatDate(@RequestHeader(value = "Accept-Language", required = false) String lang,Model model) {Locale locale = lang != null ? new Locale(lang.split("-", 2)[0]) : Locale.getDefault();DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);model.addAttribute("currentDate", dateFormat.format(new Date()));return "date";
}
地区敏感信息处理

在处理与地区相关的信息时,如货币、地址格式等,Spring框架可以与Java的国际化库一起使用,以确保正确地格式化和解析这些信息。

示例代码:地区敏感的货币格式化

public String getFormattedCurrency(double amount, String countryCode) {Locale locale = new Locale("", countryCode);NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(locale);return currencyFormat.format(amount);
}
集成第三方库

Spring框架可以与许多第三方库集成,如Apache Commons Lang和Java Internationalization API,以支持更复杂的国际化和本地化需求。

示例代码:使用Apache Commons Lang进行地区感知的排序

public List<String> sortCountries(Locale locale, List<String> countries) {Collator collator = Collator.getInstance(locale);collator.setStrength(Collator.PRIMARY);Collections.sort(countries, collator);return countries;
}
测试国际化和本地化

在测试国际化和本地化功能时,需要确保应用程序在不同的区域设置下表现一致。

示例代码:使用JMockit进行国际化测试

@Test
public void testLocalizedMessage(@Mocked final LocaleService mockLocaleService,@Mocked final MessageSource mockMessageSource) {new Expectations() {{mockLocaleService.getLocale();result = Locale.FRENCH;mockMessageSource.getMessage("message.welcome", null, Locale.FRENCH);result = "Bienvenue sur notre site!";}};// 测试代码
}

通过这些策略,Spring框架支持开发者构建出既国际化又本地化的应用,满足全球用户的多样化需求。如果您需要更具体的示例或有其他问题,请继续提问。

接下来,我们将探讨Bean的生命周期,了解Spring是如何管理Bean的生命周期的。
在这里插入图片描述
通过这四个部分的介绍,我们对Spring框架的基本原理和核心概念有了全面的了解。Spring框架通过其分层架构和模块化设计,提供了强大的功能来简化企业级应用的开发。

下一篇,阿佑准备和大家进一步探讨Spring框架的其他方面,如Bean的生命周期管理、事务管理、与其他技术的集成等。欢迎持续关注!

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

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

相关文章

多商户Docker Supervisor进程管理器部署

Dockerfile 根目录下没有Dockerfile的可以复制下面的命令 # 使用基础镜像 FROM leekay0218/crmeb-mer## 复制代码 ## 在本地调试注释掉&#xff0c;使用映射把文件映射进去 #ADD ./ /var/www# 设置工作目录 WORKDIR /var/www# 设置时区为上海 ENV TZAsia/Shanghai RUN ln -sn…

python安装问题及解决办法(pip不是内部或外部命令也不是可运行)

pip是python的包管理工具&#xff0c;使python可在cmd&#xff08;命令行窗口&#xff0c;WinR后输入cmd&#xff09;中执行 针对 “pip不是内部或外部命令也不是可运行” 问题&#xff0c;需要在安装的时候将python添加到环境变量中 上图第三个选项必须勾选才能在cmd中使用pi…

python从0开始学习(四)

目录 前言 1、算数运算符 1.1 //:整除运算符 1.2 %:取模操作 1.3 **&#xff1a;幂运算 2、赋值运算符 3、比较运算符 4、逻辑运算符 5、位运算符 5.1 &&#xff1a;按位与 5.2 |&#xff1a;按位或 5.3 ^&#xff1a;按位异或 5.4 ~&#xff1a;按位取反 5.5…

如何保证Redis双写一致性?

目录 数据不一致问题 数据库和缓存不一致解决方案 1. 先更新缓存&#xff0c;再更新数据 该方案数据不一致的原因 2. 先更新数据库&#xff0c;再更新缓存 3. 先删除缓存&#xff0c;再更新数据库 延时双删 4. 先更新数据库&#xff0c;再删除缓存 该方案数据不一致的…

我独自升级崛起游戏账号登录注册教程 (5.8最新版)

新韩漫公司所发布的这项动作游戏已向玩家们敞开大门&#xff0c;为大家带来了前所未有的游戏体验和乐趣。这个游戏内包含了大量令人着迷的故事、令人印象深刻的战斗场景以及丰富多样的娱乐元素。在这其中最为引人注目的一点就是游戏内容中融入了“虚拟角色”的元素&#xff0c;…

【webrtc】RemoteAudioSource的创建线程

m98 代码&#xff1a;I:\webrtc m98_yjf\src\pc\rtp_transmission_manager.cc RtpTransmissionManager::CreateReceiver 在信令线程创建receiver receiver 是&#xff1a; rtc::scoped_refptr<RtpReceiverProxyWithInternal<RtpReceiverInternal>>receiver;其实际…

专家解读 | NIST网络安全框架(1):框架概览

随 着信息技术的快速发展&#xff0c;组织面临着越来越严峻的网络安全挑战。NIST网络安全框架&#xff08;NIST Cybersecurity Framework&#xff0c;CSF&#xff09;是一个灵活的综合性指南&#xff0c;旨在协助各类组织建立、改进和管理网络安全策略&#xff0c;以加强网络安…

【docker 】 push 镜像提示:denied: requested access to the resource is denied

往 Docker Registry &#xff08;私服&#xff09;push 镜像提示&#xff1a;denied: requested access to the resource is denied 镜像push 语法&#xff1a;docker push <registry-host>:<registry-port>/<repository>:<tag> docker push 192.16…

【软件工程】需求分析

目录 前言需求分析需求获取UML概述用例图用例图的组成用例图中的符号和含义包含的两种使用场景 用例图补充&#xff1a;“系统”用例模型建模确定系统参与者确定系统用例 用例文档用例文档组成部分 活动图组成元素初始节点和终点活动节点转换决策与分支、合并分岔与汇合 类图类…

将文本中的unicode字符替换成汉字

背景介绍 msql workbench导出数据库表的数据 导出的json数据 [{"english_id":1, "english_word":"ambition", "homophonic":"am-\u4ffa\uff0cbi-\u5fc5,tion-\u80dc\uff1a\u4ffa\u5fc5\u80dc", "chinese":&quo…

线性表的概念与结构,以及顺序表和链表的简单概念

1.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线…

华为 huawei 交换机 配置 MUX VLAN 示例(汇聚层设备)

组网需求 在企业网络中&#xff0c;企业所有员工都可以访问企业的服务器。但对于企业来说&#xff0c;希望企业内部部分员工之间可以互相交流&#xff0c;而部分员工之间是隔离的&#xff0c;不能够互相访问。 如 图 6-4 所示&#xff0c; Switch1 位于网络的汇聚层&#xff0…

C++入门第二节--关键字、命名空间、输入输出

点赞关注不迷路&#xff01;本节涉及c入门关键字、命名空间、输入输出... 1. C关键字 C总计63个关键字&#xff0c;C语言32个关键字 asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseen…

开源模型 Prometheus 2 能够评估其他语言模型,其效果几乎与 GPT-4 相当

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Python3中Richdem包遇到问题

Python3中Richdem包遇到问题 文章目录 Python3中Richdem包遇到问题问题一报错解决 问题二报错解决 参考 问题一 报错 RichDEM 是一套数字高程模型 &#xff08;DEM&#xff09; 水文分析工具&#xff0c;这次打算用richdem进行地形分析&#xff0c;尝试在conda里面安装richde…

高效、精准:皮秒激光切割机在陶瓷基板加工中的应用

皮秒激光切割机&#xff08;激光划片机&#xff09;在陶瓷基板切割领域具有显著的优势和潜力&#xff0c;主要体现在以下几个方面&#xff1a; 1. 高精度&#xff1a;皮秒激光切割机能够实现极高的切割精度&#xff0c;对于陶瓷基板这种需要精细加工的材料尤为重要。它能够在不…

红黑树

一、红黑树用在哪里 HashMap。Linux 进程调度 CFS。Epoll 事件块的管理。Nginx Timer 事件管理。&#xff08;key&#xff0c;value&#xff09;的形式&#xff0c;并且中序遍历是顺序的&#xff0c;红黑树是二叉排序树。 二、红黑树性质 每个节点是红色或者黑色。根节点是黑…

C++构造函数和析构函数的调用顺序

一般情况下&#xff0c;调用析构函数的次序正好与调用构造函数的次序相反&#xff0c;也就是最先被调用的构造函数&#xff0c;其对应的析构函数最后被调用&#xff0c;而最后被调用的构造函数&#xff0c;其对应的析构函数最先被调用。 当然对象的构造函数和析构函数调用时机和…

【软件开发规范篇】JAVA后端开发编程规范

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

电子取证平航杯的复现

闻早起部分&#xff1a; 一、闻早起的windows10电脑 &#xff08;1&#xff09;.“闻早起”所使用的笔记本电脑使用何种加密程式&#xff1f; 1.在EFI文件中找到加密程式 &#xff08;2&#xff09; 教徒“闻早起”所使用的笔记本电脑中安装了一款还原软件&#xff0c;其版本…