当前位置: 首页 > news >正文

Java大师成长计划之第20天:Spring Framework基础

📢 友情提示:

本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。

在Java开发领域,Spring Framework作为一个强大的框架,已成为企业级应用开发的事实标准。它通过提供全面的基础设施支持,使得开发者可以专注于应用程序的业务逻辑。在本篇博文中,我们将深入探讨Spring Framework的核心概念,特别是控制反转(IoC)和依赖注入(DI),并通过示例来帮助理解这些概念。

一、Spring Framework概述

Spring Framework 是一个轻量级的开源框架,广泛应用于企业级Java应用程序的开发。它为开发者提供了一个全面的编程和配置模型,简化了开发工作,增强了应用的灵活性和可维护性。Spring框架的目标是通过提供全面的基础设施支持,让开发者能够专注于业务逻辑的实现,而无需担心底层技术细节。

Spring最早由Rod Johnson在2002年提出,并随着时间的推移,逐渐发展成一个功能强大且高度模块化的框架。如今,Spring已经成为Java开发中不可或缺的工具,尤其在构建大规模的企业级应用时,Spring几乎是首选框架。

1. Spring框架的核心思想

Spring的核心思想是控制反转(Inversion of Control,IoC)依赖注入(Dependency Injection,DI)。这两个概念的提出,使得Spring能够管理应用程序的对象生命周期和依赖关系,从而减少了类之间的耦合度。

1.1 控制反转(IoC)

控制反转是一种设计原则,它将对象的控制权从程序代码中转移到外部容器中。传统的开发方式中,应用程序通过构造函数或工厂方法来创建对象,而在Spring中,这些对象的创建和管理工作交给了IoC容器,程序只需要关心对象之间的协作,而不必显式地创建对象或管理对象的生命周期。

1.2 依赖注入(DI)

依赖注入是控制反转的一种实现方式。它允许将一个对象的依赖关系从外部注入到对象内部。通过DI,Spring容器可以自动地管理对象之间的依赖关系,而无需在对象中显式地创建或查找依赖对象。常见的依赖注入方式有构造函数注入、setter方法注入和接口注入。

1.3 面向切面编程(AOP)

面向切面编程(Aspect-Oriented Programming,AOP)是Spring的另一个核心特性。AOP使得开发者能够将应用程序中的横切关注点(如日志记录、安全控制、事务管理等)从业务逻辑中分离出来,通过切面(Aspect)进行集中管理,从而提高了应用程序的模块化和可维护性。

1.4 数据访问集成

Spring提供了对数据库访问的集成支持,主要包括对JDBC、ORM(如Hibernate、JPA)、事务管理等方面的封装。Spring对数据访问的整合使得开发者可以更加高效地处理数据库操作,减少了直接操作数据库时可能出现的繁琐代码和潜在的错误。

1.5 Spring MVC

Spring MVC是Spring框架的一部分,旨在简化Web应用程序的开发。它遵循经典的MVC(Model-View-Controller)设计模式,分离了应用程序的不同层次,增强了可测试性和扩展性。Spring MVC不仅支持传统的JSP技术,还与现代的前端框架(如Angular、React等)兼容,能够有效支持RESTful API的开发。

2. Spring的模块化设计

Spring框架是高度模块化的,它将框架的功能划分成不同的模块,开发者可以根据需要选择使用相应的模块。Spring的模块包括:

  • Core Container(核心容器):这是Spring的核心,负责管理IoC容器、AOP等基本功能。

    • Spring Core:Spring的核心功能模块,提供IoC容器和Bean工厂的基本功能。
    • Spring Beans:提供Bean的创建和管理功能。
    • Spring Context:提供应用程序上下文(ApplicationContext)及事件机制。
    • Spring AOP:支持面向切面编程(AOP),用于处理横切关注点。
    • Spring Expression Language (SpEL):Spring的表达式语言,用于在Spring配置中表达复杂的条件。
  • Data Access/Integration(数据访问与集成)

    • JDBC:对JDBC操作的简化,避免了直接操作JDBC时繁琐的代码。
    • ORM:对Hibernate、JPA等ORM框架的集成。
    • JMS:Java消息服务的支持,用于消息传递。
    • Transactions:支持声明式事务管理,简化事务控制。
  • Web模块

    • Spring Web:Spring的Web模块,提供Web应用开发的基础设施。
    • Spring Web MVC:基于MVC设计模式的Web框架,简化了Web应用的开发。
    • Spring Web Flow:支持Web应用中业务流程管理的模块。
  • Test模块

    • 提供对JUnit和TestNG的集成,帮助开发者在Spring应用中进行单元测试。

3. 为什么使用Spring?

Spring之所以能成为Java开发中的核心框架,主要得益于它的以下优势:

3.1 减少样板代码

