【Java万花筒】日志与性能监控:Java日志领域的掌中宝剑

2024-01-11 22:52

本文主要是介绍【Java万花筒】日志与性能监控:Java日志领域的掌中宝剑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

“日志与性能监控:Java开发者的得力助手

前言

在现代软件开发中,日志记录和性能监控是确保应用程序健康运行的不可或缺的组成部分。为了满足开发者对灵活性和性能的需求,Java 社区涌现出多个强大的库,本文将深入探讨其中几个关键的日志与性能监控库,帮助读者更好地理解它们的特性和用法。

欢迎订阅专栏:Java万花筒

文章目录

  • “日志与性能监控:Java开发者的得力助手
    • 前言
    • 1. SLF4J (Simple Logging Facade for Java)
      • 1.1 概述
      • 1.2 使用 SLF4J 记录日志
      • 1.3 与各种日志框架的集成
      • 1.4 MDC (Mapped Diagnostic Context)
        • 1.4.1 简介
        • 1.4.2 使用 MDC 记录上下文信息
        • 1.4.3 与不同日志框架的兼容性
      • 1.5 SLF4J Logger 进阶用法
        • 1.5.1 Logger 参数化日志
        • 1.5.2 日志级别的动态判断
    • 2. Logback
      • 2.1 Logback 简介
      • 2.2 配置选项
      • 2.3 Logback 中的 Appender 类型
      • 2.4 Logback 过滤器
        • 2.4.1 过滤器简介
        • 2.4.2 日志级别过滤器
        • 2.4.3 关键字过滤器
        • 2.4.4 自定义过滤器
    • 3. Micrometer (度量、监控库)
      • 3.1 Micrometer 概览
      • 3.2 使用 Micrometer 进行指标收集
      • 3.3 与监控系统的集成
      • 3.4 自定义仪表板和警报
      • 3.5 Micrometer 的标注(Tags)功能
        • 3.5.1 简介
        • 3.5.2 在指标中使用标注
        • 3.5.3 标注在监控系统中的应用
      • 3.6 Micrometer 的自定义度量指标
        • 3.6.1 自定义度量指标简介
        • 3.6.2 创建自定义度量指标
    • 4. Log4j 2
      • 4.1 Log4j 2 简介
      • 4.2 日志配置与性能优化
      • 4.3 插件和扩展功能
      • 4.4 Log4j 2 的性能优化
        • 4.4.1 异步日志记录
        • 4.4.2 级别过滤和条件日志
      • 4.5 Log4j 2 的插件和扩展
        • 4.5.1 插件机制简介
        • 4.5.2 插件的使用
    • 5. Apache Commons Logging
      • 5.1 Apache Commons Logging 简介
      • 5.2 与其他日志框架的桥接
      • 5.3 使用场景和最佳实践
      • 5.4 使用 Log4J 2 作为实际的日志实现
        • 5.4.1 集成 Log4J 2
        • 5.4.2 配置 Log4J 2 作为实际的日志实现
    • 总结

1. SLF4J (Simple Logging Facade for Java)

1.1 概述

SLF4J(Simple Logging Facade for Java)是一种为 Java 提供简单日志门面的框架。它通过提供统一的日志接口,使得应用程序可以灵活地切换底层的日志实现。SLF4J 的设计理念是将应用程序代码和具体的日志实现解耦,使得开发者可以根据需求选择不同的日志框架。SLF4J 提供了一组简单的接口,包括 Logger、LoggerFactory 等。

1.2 使用 SLF4J 记录日志

以下是一个简单的 SLF4J 使用示例,演示如何在 Java 代码中记录日志:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class MyLoggerExample {private static final Logger logger = LoggerFactory.getLogger(MyLoggerExample.class);public static void main(String[] args) {logger.info("这是一个信息日志");logger.warn("这是一个警告日志");logger.error("这是一个错误日志", new Exception("示例异常"));}
}

1.3 与各种日志框架的集成

