Spring框架的原理及应用详解(七)

本系列文章简介:

在当今的软件开发世界中,随着应用复杂性的不断增加和技术的快速发展,传统的编程方式已经难以满足快速迭代、高可扩展性和易于维护的需求。为此,开发者们一直在寻求更加高效、灵活且易于管理的开发框架,以帮助他们应对这些挑战。Spring框架就是在这样的背景下应运而生,并凭借其独特的优势,迅速成为了Java企业级应用开发的首选框架。

Spring框架是一个开源的、轻量级的Java应用开发框架,它提供了全面的功能来支持Java应用程序的各个方面,包括控制反转(IoC)、面向切面编程(AOP)、数据访问、Web开发等。Spring框架的设计初衷是简化企业级应用开发,通过其强大的IoC容器和AOP支持,开发者可以更加灵活地组织和管理应用程序的组件,实现高内聚、低耦合的代码结构。

本系列文章旨在深入解析Spring框架的原理及应用,帮助大家全面理解和掌握Spring框架的核心技术。我们将从Spring框架的历史和概述入手,逐步深入到其各个核心模块的原理和实现方式。通过具体的应用实例和最佳实践,我们将展示如何使用Spring框架来构建高效、稳定且易于维护的Java应用程序。

在本系列文章中,我们将重点关注以下几个方面:

  1. Spring框架的核心原理:我们将详细阐述Spring框架的控制反转(IoC)和面向切面编程(AOP)的原理,以及它们如何帮助开发者更好地组织和管理应用程序的组件。
  2. Spring框架的主要模块:我们将介绍Spring框架的各个主要模块,包括Spring Core、Spring MVC、Spring Data等,并解释它们的作用和用法。
  3. Spring框架的应用实例:我们将通过具体的Java应用程序开发实例,展示如何使用Spring框架来构建Web应用程序、进行数据访问、实现安全控制等。
  4. Spring框架的最佳实践:我们将分享一些在使用Spring框架进行开发时的最佳实践,帮助读者避免一些常见的错误和问题,提高开发效率和质量。

希望本系列文章能够为大家提供一个全面而深入的Spring框架学习指南,帮助大家更好地理解和应用Spring框架,开发出更加高效、稳定且易于维护的Java应用程序。同时,我们也希望本系列文章能够激发大家对Spring框架进一步探索和学习的兴趣,共同推动Java企业级应用开发的发展。

欢迎大家订阅《Java技术栈高级攻略** 》专栏(PS:近期会涨价),一起学习,一起涨分!**

目录

一、引言

二、Spring框架的最佳实践