Spring为开发者提供了大量的默认配置和抽象,极大地减少了需要编写的样板代码。比如,Spring的自动装配(Autowiring)机制允许开发者无需显式声明对象的依赖关系,Spring容器会自动根据类型或名称注入所需的Bean。

3.2 提高可维护性

通过IoC和DI,Spring降低了类之间的耦合度,使得每个类的职责更加单一和明确。这种结构使得代码更加模块化,后期的维护、修改和扩展变得更加容易。

3.3 提升可测试性

Spring的IoC容器使得类的依赖关系得以集中管理,开发者可以在测试时方便地替换或模拟依赖对象,从而提高单元测试的可操作性和可维护性。

3.4 强大的社区和生态系统

Spring拥有一个活跃的社区和丰富的生态系统。除了核心框架外,Spring还提供了许多子项目,如Spring Boot(简化应用程序的创建和配置)、Spring Cloud(微服务架构的支持)、Spring Security(安全框架)等。这些项目使得开发者能够在多个领域中高效地使用Spring框架。

4. 小结

Spring Framework是一个功能全面的Java开发框架,它通过控制反转和依赖注入的核心机制,大大简化了开发过程,并提升了应用程序的灵活性和可维护性。它的模块化设计使得开发者可以根据具体需求选择使用不同的功能模块,在企业级应用开发中,Spring无疑是一个不可忽视的重要工具。

在接下来的篇章中,我们将详细介绍Spring框架的核心功能之一——控制反转(IoC)和依赖注入(DI)。通过深入理解这些机制,您将能够更加高效地使用Spring进行开发。

二、控制反转(IoC)

控制反转(Inversion of Control,简称IoC)是Spring框架的核心概念之一,也是整个Spring框架的基础。它本质上是一种设计原则,用于降低对象之间的耦合度,使得系统更加灵活和易于维护。在传统的编程模式中,对象通常通过创建其他对象来实现功能,而控制反转则将对象的创建和管理交给外部容器。Spring通过IoC容器来实现这一设计思想,从而使得应用程序中的对象不再显式地负责自身的创建和管理。

1. IoC的定义

控制反转的定义简单来说,就是“控制权的转移”。通常,在传统的编程模式下,一个对象在创建时,会直接依赖于其他对象,而自己也负责这些对象的创建与管理。而IoC则将这种对象创建的控制权交给外部的容器或框架(在Spring中是IoC容器),容器负责管理对象的生命周期和依赖关系。通过这种方式,开发者不再需要自己管理对象的生命周期和依赖关系,从而使得系统更加松耦合。

举个例子,传统方式中,如果一个类需要依赖另一个类,它可能会在自己的构造函数中创建该类的实例。反转控制则是通过外部容器来负责该类的实例化和依赖注入,从而减少了类之间的耦合度。

2. IoC的工作原理

Spring IoC容器的工作原理基于依赖注入(Dependency Injection,DI),即将一个对象的依赖关系由外部容器管理,而不是由对象自己管理。在Spring中,IoC容器负责对象的创建、初始化、销毁以及依赖关系的注入等工作。

IoC容器的实现有两种主要形式:

  • BeanFactory:是Spring IoC容器的最基本形式,适用于简单应用。它只负责管理Bean的实例化和基本配置。
  • ApplicationContext:是BeanFactory的一个更高级的扩展,提供了更多的功能,如国际化支持、事件传播、AOP支持等。通常,开发者会选择使用ApplicationContext。

3. IoC容器的配置

在Spring中,IoC容器通过配置文件来定义和管理Bean。Bean是Spring中的基本对象,它们代表了系统中的一个功能模块。每个Bean都会有一个唯一的标识符,可以通过这个标识符从容器中获取到该Bean的实例。

3.1 基本的IoC容器配置

Spring IoC容器的配置文件通常是一个XML文件,文件中定义了系统所需要的Bean及其依赖关系。下面是一个简单的配置示例:

<!-- applicationContext.xml -->
<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"><!-- 定义一个Bean --><bean id="messageService" class="com.example.MessageServiceImpl" /><!-- 定义另一个Bean,并注入第一个Bean --><bean id="messageProcessor" class="com.example.MessageProcessor"><property name="messageService" ref="messageService" /></bean>
</beans>

在上述配置中,我们定义了两个Bean:messageServicemessageProcessormessageProcessor依赖于messageService,并通过property标签将其注入。Spring容器会自动管理这些Bean,并在需要时注入它们的依赖关系。

3.2 使用Annotation进行配置

Spring框架支持基于注解的配置方式,这使得配置文件更加简洁。在现代开发中,使用注解配置Spring IoC容器已成为主流。下面是基于注解的配置示例:

// Service接口
public interface MessageService {void sendMessage(String message, String recipient);
}// Service实现类
@Service
public class MessageServiceImpl implements MessageService {@Overridepublic void sendMessage(String message, String recipient) {System.out.println("Sending message: " + message + " to " + recipient);}
}// Client类
@Component
public class MessageProcessor {private final MessageService messageService;// 构造函数注入依赖@Autowiredpublic MessageProcessor(MessageService messageService) {this.messageService = messageService;}public void processMessage(String message, String recipient) {messageService.sendMessage(message, recipient);}
}