SLF4J 可以与多种日志框架集成,包括 Logback、Log4j、Java Util Logging 等。通过选择不同的实现,可以方便地切换日志框架。

<!-- Maven 依赖示例,使用 Logback 作为底层实现 -->
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version>
</dependency>

1.4 MDC (Mapped Diagnostic Context)

1.4.1 简介

SLF4J的MDC(Mapped Diagnostic Context)是一种用于在应用程序中传递上下文信息的机制。它允许在日志记录过程中传递键值对,这些键值对与特定的线程关联。MDC对于记录与特定业务交互相关的信息非常有用,例如用户ID、请求ID等。

1.4.2 使用 MDC 记录上下文信息

以下是一个使用SLF4J的MDC记录上下文信息的例子:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;public class MDCExample {private static final Logger logger = LoggerFactory.getLogger(MDCExample.class);public static void main(String[] args) {// 在MDC中设置上下文信息MDC.put("userId", "123");MDC.put("requestId", "ABC");// 记录日志logger.info("用户执行了某个操作");// 清除上下文信息MDC.clear();}
}
1.4.3 与不同日志框架的兼容性

MDC并非SLF4J独有的特性,它在与不同的日志框架集成时同样有效。例如,在Logback中,MDC的上下文信息可以通过%X占位符输出:

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%t] %-5level [%X{userId},%X{requestId}] %logger{36} - %msg%n</pattern></encoder>
</appender>

1.5 SLF4J Logger 进阶用法

1.5.1 Logger 参数化日志