[2.1 遵循单一职责原则,合理划分Spring Bean的职责](#2.1 遵循单一职责原则,合理划分Spring Bean的职责)

[2.2 使用Spring Profiles进行多环境配置](#2.2 使用Spring Profiles进行多环境配置)

[2.3 利用Spring的自动装配和条件装配功能简化配置](#2.3 利用Spring的自动装配和条件装配功能简化配置)

[2.4 合理选择数据访问技术,如JPA、MyBatis等](#2.4 合理选择数据访问技术,如JPA、MyBatis等)

[2.5 使用Spring Boot Actuator进行应用程序监控和管理](#2.5 使用Spring Boot Actuator进行应用程序监控和管理)

三、总结与展望

[3.1 总结Spring框架的核心原理和优势](#3.1 总结Spring框架的核心原理和优势)

[3.2 展望Spring框架的未来发展方向和应用前景](#3.2 展望Spring框架的未来发展方向和应用前景)

四、结语


一、引言

Spring框架是一个开源的、轻量级的Java应用开发框架,旨在为Java开发人员提供一个全面且高效的解决方案来构建企业级应用。它支持各种设计模式,并通过IoC(控制反转)和AOP(面向切面编程)等核心技术,极大地简化了应用程序的开发、管理和测试过程。

本文将跟随《Spring框架的原理及应用详解(六)》的进度,继续介绍Spring框架。希望通过本系列文章的学习,您将能够更好地理解Spring框架的内部工作原理,掌握Spring框架的使用技巧,以及通过合理的设计完成最佳实践,充分发挥优化Spring框架的潜力,为系统的高效运行提供有力保障。

二、Spring框架的最佳实践

2.1 遵循单一职责原则,合理划分Spring Bean的职责

在Spring框架中,遵循单一职责原则(Single Responsibility Principle, SRP)是构建可维护、可扩展和可测试应用程序的关键。单一职责原则指出一个类(或模块、方法等)应该只有一个引起变化的原因。在Spring的上下文中,这通常意味着每个Spring Bean(组件)应该专注于一个特定的功能或业务逻辑。

以下是一些关于如何在Spring框架中遵循单一职责原则并合理划分Spring Bean职责的最佳实践:

  1. 明确职责边界
    • 在设计Spring Bean时,明确每个Bean的职责边界。一个Bean应该只做一件事,并且这件事应该被清晰地定义。
    • 避免在一个Bean中混合多个不相关的功能或业务逻辑。
  2. 使用接口
    • 为每个Bean定义清晰的接口,以明确其职责。
    • 使用接口可以使得Bean更加灵活和可重用,因为不同的实现可以轻松地替换现有的实现。
  3. 组件化
    • 将应用程序拆分成多个小的、独立的组件(Spring Bean)。
    • 每个组件应该负责一个特定的功能或业务逻辑。
    • 通过组件之间的依赖注入(DI)和消息传递来实现交互。
  4. 避免上帝类/对象
    • 上帝类(或对象)是那些承担过多职责的类,它们通常很难维护和理解。
    • 在Spring中,避免创建包含过多依赖项或承担过多功能的Bean。
  5. 利用AOP(面向切面编程)
    • 对于跨多个Bean的横切关注点(如日志记录、事务管理、安全等),可以使用AOP将它们分离到单独的切面中。
    • 这样做可以减少Bean之间的耦合度,并使它们更加专注于其核心职责。
  6. 测试
    • 编写针对每个Spring Bean的单元测试,以确保它们按预期工作。
    • 当测试失败时,检查并修复导致失败的Bean,而不是试图在多个Bean中修复问题。
  7. 使用配置文件或注解来定义Bean
    • 使用Spring的配置文件(如XML)或注解来定义和管理Bean。
    • 这使得Bean的配置更加灵活和可维护,因为你可以在不修改代码的情况下更改Bean的配置。
  8. 依赖注入(DI)
    • 使用Spring的DI功能来管理Bean之间的依赖关系。
    • 通过构造函数注入或属性注入来传递依赖项,以确保Bean之间的解耦。
  9. 遵循SOLID原则
    • SOLID原则(单一职责原则、开放封闭原则、里氏替换原则、接口隔离原则和依赖倒置原则)是面向对象设计和编程的基石。
    • 在设计Spring Bean时,遵循这些原则可以帮助你创建更加健壮和可维护的代码库。
  10. 持续重构和重构
    • 随着应用程序的发展,可能会发现某些Bean承担了过多的职责。在这种情况下,不要害怕重构代码,将功能拆分到新的Bean中。
    • 持续的重构可以帮助你保持代码的清洁和高效,同时减少长期维护的复杂性。

2.2 使用Spring Profiles进行多环境配置

在Spring框架中,使用Spring Profiles进行多环境配置是一种最佳实践,它允许开发者根据不同的环境(如开发环境、测试环境、生产环境等)来配置不同的Bean、属性和配置。以下是使用Spring Profiles进行多环境配置的最佳实践:

1. 定义Profiles

  • 配置文件定义 :在application.propertiesapplication.yml文件中,可以为每个环境创建特定的配置文件,如application-dev.propertiesapplication-test.propertiesapplication-prod.properties
  • Java类定义 :在Java配置类中,可以使用@Profile注解来定义特定Profile下的Bean配置。

2. 激活Profiles

  • spring.profiles.active属性 :在application.propertiesapplication.yml文件中,可以设置spring.profiles.active属性来指定当前激活的Profile。
  • 命令行参数 :在启动应用程序时,可以通过命令行参数--spring.profiles.active=profileName来指定激活的Profile。
  • 环境变量 :也可以通过设置环境变量SPRING_PROFILES_ACTIVE来指定激活的Profile。
  • JVM参数 :在JVM启动参数中添加-Dspring.profiles.active=profileName来指定激活的Profile。

3. 条件化Bean注册

  • 使用@Profile注解在配置类或Bean上,以指定该配置或Bean只在特定Profile下生效。

4. 条件化配置

  • application-{profile}.propertiesapplication-{profile}.yml文件中,为每个Profile定义特定的配置。

5. 最佳实践

  • 避免硬编码:不要在代码中直接引用特定的环境配置,而是通过Spring的环境抽象来访问配置。
  • 使用占位符 :在配置文件中使用占位符${property.name}来引用属性,以便在不同环境下使用不同的值。
  • 统一配置管理:将所有配置文件集中管理,确保在不同的环境中可以轻松切换和部署。
  • 版本控制:对配置文件进行版本控制,以便跟踪更改和回滚。
  • 测试:为每个环境编写测试用例,确保在不同环境下应用程序的正确性。

6. 示例

  • application.yml:定义默认配置和激活的Profile。

    spring:
    profiles:
    active: dev # 默认激活开发环境

  • application-dev.yml:定义开发环境的特定配置。

  • application-test.yml:定义测试环境的特定配置。

  • application-prod.yml:定义生产环境的特定配置。

使用这些配置文件和Spring Profiles的功能,可以轻松地管理不同环境下的应用程序配置,提高开发、测试和部署的效率。

2.3 利用Spring的自动装配和条件装配功能简化配置

Spring框架通过自动装配(Autowiring)和条件装配(Conditional Assembly)功能,极大地简化了应用程序的配置过程。以下是关于这两个功能的最佳实践,以及如何利用它们来简化配置的详细说明:

1. 自动装配(Autowiring)

1.1 概念与优势

  • 自动装配是Spring框架的一种特性,它可以根据一定的规则自动地将bean注入到容器中,无需手动配置。这有助于减少显式的配置,使代码更加简洁和易于维护。
  • 自动装配主要依赖于两种技术:反射和依赖注入。Spring框架通过反射机制动态地获取和操作类的属性和方法,根据装配规则自动注入相应的依赖。

1.2 自动装配类型

  • 类型匹配自动装配(byType):根据bean的类型进行自动装配,容器会自动将某个类型的bean注入到另一个bean的属性中。
  • 名称匹配自动装配(byName):根据bean的名称进行自动装配,容器会自动将某个特定名称的bean注入到另一个bean的属性中。
  • 构造器自动装配(constructor):通过构造器参数的类型进行自动装配,容器会自动调用匹配的构造器来实例化bean。但需要注意的是,当bean存在多个构造器时,构造方式可能会变得复杂,因此在实际应用中需要谨慎使用。

1.3 自动装配模式选择

  • 可以在XML配置文件或Java配置类中指定自动装配的模式(autowire),以选择合适的自动装配方式。

1.4 最佳实践

  • 明确依赖关系:在使用自动装配之前,需要明确bean之间的依赖关系,以确保正确的注入。
  • 避免过度依赖:过度依赖自动装配可能会导致代码难以理解和维护。在必要时,可以考虑使用显式的配置来明确依赖关系。
  • 优先选择构造器注入:构造器注入有助于确保bean在创建时就具有正确的依赖关系,并且可以避免在后续的代码执行过程中修改依赖关系。然而,当存在多个构造器时,需要谨慎使用。

2. 条件装配(Conditional Assembly)

虽然参考文章中没有直接提及条件装配的具体实现,但Spring框架中的条件装配通常是通过使用条件注解(如@Conditional)来实现的。这些注解允许开发者根据特定的条件来决定是否创建某个bean或配置某个属性。

2.1 最佳实践

  • 明确条件逻辑:在使用条件装配时,需要确保条件逻辑清晰明确,并且易于理解。这有助于避免在后续的代码维护过程中出现混淆或错误。
  • 减少复杂性:避免在条件逻辑中引入过多的复杂性。如果可能的话,将条件逻辑拆分成多个简单的条件,并分别处理它们。
  • 测试和验证:在开发和测试阶段,确保对条件装配进行充分的测试和验证。这有助于确保在不同的环境和配置下,应用程序都能正确地运行和表现。

总结

通过合理地使用Spring框架的自动装配和条件装配功能,可以极大地简化应用程序的配置过程,提高开发效率和代码质量。然而,在使用这些功能时需要注意避免过度依赖和引入过多的复杂性,以确保代码的可读性和可维护性。

2.4 合理选择数据访问技术,如JPA、MyBatis等

在Spring框架中,合理选择数据访问技术对于应用程序的性能、可维护性和开发效率至关重要。JPA(Java Persistence API)和MyBatis是两种常用的数据访问技术,每种技术都有其独特的特点和适用场景。以下是关于如何在Spring框架中合理选择数据访问技术的最佳实践:

1. JPA(Java Persistence API)

特点与优势

  • 标准化:JPA是Java EE规范的一部分,提供了统一的API和ORM(对象关系映射)规范。
  • 易于集成:与Spring框架无缝集成,支持Spring Data JPA项目,简化数据访问层开发。
  • 解耦:通过ORM实现对象与数据库的解耦,支持多种数据库,易于切换。

适用场景

  • 企业级应用:JPA在企业级应用中非常常见,特别适用于需要处理大量复杂数据、跨多个数据库或需要频繁切换数据库的应用。
  • 自动化需求高:对于需要快速开发、自动化配置和简化数据访问层操作的应用,JPA是一个很好的选择。

配置与使用

  • 定义实体类 :使用@Entity注解标记Java类为实体类,并使用@Table注解指定对应的数据库表。
  • 声明Repository接口 :继承自JpaRepository或其他相关接口,利用Spring Data JPA自动生成SQL查询语句。
  • 使用查询方法:在Repository接口中声明查询方法,Spring Data JPA会根据方法名自动生成相应的SQL查询语句。

2. MyBatis

特点与优势

  • 轻量级:MyBatis是一个轻量级的持久层框架,提供了灵活的SQL映射和Java对象映射。
  • 灵活性:支持原生SQL查询语句,允许开发人员更灵活地编写SQL查询语句。
  • 易于集成:可以与Spring框架集成,方便在Spring项目中使用MyBatis。

适用场景

  • 需要灵活控制SQL:对于需要精确控制SQL语句、进行复杂查询或优化SQL性能的应用,MyBatis是一个更好的选择。
  • 历史项目:如果项目已经使用了MyBatis或iBATIS,并且开发人员熟悉MyBatis的使用,继续使用MyBatis可以保持技术栈的一致性。

配置与使用

  • 定义Mapper接口:Mapper接口用于定义与数据库表对应的CRUD操作。
  • 编写Mapper XML文件:在Mapper XML文件中编写SQL查询语句和结果映射规则。
  • 注入Mapper:在Spring配置文件中将Mapper接口注入到相应的Service或Controller中。

总结

在选择JPA或MyBatis作为数据访问技术时,需要根据项目的具体需求、技术栈和开发人员的技能进行综合考虑。JPA适用于需要快速开发、自动化配置和跨数据库应用的企业级应用;而MyBatis则更适用于需要灵活控制SQL、进行复杂查询或优化SQL性能的应用。在实际应用中,可以根据项目需求和技术栈的特点灵活选择或组合使用这两种技术。

2.5 使用Spring Boot Actuator进行应用程序监控和管理

Spring Boot Actuator作为Spring Boot框架中的一个强大功能模块,为应用程序提供了丰富的内置端点(endpoints),用于监视应用状态、度量指标、配置信息及健康检查等,极大地便利了微服务架构下的应用管理和运维工作。以下是关于使用Spring Boot Actuator进行应用程序监控和管理的最佳实践:

1. 启用Spring Boot Actuator

  • Maven依赖 :在项目的pom.xml文件中添加Spring Boot Actuator的依赖。

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
  • Gradle依赖 (如果使用的是Gradle):在build.gradle文件中添加相应的依赖。

2. 核心端点介绍

  • /actuator/health:提供应用的健康状态概览,通常用于简单的可用性检查。
  • /actuator/info:显示应用的元数据,如构建版本、Git分支、环境变量等静态信息。
  • /actuator/metrics:收集和展示应用的各种运行时度量数据,如JVM内存使用、CPU负载、HTTP请求计数等。
  • /actuator/env:允许查看和查询当前应用的环境变量和系统属性。

3. 端点安全性

  • 敏感信息:由于某些端点可能包含敏感信息,应仔细考虑何时暴露它们。
  • 配置暴露 :可以通过在application.ymlapplication.properties配置文件中修改includeexclude属性来指定暴露哪些端点。

4. 监控与告警

  • 集成监控系统:Spring Boot Actuator可以与多种监控系统(如Prometheus、Grafana等)集成,实现实时监控和告警。
  • 自定义指标:除了内置的度量指标外,还可以根据需要自定义度量指标。

5. 远程Shell访问

  • JMX或Shell:除了HTTP端点外,Spring Boot Actuator还支持通过JMX或远程Shell访问应用的运行时信息和统计数据。

6. 扩展功能

  • 审计:提供审计功能,记录应用的访问和操作日志。
  • 线程Dump:生成线程堆栈转储,用于分析应用的线程状态。

7. 最佳实践

  • 保护敏感信息:确保不将包含敏感信息的端点暴露给未经授权的用户。
  • 监控与告警集成:将Spring Boot Actuator与监控系统集成,实现实时监控和告警,确保应用的稳定性和可用性。
  • 自定义度量指标:根据业务需求自定义度量指标,以便更好地了解应用的性能和状态。
  • 使用远程Shell进行调试:在必要时使用JMX或远程Shell访问应用的运行时信息和统计数据,进行远程调试和故障排除。

通过上述最佳实践,可以充分利用Spring Boot Actuator的功能,实现对应用程序的全面监控和管理,提高应用的稳定性和可用性。

三、总结与展望

3.1 总结Spring框架的核心原理和优势

Spring框架是Java开发中最常用的框架之一,它大大简化了企业级应用的开发。以下是Spring框架的核心原理和优势的总结:

核心原理

  1. 控制反转(IOC)
    • Spring通过IOC容器来管理对象的生命周期和依赖关系。
    • 开发者不再需要直接通过new关键字来创建对象,而是由Spring容器来负责对象的创建、配置和组装。
    • 通过配置文件或注解,开发者可以声明对象之间的依赖关系,Spring容器会在运行时自动注入这些依赖。
  2. 面向切面编程(AOP)
    • AOP允许开发者将横切关注点(如日志、事务管理等)从业务逻辑中分离出来,放到切面中统一处理。
    • Spring提供了强大的AOP支持,通过切面和通知(advice)来定义横切关注点,通过切点(pointcut)来定义这些关注点应该应用到哪些方法上。
  3. 模板方法模式
    • Spring提供了许多模板类(如JdbcTemplateRestTemplate等),这些模板类封装了底层操作的通用流程,让开发者只需要关注业务逻辑的实现。
  4. 事件驱动模型
    • Spring提供了事件驱动的机制,允许开发者在应用程序的不同部分之间传递事件。
    • 通过发布事件和监听事件,可以实现组件之间的解耦和异步通信。
  5. 数据访问抽象
    • Spring提供了JDBC模板、JPA、Hibernate等ORM框架的集成,使得数据访问变得简单和统一。
    • 通过Spring Data项目,开发者可以更方便地操作NoSQL数据库(如MongoDB、Redis等)。

优势

  1. 简化开发
    • Spring通过IOC和AOP等特性,大大简化了企业级应用的开发。
    • 开发者不再需要关注底层细节,只需要关注业务逻辑的实现。
  2. 灵活性
    • Spring支持多种配置方式(XML、Java配置、注解等),可以根据项目需求灵活选择。
    • Spring还提供了许多扩展点,允许开发者根据需要进行定制。
  3. 强大的社区支持
    • Spring拥有庞大的用户群体和活跃的社区,这意味着开发者可以获得大量的帮助和资源。
    • Spring还不断吸收新技术和最佳实践,保持其技术领先性。
  4. 良好的集成性
    • Spring与许多其他框架和库(如Struts、Hibernate、MyBatis等)都有良好的集成支持。
    • 这使得开发者可以方便地组合使用这些技术,构建出功能强大的应用。
  5. 易于测试
    • Spring提供了强大的测试支持,包括单元测试、集成测试等。
    • 通过Mock对象和依赖注入等特性,开发者可以轻松地编写可测试的代码。
  6. 可扩展性
    • Spring框架是一个可扩展的框架,开发者可以根据需要添加自定义的功能和模块。
    • Spring的模块化设计使得各个模块之间的耦合度较低,便于维护和升级。

3.2 展望Spring框架的未来发展方向和应用前景

Spring框架作为Java企业级应用开发的基石,已经在过去的十几年里发挥了巨大的作用。展望未来,Spring框架的发展方向和应用前景依然十分广阔和乐观。以下是对其未来发展方向和应用前景的展望:

一、发展方向

  1. 云原生支持:随着云计算的普及和云原生技术的崛起,Spring框架将进一步加强对云原生应用的支持。这包括容器化、微服务、服务网格、DevOps等方面的集成和优化,帮助开发者更轻松地构建、部署和管理云原生应用。
  2. 响应式编程和WebFlux:随着异步、非阻塞I/O编程的兴起,响应式编程成为了一种重要的编程范式。Spring框架已经通过WebFlux等模块提供了对响应式编程的支持,未来将继续加强和优化这一方面的功能,以满足更多实时、高并发的应用场景需求。
  3. AI和大数据集成:随着人工智能和大数据技术的快速发展,越来越多的企业开始将AI和大数据技术应用于业务中。Spring框架将加强与AI和大数据技术的集成,提供更方便、更高效的API和工具,帮助开发者更轻松地构建基于AI和大数据的应用。
  4. 安全性增强:随着网络安全威胁的不断增加,应用的安全性变得越来越重要。Spring框架将进一步加强安全性方面的功能,包括身份验证、授权、加密、审计等方面的支持,帮助开发者构建更安全、更可靠的应用。
  5. 跨平台支持:除了Java平台外,Spring框架还将加强对其他编程语言和平台的支持。例如,可以通过Kotlin等现代编程语言或Spring Native等技术来提供更高效、更轻量级的解决方案。这将有助于吸引更多开发者使用Spring框架,并推动其在不同领域的应用。

二、应用前景

  1. 企业级应用开发:Spring框架在企业级应用开发领域具有广泛的应用前景。无论是传统的Web应用、RESTful API服务还是微服务架构下的复杂应用,Spring框架都能提供全面的解决方案和支持。
  2. 云计算和云原生应用:随着云计算和云原生技术的普及,越来越多的企业将采用这些技术来构建和部署应用。Spring框架作为云原生应用的重要支持框架之一,将发挥越来越重要的作用。
  3. 互联网和移动互联网应用:在互联网和移动互联网领域,Spring框架也具有广泛的应用前景。无论是电商、社交、金融等行业的应用还是各种移动应用的后端服务,Spring框架都能提供高效、可靠的解决方案。
  4. AI和大数据应用:随着AI和大数据技术的快速发展,越来越多的企业将采用这些技术来优化业务和提高效率。Spring框架作为与AI和大数据技术紧密集成的框架之一,将帮助开发者更轻松地构建基于AI和大数据的应用。
  5. 跨领域应用:除了上述领域外,Spring框架还可以在物联网、边缘计算、区块链等新兴领域得到广泛应用。这些领域的应用往往需要处理大量的实时数据、实现高效的通信和协作等功能,而Spring框架的灵活性和可扩展性将使其在这些领域发挥重要作用。

总之,Spring框架作为Java企业级应用开发的基石和云原生应用的重要支持框架之一,将继续在未来的发展中保持领先地位,并推动更多创新和应用的诞生。

四、结语

文章至此,已接近尾声!希望此文能够对大家有所启发和帮助。同时,感谢大家的耐心阅读和对本文档的信任。在未来的技术学习和工作中,期待与各位大佬共同进步,共同探索新的技术前沿。最后,再次感谢各位的支持和关注。您的支持是作者创作的最大动力,如果您觉得这篇文章对您有所帮助,请分享给身边的朋友和同事!

相关推荐
赖龙4 分钟前
java程序打包及执行 jar命令及运行jar文件
java·pycharm·jar
U12Euphoria5 分钟前
java的runnable jar采用exe和.bat两种方式解决jre环境的问题
java·pycharm·jar
java小吕布25 分钟前
Java Lambda表达式详解:函数式编程的简洁之道
java·开发语言
NiNg_1_23427 分钟前
SpringSecurity入门
后端·spring·springboot·springsecurity
程序员劝退师_32 分钟前
优惠券秒杀的背后原理
java·数据库
java小吕布1 小时前
Java集合框架之Collection集合遍历
java
一二小选手1 小时前
【Java Web】分页查询
java·开发语言
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ1 小时前
idea 弹窗 delete remote branch origin/develop-deploy
java·elasticsearch·intellij-idea
Code成立1 小时前
《Java核心技术 卷I》用户图形界面鼠标事件
java·开发语言·计算机外设
鸽鸽程序猿1 小时前
【算法】【优选算法】二分查找算法(下)
java·算法·二分查找算法