在上述示例中,使用了@Service@Component注解来标识Spring的Bean,并使用@Autowired注解来自动注入依赖。Spring会自动扫描类路径中的注解,自动创建Bean并管理其生命周期。

3.3 注解驱动的配置

在基于注解的配置中,通常需要使用@Configuration注解标记一个配置类,并使用@ComponentScan注解来扫描指定包中的类,以自动注册Bean:

@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {// 这里不再需要手动定义Bean,Spring会自动扫描并注册
}

然后,在主程序中,通过AnnotationConfigApplicationContext来加载这个配置类:

public class Main {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 获取beanMessageProcessor processor = context.getBean(MessageProcessor.class);processor.processMessage("Hello, World!", "user@example.com");context.close();}
}

4. IoC容器的生命周期

Spring IoC容器不仅负责Bean的创建和注入,还负责管理Bean的生命周期。每个Bean在容器中的生命周期分为以下几个阶段:

  1. 实例化(Instantiation):当容器启动时,它会根据配置文件或注解定义的类来创建Bean实例。
  2. 填充属性(Populate Properties):容器会根据配置或注解中的依赖关系将属性值注入到Bean中。
  3. 初始化(Initialization):在所有属性注入完成后,Spring会调用Bean的初始化方法(如果有的话)。例如,可以通过@PostConstruct注解或实现InitializingBean接口来定义初始化方法。
  4. 销毁(Destruction):当容器关闭时,Spring会调用Bean的销毁方法(如果有的话)。例如,可以通过@PreDestroy注解或实现DisposableBean接口来定义销毁方法。

5. IoC的优点

控制反转(IoC)为开发者提供了以下几个显著的优点:

5.1 降低了耦合度

传统的面向对象编程中,类与类之间的依赖关系是通过硬编码来实现的,导致了类之间的紧密耦合。而IoC通过将对象的创建和管理交给容器,减少了类之间的依赖,提升了系统的灵活性和可维护性。

5.2 提升了可测试性

IoC容器使得对象的依赖关系得以外部管理,这意味着在进行单元测试时,可以方便地替换或模拟依赖对象。比如,可以通过Mock对象替换实际的服务实现,从而进行单元测试。

5.3 便于扩展和维护

IoC通过将配置和依赖关系集中管理,使得系统更加模块化。当系统需求发生变化时,开发者只需修改配置或注解,而不需要修改代码中的依赖关系,从而降低了维护的复杂度。

6. 小结

控制反转(IoC)是Spring框架中的核心概念之一,它通过外部容器来管理对象的创建、初始化、销毁和依赖注入,从而降低了系统的耦合度,提升了可维护性和可扩展性。通过Spring IoC容器,开发者可以更加专注于业务逻辑的开发,而不需要关心对象的生命周期和依赖关系的管理。在下一章中,我们将继续深入探讨**依赖注入(DI)**这一与IoC密切相关的概念。

三、依赖注入(DI)

依赖注入(Dependency Injection,简称DI)是控制反转(IoC)的一种具体实现方式,它是Spring框架的核心机制之一。通过依赖注入,Spring容器能够自动管理和注入对象之间的依赖关系,而不需要开发者手动处理。依赖注入让开发者能够更专注于业务逻辑的实现,而将对象的创建和依赖关系的管理交给Spring容器,从而提高了代码的灵活性、可维护性和可测试性。

在本章中,我们将详细探讨依赖注入的工作原理、常见的注入方式、以及如何在Spring应用中使用依赖注入。

1. 依赖注入的定义

依赖注入(DI)是控制反转的一种形式,它指的是对象的依赖关系(如依赖其他服务或资源)不是由对象自己负责创建的,而是由外部容器负责注入。当一个对象依赖于另一个对象时,Spring容器会根据配置自动为对象注入所需的依赖,而不需要开发者显式地去创建这些依赖。

简单来说,依赖注入就是通过“注入”方式将一个对象的依赖传递给它,而不是让对象自己去创建或查找这些依赖。依赖注入不仅减少了对象之间的耦合度,还使得类的职责更加单一、清晰,并且使得单元测试更加容易。

2. 依赖注入的工作原理

依赖注入的工作原理非常简单,基本流程如下:

  1. 定义依赖关系:首先,在Spring中定义好需要依赖注入的对象及其依赖关系。开发者通过配置文件或注解声明哪些对象需要依赖注入。

  2. Spring容器管理:Spring容器(例如ApplicationContext)在启动时会扫描配置文件或注解,并根据定义的依赖关系创建对象。

  3. 依赖注入:当一个对象创建时,Spring容器会根据配置自动将依赖对象注入到该对象中。

  4. 使用注入的对象:注入完成后,应用程序可以直接使用这些依赖,而无需关心依赖的创建和管理过程。