SLF4J Logger支持参数化日志,这是一种更高效的方式,尤其是在记录大量数据时。参数化日志通过占位符 {} 实现,避免了字符串拼接的开销。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class ParameterizedLoggingExample {private static final Logger logger = LoggerFactory.getLogger(ParameterizedLoggingExample.class);public static void main(String[] args) {String user = "John";int age = 30;// 参数化日志记录logger.info("User {} is {} years old", user, age);}
}
1.5.2 日志级别的动态判断

有时候,根据某些条件,我们可能需要动态地判断是否记录某个特定日志级别的日志。SLF4J提供了相应的判断方法,如isDebugEnabled()isInfoEnabled()等。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class DynamicLogLevelExample {private static final Logger logger = LoggerFactory.getLogger(DynamicLogLevelExample.class);public static void main(String[] args) {String message = "This is a debug message";// 动态判断是否记录DEBUG级别的日志if (logger.isDebugEnabled()) {logger.debug(message);}}
}

2. Logback

2.1 Logback 简介

Logback 是 SLF4J 的一个实现,是一款高效、灵活且可配置的日志框架。它支持多种 Appender 类型,可以输出日志到控制台、文件、远程服务器等目标。Logback 提供了对异步日志的支持,可用于提高日志记录的性能。

2.2 配置选项

Logback 使用 XML 配置文件进行配置,允许开发者灵活定义日志的输出格式、目标以及日志级别。以下是一个简单的 Logback 配置文件示例:

<configuration><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern></encoder></appender><root level="debug"><appender-ref ref="CONSOLE" /></root>
</configuration>

2.3 Logback 中的 Appender 类型

Logback 提供多种 Appender 类型,用于定义日志的输出目标。常见的 Appender 类型包括 ConsoleAppender、FileAppender、SocketAppender 等。以下是一个使用 FileAppender 记录日志到文件的例子:

<appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>mylog.log</file><encoder><pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern></encoder>
</appender>

2.4 Logback 过滤器

2.4.1 过滤器简介

Logback 提供了强大的过滤器机制,允许开发者在特定条件下控制是否记录某条日志。过滤器可以根据日志级别、关键字、线程等进行配置,使日志记录更为灵活和可定制。

2.4.2 日志级别过滤器

日志级别过滤器允许你根据日志的级别来控制是否记录该日志。以下是一个使用日志级别过滤器的例子:

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><encoder><pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern></encoder>
</appender>

在上述例子中,只有日志级别为ERROR的日志会被记录。

2.4.3 关键字过滤器

关键字过滤器允许你根据日志内容中是否包含特定关键字来控制是否记录该日志。以下是一个使用关键字过滤器的例子:

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><filter class="ch.qos.logback.core.filter.EvaluatorFilter"><evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator"><expression>message.contains("important")</expression></evaluator><OnMismatch>NEUTRAL</OnMismatch><OnMatch>ACCEPT</OnMatch></filter><encoder><pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern></encoder>
</appender>

在上述例子中,只有日志消息中包含关键字"important"的日志会被记录。

2.4.4 自定义过滤器

除了内置的过滤器外,Logback还允许开发者自定义过滤器。通过实现 ch.qos.logback.core.filter.Filter 接口,可以创建符合特定需求的过滤器。

import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
import ch.qos.logback.classic.spi.ILoggingEvent;public class CustomFilter extends Filter<ILoggingEvent> {@Overridepublic FilterReply decide(ILoggingEvent event) {// 自定义过滤逻辑,返回ACCEPT、NEUTRAL、DENY中的一个return FilterReply.ACCEPT;}
}

以上只是过滤器的简单介绍,通过合理配置过滤器,可以使Logback更加灵活地满足不同场景下的日志记录需求。

3. Micrometer (度量、监控库)

3.1 Micrometer 概览

Micrometer 是一款用于应用程序度量和监控的库,它支持多种监控系统,如 Prometheus、Graphite、InfluxDB 等。Micrometer 提供了一套简洁的 API,用于收集应用程序的指标数据,如内存使用、CPU 使用率等。

3.2 使用 Micrometer 进行指标收集

Micrometer 的使用非常简单,开发者只需要添加相应的依赖,并通过 Micrometer API 记录指标即可。以下是一个使用 Micrometer 记录自定义计数器的例子:

import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;public class MicrometerExample {private static final MeterRegistry registry = // 初始化 MeterRegistry 的代码;public static void main(String[] args) {Counter myCounter = Counter.builder("my.custom.counter").description("My custom counter description").register(registry);myCounter.increment();}
}

3.3 与监控系统的集成

Micrometer 提供了与多种监控系统的集成,例如 Prometheus、Graphite、InfluxDB 等。通过简单的配置,开发者可以将应用程序的指标数据导出到喜欢的监控系统中。

<!-- Maven 依赖示例,使用 Micrometer 导出到 Prometheus -->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId><version>1.7.3</version>
</dependency>

3.4 自定义仪表板和警报

Micrometer 支持创建自定义仪表板,并设置警报规则。通过这些功能,开发者可以根据应用程序的性能和健康状态制定相应的监控策略。

3.5 Micrometer 的标注(Tags)功能

3.5.1 简介

Micrometer 提供了标注(Tags)的功能,允许开发者为指标添加额外的维度信息。标注使得相同的指标可以根据不同的维度进行区分,更加灵活地满足不同场景下的监控需求。

3.5.2 在指标中使用标注

以下是一个使用 Micrometer 标注的例子,展示了如何为指标添加维度信息:

import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tags;public class MicrometerTagsExample {private static final MeterRegistry registry = // 初始化 MeterRegistry 的代码;public static void main(String[] args) {// 使用标注创建带有维度信息的计数器Counter myTaggedCounter = Counter.builder("my.tagged.counter").description("My tagged counter description").tags("environment", "production", "app", "my-app").register(registry);myTaggedCounter.increment();}
}

在上述例子中,通过使用 .tags("environment", "production", "app", "my-app") 方法,为计数器添加了两个标注,分别是 “environment: production” 和 “app: my-app”。

3.5.3 标注在监控系统中的应用

标注信息不仅仅停留在应用程序内部,还会随着指标数据一同导出到监控系统。在监控系统中,可以根据标注的维度信息更精细地查看和分析指标数据。

在 Prometheus 查询语言中,可以通过标注进行更灵活的数据筛选:

my_tagged_counter{environment="production", app="my-app"}

通过 Micrometer 的标注功能,开发者可以更细致地了解应用程序的性能特征,使监控系统更具智能化和可定制性。

3.6 Micrometer 的自定义度量指标

3.6.1 自定义度量指标简介

除了内置的度量指标外,Micrometer还允许开发者创建自定义的度量指标。这为应用程序提供了更大的灵活性,可以根据具体业务需求记录特定的度量数据。

3.6.2 创建自定义度量指标

以下是一个创建自定义计时器的例子,展示了如何使用 Micrometer 记录某个特定操作的执行时间:

import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;public class CustomTimerExample {private static final MeterRegistry registry = // 初始化 MeterRegistry 的代码;public static void main(String[] args) {// 创建自定义计时器Timer customTimer = Timer.builder("custom.operation.timer").description("Custom operation timer description").register(registry);// 记录某个特定操作的执行时间customTimer.record(() -> {// 执行需要度量的操作});}
}

通过创建自定义度量指标,开发者可以更加精细地监控应用程序的性能和行为,为系统优化和故障排查提供有力支持。

以上是 Micrometer 库的进一步拓展,通过标注功能和自定义度量指标的使用,使得 Micrometer 更适用于不同场景下的应用程序监控需求。

4. Log4j 2

4.1 Log4j 2 简介

Log4j 2 是 Apache 的一款先进的日志框架,是 Log4j 的升级版。它提供了更强大的日志功能,包括异步日志、插件支持、可插拔的架构等。Log4j 2 的性能较高,适用于大型和高并发的应用程序。

4.2 日志配置与性能优化

Log4j 2 使用 XML、JSON 或属性文件进行配置,可以灵活定义日志输出的格式、级别和目标。优化性能方面,Log4j 2 提供了异步日志记录的支持,可以显著提高日志记录的性能。以下是一个简单的 Log4j 2 配置文件示例:

<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/></Root></Loggers>
</Configuration>

4.3 插件和扩展功能

Log4j 2 支持插件系统,允许开发者扩展其功能。通过插件,可以自定义 Appender、Layout、Filter 等组件,以满足特定的日志需求。以下是一个自定义 Appender 插件的简单示例:

@Plugin(name = "MyCustomAppender", category = "Core", elementType = "appender", printObject = true)
public class MyCustomAppender extends AbstractAppender {protected MyCustomAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions) {super(name, filter, layout, ignoreExceptions);}@Overridepublic void append(LogEvent event) {// 自定义日志记录逻辑}
}

4.4 Log4j 2 的性能优化

4.4.1 异步日志记录

Log4j 2 引入了异步日志记录的支持,可以显著提高日志记录的性能。通过异步记录,应用程序可以在不阻塞主线程的情况下进行日志记录,从而减小对系统性能的影响。以下是启用异步日志的配置示例:

<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/></Root></Loggers><!-- 启用异步日志 --><AsyncLogger name="com.example" level="info" additivity="false"><AppenderRef ref="Console"/></AsyncLogger>
</Configuration>

在上述配置中,通过 <AsyncLogger> 元素启用了异步日志记录,仅对指定的日志记录器(logger)生效。

4.4.2 级别过滤和条件日志

Log4j 2 提供了更灵活的级别过滤和条件日志功能。通过条件配置,可以根据特定条件决定是否记录某个日志。以下是一个使用条件日志的例子:

<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><!-- 只记录包含关键字 "important" 的 DEBUG 日志 --><Logger name="com.example" level="debug"><AppenderRef ref="Console"/><Filters><ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/><RegexFilter regex=".*important.*" onMatch="ACCEPT" onMismatch="DENY"/></Filters></Logger></Loggers>
</Configuration>

在上述配置中,使用 <Filters> 元素配置了两个过滤器,分别是 ThresholdFilterRegexFilter,用于根据条件决定是否记录日志。

Log4j 2 的性能优化功能使其成为处理大规模日志的理想选择。通过合理配置,可以提高日志记录效率,同时满足不同场景下的需求。

4.5 Log4j 2 的插件和扩展

4.5.1 插件机制简介

Log4j 2 引入了插件机制,使得开发者可以轻松扩展其功能。插件可以用于自定义 Appender、Layout、Filter 等组件,满足特定的日志需求。以下是一个简单的自定义 Appender 插件的示例:

@Plugin(name = "MyCustomAppender", category = "Core", elementType = "appender", printObject = true)
public class MyCustomAppender extends AbstractAppender {protected MyCustomAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions) {super(name, filter, layout, ignoreExceptions);}@Overridepublic void append(LogEvent event) {// 自定义日志记录逻辑}
}
4.5.2 插件的使用

自定义插件定义完成后,可以通过配置文件进行引用和使用。以下是一个使用自定义 Appender 插件的配置示例:

<Configuration status="WARN"><Appenders><!-- 引用自定义的 Appender 插件 --><MyCustomAppender name="MyAppender" level="info"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></MyCustomAppender></Appenders><Loggers><Root level="info"><!-- 使用自定义的 Appender 插件 --><AppenderRef ref="MyAppender"/></Root></Loggers>
</Configuration>

在上述配置中,通过 <MyCustomAppender> 元素引用了自定义的 Appender 插件,并配置了相应的参数。

5. Apache Commons Logging

5.1 Apache Commons Logging 简介

Apache Commons Logging 是 Apache 组织提供的一套通用的日志抽象库。它的设计目标是为了让开发者在不同的日志实现之间切换更加容易。Apache Commons Logging 并不是直接提供日志功能,而是通过简单的接口,允许应用程序使用不同的日志实现。

5.2 与其他日志框架的桥接

Apache Commons Logging 提供了桥接机制,允许开发者在应用程序中使用 Apache Commons Logging 接口,然后通过配置选择具体的日志实现。以下是一个使用 Apache Commons Logging 的示例:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;public class CommonsLoggingExample {private static final Log logger = LogFactory.getLog(CommonsLoggingExample.class);public static void main(String[] args) {logger.info("这是一个信息日志");logger.warn("这是一个警告日志");logger.error("这是一个错误日志", new Exception("示例异常"));}
}

5.3 使用场景和最佳实践

Apache Commons Logging 适用于需要在不同的日志实现之间切换的场景。开发者可以在应用程序中使用 Apache Commons Logging 接口,并通过配置文件选择合适的日志实现。在使用 Apache Commons Logging 时,要注意避免与其他日志库的混用,以免引起冲突。

5.4 使用 Log4J 2 作为实际的日志实现

5.4.1 集成 Log4J 2

Apache Commons Logging 可以通过桥接机制集成 Log4J 2 作为实际的日志实现。在这种集成下,Log4J 2 将接管 Apache Commons Logging 的日志记录工作。以下是一个配置示例:

<!-- Maven 依赖示例,使用 Log4J 2 作为实际的日志实现 -->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.14.1</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.14.1</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-jcl</artifactId><version>2.14.1</version>
</dependency>
5.4.2 配置 Log4J 2 作为实际的日志实现

log4j2.xml 文件中配置 Log4J 2,作为 Apache Commons Logging 的实际日志实现:

<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/></Root></Loggers>
</Configuration>

在上述配置中,通过 <Root> 元素配置了默认的日志级别和输出目标。

通过将 Log4J 2 集成到 Apache Commons Logging 中,开发者可以享受 Log4J 2 强大的功能,并且仍然保持了日志抽象层的灵活性。

总结

通过本文的探究,读者对日志与性能监控库有了更深刻的理解。了解了SLF4J、Logback、Micrometer、Log4j 2以及Apache Commons Logging这些库的基本概念和使用方法,读者将更好地应对日志记录和性能监控的挑战。

这篇关于【Java万花筒】日志与性能监控:Java日志领域的掌中宝剑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/595955

相关文章

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法