Spring通过多种方式支持依赖注入,常见的注入方式包括构造函数注入、setter方法注入和字段注入。

3. 依赖注入的方式

在Spring框架中,依赖注入主要有三种方式:构造函数注入Setter方法注入字段注入。我们将依次介绍这三种方式,并提供相关的代码示例。

3.1 构造函数注入

构造函数注入是通过类的构造函数将依赖传递给类。在Spring中,使用构造函数注入时,Spring会自动调用构造函数并将需要的依赖作为参数传入。

构造函数注入通常用于强制依赖,即被注入的依赖是必须的,没有默认值。它能确保在类实例化时就能初始化所有依赖关系,从而避免出现空指针异常。示例代码

// 服务接口
public interface MessageService {void sendMessage(String message, String recipient);
}// 实现类
public class EmailService implements MessageService {@Overridepublic void sendMessage(String message, String recipient) {System.out.println("Sending email: " + message + " to " + recipient);}
}// 客户端类
public class MessageProcessor {private MessageService messageService;// 构造函数注入public MessageProcessor(MessageService messageService) {this.messageService = messageService;}public void processMessage(String message, String recipient) {messageService.sendMessage(message, recipient);}
}

Spring配置(XML方式)

<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"><!-- 注入EmailService到MessageProcessor --><bean id="emailService" class="com.example.EmailService" /><bean id="messageProcessor" class="com.example.MessageProcessor"><constructor-arg ref="emailService" /></bean>
</beans>

在这个例子中,MessageProcessor类通过构造函数注入了MessageService依赖。Spring容器会自动注入EmailService实例。

3.2 Setter方法注入

Setter方法注入是通过类的setter方法来注入依赖。与构造函数注入不同,Setter方法注入允许在对象创建之后设置依赖项。通常,Setter方法注入用于可选的依赖关系,或者当需要为对象提供某些默认值时。示例代码

public class MessageProcessor {private MessageService messageService;// Setter方法注入public void setMessageService(MessageService messageService) {this.messageService = messageService;}public void processMessage(String message, String recipient) {messageService.sendMessage(message, recipient);}
}

Spring配置(XML方式)

<bean id="emailService" class="com.example.EmailService" />
<bean id="messageProcessor" class="com.example.MessageProcessor"><property name="messageService" ref="emailService" />
</bean>

在这个例子中,MessageProcessor类通过setMessageService方法来注入MessageService依赖。Spring容器会调用setMessageService方法来设置依赖。

3.3 字段注入(不推荐)

字段注入是通过反射直接注入字段的值,而不是通过构造函数或setter方法。尽管字段注入能够使代码更加简洁,但它不利于代码的可测试性和可维护性,因为它隐藏了依赖关系。尽量避免使用字段注入。示例代码

public class MessageProcessor {@Autowiredprivate MessageService messageService;public void processMessage(String message, String recipient) {messageService.sendMessage(message, recipient);}
}

Spring配置(XML方式)

<bean id="emailService" class="com.example.EmailService" />
<bean id="messageProcessor" class="com.example.MessageProcessor" />

在这个例子中,messageService字段通过@Autowired注解进行注入,Spring会自动查找MessageService类型的Bean并注入到该字段。

4. 依赖注入的优势

依赖注入为开发者提供了诸多优势,以下是一些主要的优点:

4.1 降低耦合度

依赖注入通过将对象的创建和依赖关系的管理从类内部转移到Spring容器,使得类之间的耦合度大大降低。每个类只需要声明自己依赖的对象,而无需关心如何创建或管理这些对象。这样,类之间的依赖关系变得更加灵活,易于扩展和维护。

4.2 提高可测试性

依赖注入使得单元测试变得更加容易,因为我们可以通过Mock对象或Stub对象来替代实际的依赖,从而进行隔离测试。开发者可以通过构造函数、Setter方法或注解来注入依赖,极大提高了代码的可测试性。

4.3 增强代码可维护性

随着项目的复杂度增加,依赖注入能够减少类之间的直接依赖关系,使得代码更加模块化,便于维护和扩展。当需求发生变化时,只需要修改配置文件或注解,而不需要更改类内部的实现,极大地降低了系统的维护成本。

5. 小结

依赖注入(DI)是Spring框架的核心功能之一,它通过外部容器来管理和注入对象之间的依赖关系,从而减少了类之间的耦合度,提升了代码的可测试性、可维护性和可扩展性。通过构造函数注入、Setter方法注入和字段注入,Spring提供了多种方式来实现依赖注入,开发者可以根据实际需求选择适合的方式。在实际开发中,依赖注入是构建高效、可扩展、易于维护的应用程序的重要手段。

四、总结

控制反转和依赖注入是Spring Framework中的两个核心概念,它们通过简化对象管理和减少类之间的耦合,提高了代码的可维护性和可测试性。Spring通过IoC容器为我们提供了灵活而强大的方式来管理依赖关系,使得开发者可以更加专注于业务逻辑的实现。

相关文章:

Java大师成长计划之第20天:Spring Framework基础

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4o-mini模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 在Java开发领域&#xff0c;Spring …...

WebSocket集成方案对比

​ WebSocket集成方案对比与实战 架构选型全景图 #mermaid-svg-BEuyOkkoP6cFygI0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BEuyOkkoP6cFygI0 .error-icon{fill:#552222;}#mermaid-svg-BEuyOkkoP6cFygI0 .er…...

新能源汽车电池加热技术:传统膜加热 vs. 脉冲自加热

在新能源汽车的普及过程中&#xff0c;低温环境下的电池性能一直是影响用户体验的关键问题。当温度低于0C时&#xff0c;锂电池的内阻增大&#xff0c;充放电效率下降&#xff0c;续航缩短&#xff0c;甚至可能因低温充电导致电池损坏。 引言&#xff1a;电池低温性能衰减机理 …...

C++ 状态模式详解

状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式&#xff0c;它允许一个对象在内部状态改变时改变其行为&#xff0c;使对象看起来像是改变了其类。 核心概念 设计原则 状态模式遵循以下设计原则&#xff1a; 单一职责原则&#xff1a;将状态相关行为分离…...

1. 使用 IntelliJ IDEA 创建 React 项目:创建 React 项目界面详解;配置 Yarn 为包管理器

1. 使用 IntelliJ IDEA 创建 React 项目&#xff1a;创建 React 项目界面详解&#xff1b;配置 Yarn 为包管理器 &#x1f9e9; 使用 IntelliJ IDEA 创建 React 项目&#xff08;附 Yarn 配置与 Vite 建议&#xff09;&#x1f4f7; 创建 React 项目界面详解1️⃣ Name&#xf…...

【深度学习】目标检测算法大全

目录 一、R-CNN 1、R-CNN概述 2、R-CNN 模型总体流程 3、核心模块详解 &#xff08;1&#xff09;候选框生成&#xff08;Selective Search&#xff09; &#xff08;2&#xff09;深度特征提取与微调 2.1 特征提取 2.2 网络微调&#xff08;Fine-tuning&#xff09; …...

【node】6 包与npm

前言 目标 1 了解什么是包 2 怎么使用npm下载包 #mermaid-svg-Ur0d2uCdQeAQOJjW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Ur0d2uCdQeAQOJjW .error-icon{fill:#552222;}#mermaid-svg-Ur0d2uCdQeAQOJjW .erro…...

【C++进阶篇】多态

深入探索C多态&#xff1a;静态与动态绑定的奥秘 一. 多态1.1 定义1.2 多态定义及实现1.2.1 多态构成条件1.2.1.1 实现多态两个必要条件1.2.1.2 虚函数1.2.1.3 虚函数的重写/覆盖1.2.1.4 协变1.2.1.5 析构函数重写1.2.1.6 override和final关键字1.2.1.7 重载/重写/隐藏的对⽐ 1…...

计算机网络|| 路由器和交换机的配置

一、实验目的 1. 了解路由器和交换机的工作模式和使用方法&#xff1b; 2. 熟悉 Cisco 网络设备的基本配置命令&#xff1b; 3. 掌握 Cisco 路由器的基本配置方式及配置命令&#xff1b; 4. 掌握路由器和交换机的基本配置与管理方法。 二、实验环境 1. 运行 Windows 操作…...

图形化编程如何从工具迭代到生态重构?

一、技术架构的范式突破 在图形化编程领域&#xff0c;技术架构的创新正在重塑行业格局。iVX 作为开源领域的领军者该平台通过图形化逻辑设计&#xff0c;将传统文本编程需 30 行 Python 代码实现的 "按钮点击→条件判断→调用接口→弹窗反馈" 流程&#xff0c;简化…...

歌曲《忘尘谷》基于C语言的歌曲调性检测技术解析

引言 在音乐分析与数字信号处理领域&#xff0c;自动检测歌曲调性是一项基础且关键的任务。本文以C语言为核心&#xff0c;结合音频处理库&#xff08;libsndfile&#xff09;和快速傅里叶变换库&#xff08;FFTW&#xff09;&#xff0c;探讨如何实现调性检测&#xff0c;并通…...

Spring Boot 使用Itext绘制并导出PDF

最终效果 其实可以加分页&#xff0c;但是没有那么精细的需求&#xff0c;所以我最后就没有加&#xff0c;有兴趣的可以尝试下。 项目依赖 <!-- Spring Boot 版本有点老 --> <spring-boot.version>2.3.12.RELEASE</spring-boot.version><!-- 依…...

医学影像处理与可视化:从预处理到 3D 重建的技术实践

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...

用 openssl 测试 tls 连接

以 baidu 为例&#xff0c;命令行为&#xff1a; openssl s_client -tlsextdebug -connect baidu.com:443 得到的输出为&#xff1a; CONNECTED(00000003) TLS server extension "renegotiation info" (id65281), len1 0000 - 00 …...

Matlab 汽车制动纵向动力学模型和PID控制

1、内容简介 Matlab 228-汽车制动纵向动力学模型和PID控制 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

重塑JavaScript原生功底=>【构造函数篇】

概念&#xff1a;用于创建对象的函数称之为构造函数 作用&#xff1a;构造函数在 JavaScript 中是用来创建对象的最根本操作。 语法&#xff1a;当一个函数通过 new 关键字 来调用的话&#xff0c;那么这个函数就是一个构造函数。 场景&#xff1a;构造函数是专门用来创建对象…...

从0到1:Python机器学习实战全攻略(8/10)

摘要&#xff1a;通过本文的学习&#xff0c;我们深入探索了 Python 机器学习从入门到实战的精彩世界。从 Python 在机器学习领域的独特优势&#xff0c;到机器学习的核心概念&#xff0c;再到各种强大工具库的应用&#xff0c;以及实战项目的完整演练&#xff0c;我们逐步揭开…...

[计算机网络]网络层

文章目录 408考研大纲IPV4数据报格式协议: IPv4 地址DHCP协议IP组播 408考研大纲 IPV4数据报格式 协议: 1:ICMP IPv4 地址 特殊IP 网络号全1又称直接广播地址&#xff0c;32位全1又称受限广播地址 因为255.255.255.255只能在本网络内广播&#xff0c;路由器不许通过它&…...

华为行业认证是什么?如何考取华为行业认证?

据IDC预测&#xff0c;2027年全球数字化转型市场规模将突破3.4万亿美元&#xff0c;而中国将成为增长最快的市场之一。然而&#xff0c;85%的企业在转型中面临核心人才短缺的困境&#xff0c;尤其缺乏兼具技术能力与行业洞察的复合型人才&#xff01; 讯方技术作为华为授权培训…...

Kotlin与Qt跨平台框架深度解析:业务逻辑共享与多语言集成

简介 Kotlin Multiplatform和Qt作为两大主流跨平台开发框架,各自在技术生态和应用场景上展现出独特优势。Kotlin Multiplatform专注于业务逻辑的跨平台共享,通过Kotlin语言的统一特性实现高达80%的代码复用率,特别适合移动应用和Web服务的业务逻辑开发。而Qt则凭借其强大的…...

基于LNMP架构的个人博客系统部署

一、项目概述 本项目旨在通过两台服务器&#xff08;Server-Web和Server-NFS-DNS&#xff09;搭建一个基于LNMP&#xff08;Linux、Nginx、MySQL、PHP&#xff09;架构的个人博客系统。通过域名访问自建网站&#xff0c;同时实现资源文件的共享和DNS解析功能。 二、服务器配置…...

Python训练打卡Day21

常见的降维算法&#xff1a; # 先运行预处理阶段的代码 import pandas as pd import pandas as pd #用于数据处理和分析&#xff0c;可处理表格数据。 import numpy as np #用于数值计算&#xff0c;提供了高效的数组操作。 import matplotlib.pyplot as plt #用于绘…...

PostgreSQL 序列(Sequence) 与 Oracle 序列对比

PostgreSQL 序列(Sequence) 与 Oracle 序列对比 PostgreSQL 和 Oracle 都提供了序列(Sequence)功能&#xff0c;但在实现细节和使用方式上存在一些重要差异。以下是两者的详细对比&#xff1a; 一 基本语法对比 1.1 创建序列 PostgreSQL: CREATE [ { TEMPORARY | TEMP } |…...

直播:怎样用Agentic AI搭建企业AI应用?5.24日,拆解新一代“智能客服系统”案例

2025 DeepSeek掀起了中国企业的AI落地浪潮&#xff01; 随着应用的深入&#xff0c;AI的落地技术正在快速演化。 3月&#xff0c;Manus一夜爆火&#xff0c;让AI Agent更加引人关注。 从生成式AI&#xff0c;到Agentic AI&#xff08;代理式AI&#xff09;。 AI正在从只能生…...

《Asp.net Mvc 网站开发》复习试题

一.选择题(注:每题2分,共 54分,只能在下列表格中,填写每个题目相应的正确字母选项) 01: 02: 03: 04: 05: 06: 07: 08: 09: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26&#xff1a; :27&#xff1a; 1. Mvc让软件…...

算法题(145):货仓选址

审题&#xff1a; 本题需要我们找出距离之和的最小值 思路&#xff1a; 方法一&#xff1a;贪心 贪心策略&#xff1a;将货仓建立在所有商店的中间可以达到距离之和最小 因为每家商店都需要接收一车商品&#xff0c;所以这里的距离之和指的是从货仓到每一家商店的路线的距离之和…...

✅ TensorRT Python 安装精简流程(适用于 Ubuntu 20.04+)

安装 TensorRT Python 轮子的步骤 确保 pip 和 wheel 模块已更新并安装&#xff1a; 参考链接 python3 -m pip install --upgrade pip python3 -m pip install wheel 1. 确认环境要求 Python&#xff1a;版本 3.8 - 3.13 OS&#xff1a;Ubuntu 20.04 或 Windows 10 CPU&a…...

MYSQL 全量,增量备份与恢复

目录 一 数据备份的重要性 1 数据备份的重要性 2 数据库备份类型 2.1 从物理与逻辑的角度分类 2.2. 从数据库的备份策略角度分类从数据库的备份策略角度,数据库的备份可分为完全备份、差异备份和增量备份。 3 常见的备份方法 3.1 物理冷备份 物理冷备份时需要在数据库处…...

10. Spring AI PromptTemplate:从模板到高级技巧

1、前言 如果学到了这里,相信大部分人对Prompt并不陌生了。 在 Spring AI 的世界里,与强大的语言模型进行交互的基石便是 Prompt(提示语)。它不仅仅是你输入给 AI 的一段文本,更是你与智能对话的桥梁,是你唤醒模型潜能的关键指令。理解 Prompt 的本质、构建原则以及在 …...

基于OpenCV的人脸识别:Haar级联分类器

文章目录 引言一、环境准备二、代码实现1. 图像加载与预处理2. 加载Haar级联分类器3. 人脸检测核心参数详解4. 结果显示与标注 三、效果优化建议四、完整代码五、总结 引言 本文将带你一步步实现一个简单但实用的人脸检测程序&#xff0c;使用Python和OpenCV库。 一、环境准备…...

Git安装教程及常用命令

1. 安装 Git Bash 下载 Git 安装包 首先&#xff0c;访问 Git 官方网站 下载适用于 Windows 的 Git 安装包。 安装步骤 启动安装程序&#xff1a;双击下载的 .exe 文件&#xff0c;启动安装程序。选择安装选项&#xff1a; 安装路径&#xff1a;可以选择默认路径&#xff0…...

【PmHub后端篇】Skywalking:性能监控与分布式追踪的利器

在微服务架构日益普及的当下&#xff0c;对系统的性能监控和分布式追踪显得尤为重要。本文将详细介绍在 PmHub 项目中&#xff0c;如何使用 Skywalking 实现对系统的性能监控和分布式追踪&#xff0c;以及在这过程中的一些关键技术点和实践经验。 1 分布式链路追踪概述 在微服…...

ChromeDriver 技术生态与应用场景深度解析

ChromeDriver 技术生态与应用场景深度解析 随着 Web 自动化测试、运维和数据采集需求的不断增长&#xff0c;ChromeDriver 及其相关技术栈在各行业中扮演着举足轻重的角色。本文将从技术选型、语言适配、典型场景、技术延伸等维度&#xff0c;结合最新行业趋势与实践经验&…...

链表面试题6之回文结构

经过前几道题的铺垫&#xff0c;那么我们也是来到了链表的第六关。这也是一道非常经典的题目。 目录 逆置法 数组法 那么对于这道题目&#xff0c;我们要判断回文结构&#xff0c;实际上就是判断链表对不对称。这种类型的题目我们好像在哪里见过&#xff0c;对了&#xff0c…...

ASP.NET Core Identity框架使用指南

文章目录 前言一、核心功能二、核心组件三、使用1&#xff09;创建项目2&#xff09;安装必要 NuGet包3&#xff09;配置数据库连接字符串4&#xff09;用户与角色实体定义4&#xff09;配置数据库上下文5&#xff09; 注册服务6&#xff09;数据库迁移与初始化7&#xff09;用…...

Hugging Face推出了一款免费AI代理工具,它能像人类一样使用电脑

Hugging Face推出了一款免费AI代理工具&#xff0c;它能像人类一样使用电脑。 这款工具名为Open Computer Agent&#xff08;开放计算机代理&#xff09;&#xff0c;可模拟真实的电脑操作。 无需安装&#xff0c;在浏览器中即可运行。 以下是一些信息&#xff1a; - Open C…...

一.Gitee基本操作

一.初始化 1.git init初始化仓库 git init 用于在当前目录下初始化一个本地 Git 仓库&#xff0c;让这个目录开始被 Git 跟踪和管理。 生成 .git 元数据目录&#xff0c;从而可以开始进行提交、回退、分支管理等操作。 2.git config user.name/user.email配置本地仓库 # 设置…...

24、DeepSeek-V3论文笔记

DeepSeek-V3论文笔记 **一、概述****二、核心架构与创新技术**0.汇总&#xff1a;1. **基础架构**2. **创新策略** 1.DeepSeekMoE无辅助损失负载均衡DeepSeekMoE基础架构无辅助损失负载均衡互补序列级辅助损失 2.多令牌预测&#xff08;MTP&#xff09;1.概念2、原理2.1BPD2.2M…...

神经网络初步学习——感知机

一、前言 神经网络&#xff0c;顾名思义&#xff0c;它与我们大脑生物学里面讲到的神经元有关联。前辈们在研究早期人工智能的时候&#xff0c;就开始过我们的“交叉融合”&#xff0c;他们思考能不能把我们的人工智能的学习模式改造成我们人脑中神经元之间的学习方式——于是乎…...

在Text-to-SQL任务中应用过程奖励模型

论文标题 Reward-SQL: Boosting Text-to-SQL via Stepwise Reasoning and Process-Supervised Rewards 论文地址 https://arxiv.org/pdf/2505.04671 代码地址 https://github.com/ruc-datalab/RewardSQL 作者背景 中国人民大学&#xff0c;香港科技大学广州&#xff0c;阿…...

Python的安装使用

一、下载Python安装包 下载python安装包&#xff0c;可以直接访问官网地址&#xff1a;https://www.python.org/downloads/ 通过页面咱们直接下载最新版本的python安装包即可&#xff0c;python3.13.3。在页面的下方也可下载安装之前的版本&#xff0c;目前咱们按最新版本安装…...

mapreduce-wordcount程序2

WordCount案例分析 给定一个路径&#xff0c;统计这个路径下所有的文件中的每一个单词的出现次数。 其中&#xff0c;需要我们去实现代码的部分是&#xff1a;map函数和reduce函数。它们各自的作用是&#xff1a; map函数的入参是kv结构&#xff0c;k是偏移量&#xff0c;v是一…...

Java 内存模型(JMM)与内存屏障:原理、实践与性能权衡

Java 内存模型&#xff08;JMM&#xff09;与内存屏障&#xff1a;原理、实践与性能权衡 在多线程高并发时代&#xff0c;Java 内存模型&#xff08;JMM&#xff09; 及其背后的内存屏障机制&#xff0c;是保障并发程序正确性与性能的基石。本文将系统梳理 JMM 的核心原理、内…...

1.6 偏导数

&#xff08;铺垫&#xff09;全导数与偏导数看似相似&#xff0c;实则对应不同维度的变化观察。理解它们的差异需要从"变量自由度"切入&#xff1a; &#xff08;核心差异解剖&#xff09; 维度偏导数全导数变量关系其他变量被强制锁定所有变量都通过中间变量关联…...

网络爬虫学习之正则表达式

开篇 本文整理自《python3 网络爬虫开发实战》的学习笔记。 笔记整理 match match是一种常用的匹配方法&#xff0c;向它传入要匹配的字符串以及正则表达式&#xff0c;就可以检测这个正则表达式是否和字符串相匹配。 match会尝试从字符串的起始位置开始匹配正则表达式&#x…...

Pytorch常用统计和矩阵运算

文章目录 常用统计函数torch.prod()求积torch.sum()求和torch.mean()求均值torch.max()求最值torch.var() 方差torch.std()标准差 常见矩阵运算矩阵乘法点积 (torch.dot)批量矩阵乘法 (torch.bmm)奇异值分解 (SVD)特征分解 (torch.eig)矩阵求逆 (torch.inverse)伪逆 (torch.pin…...

PyTorch Lightning实战 - 训练 MNIST 数据集

MNIST with PyTorch Lightning 利用 PyTorch Lightning 训练 MNIST 数据。验证梯度范数、学习率、优化器对训练的影响。 pip show lightning Version: 2.5.1.post0Fast dev run DATASET_DIR"/repos/datasets" python mnist_pl.py --output_grad_norm --fast_dev_run…...

内存泄漏系列专题分析之十一:高通相机CamX ION/dmabuf内存管理机制Camx ImageBuffer原理

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:内存泄漏系列专题分析之八:高通相机CamX内存泄漏&内存占用分析--通用ION(dmabuf)内存拆解 这一篇我们开始讲: 内存泄漏系列专题分析之十一:高通相机CamX ION/dmabuf内存管理机制Camx ImageBuf…...

MySQL-逻辑架构

MySQL服务器逻辑架构图 主要分层结构 1.连接层 功能&#xff1a;处理连接、安全认证、线程管理等 核心模块&#xff1a;连接器&#xff1a;支持不同语言&#xff08;JDBC&#xff09;与MySQL交互&#xff1b;线程连接池&#xff1a;管理线程连接&#xff0c;减少线程频繁创建…...

架构思维:通用架构模式_系统监控的设计

文章目录 引言什么是监控三大常见监控类型1. 次数监控2. 性能监控3. 可用率监控 落地监控1. 服务入口2. 服务内部3. 服务依赖 监控时间间隔的取舍小结 引言 架构思维&#xff1a;通用架构模式_从设计到代码构建稳如磐石的系统 架构思维&#xff1a;通用架构模式_稳如老狗的SDK…...