【Java万花筒】优雅配置,从容应对:Java配置管理库深度解读

灵活应对变化:Java配置管理库全景解析

前言

在构建现代化的Java应用时,配置管理是一个至关重要的方面。精心设计的配置管理能够为应用提供灵活性、可维护性和适应性,而Java社区提供了多种优秀的配置管理库。本文将深入探讨一些主流的Java配置管理库,为开发者提供全面的了解和实际应用的指导。

欢迎订阅专栏:Java万花筒

文章目录

  • 灵活应对变化:Java配置管理库全景解析
    • 前言
    • 1. Apache Commons Configuration
      • 1.1 概述
      • 1.2 主要功能
      • 1.3 使用场景
      • 1.4 支持的配置文件格式扩展
      • 1.5 HierarchicalConfiguration的嵌套配置
      • 1.6 监听配置变更事件
    • 2. Typesafe Config
      • 2.1 概述
      • 2.2 核心特性
      • 2.3 配置文件格式支持
      • 2.4 应用示例
      • 2.5 多环境配置
      • 2.6 引入额外配置文件
      • 2.7 配置验证与默认值
    • 3. Archaius
      • 3.1 简介
      • 3.2 Netflix在配置管理中的应用
      • 3.3 动态配置的实现方式
      • 3.4 与其他Netflix库的整合
      • 3.5 动态配置的远程存储
      • 3.6 动态源的定制化
      • 3.7 使用Archaius实现动态特性开关
    • 4. Spring Boot Configuration
      • 4.1 Spring Boot中的配置管理
      • 4.2 注解驱动的配置
      • 4.3 外部化配置的支持
      • 4.4 外部化配置文件的多环境支持
      • 4.5 使用@Value注解获取配置值
      • 4.6 配置属性的条件装配
    • 5. Config4J
      • 5.1 Config4J概述
      • 5.2 配置文件的语法和格式
      • 5.3 支持的数据类型
      • 5.4 高级特性与用法
      • 5.5 支持条件语句
      • 5.6 INI格式配置文件
      • 5.7 高级特性:包含文件
    • 6. HOCON (Human-Optimized Config Object Notation)
      • 6.1 HOCON简介
      • 6.2 与JSON的关系
      • 6.3 核心语法特性
      • 6.4 在Java中的应用场景
      • 6.5 变量替换和引用
      • 6.6 数组和嵌套对象
      • 6.7 支持包含文件
    • 总结

1. Apache Commons Configuration

1.1 概述

Apache Commons Configuration是一个通用的配置管理库,为Java应用程序提供了轻松管理配置文件的功能。它支持多种配置文件格式,包括Properties文件、XML、JSON等。

1.2 主要功能

  • 读取和解析不同格式的配置文件。
  • 提供统一的配置信息获取接口。
  • 支持动态更新配置信息。

1.3 使用场景

import org.apache.commons.configuration2.Configuration;
import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
import org.apache.commons.configuration2.builder.fluent.Parameters;public class ApacheCommonsExample {public static void main(String[] args) throws Exception {Parameters params = new Parameters();FileBasedConfigurationBuilder<Configuration> builder = new FileBasedConfigurationBuilder<>(PropertiesConfiguration.class).configure(params.properties().setFile(new File("config.properties")));Configuration config = builder.getConfiguration();String username = config.getString("database.username");int port = config.getInt("server.port");System.out.println("Username: " + username);System.out.println("Port: " + port);}
}

1.4 支持的配置文件格式扩展

Apache Commons Configuration不仅仅支持常见的Properties、XML、JSON格式,还提供了对INI格式配置文件的支持。这为开发者在不同场景下选择更合适的配置文件格式提供了更多可能性。

import org.apache.commons.configuration2.INIConfiguration;
import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
import org.apache.commons.configuration2.builder.fluent.Parameters;public class ApacheCommonsINIExample {public static void main(String[] args) throws Exception {Parameters params = new Parameters();FileBasedConfigurationBuilder<INIConfiguration> builder = new FileBasedConfigurationBuilder<>(INIConfiguration.class).configure(params.ini().setFile(new File("config.ini")));INIConfiguration config = builder.getConfiguration();String sectionValue = config.getString("section1.key1");System.out.println("Section1 Key1 Value: " + sectionValue);}
}

1.5 HierarchicalConfiguration的嵌套配置

Apache Commons Configuration提供了HierarchicalConfiguration,允许用户创建具有层次结构的配置。这在处理复杂配置文件,如XML文件时尤为有用。

import org.apache.commons.configuration2.HierarchicalConfiguration;
import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
import org.apache.commons.configuration2.builder.fluent.Parameters;public class ApacheCommonsHierarchicalExample {public static void main(String[] args) throws Exception {Parameters params = new Parameters();FileBasedConfigurationBuilder<HierarchicalConfiguration> builder = new FileBasedConfigurationBuilder<>(HierarchicalConfiguration.class).configure(params.xml().setFile(new File("config.xml")));HierarchicalConfiguration config = builder.getConfiguration();String value = config.getString("database.connection.url");System.out.println("Database Connection URL: " + value);}
}

1.6 监听配置变更事件

除了静态读取配置信息外,Apache Commons Configuration还支持通过监听器实时获取配置变更事件。这使得应用程序能够在运行时动态调整配置。

import org.apache.commons.configuration2.event.ConfigurationEvent;
import org.apache.commons.configuration2.event.EventListener;
import org.apache.commons.configuration2.event.EventSource;public class ApacheCommonsEventExample {public static void main(String[] args) throws Exception {// 配置文件变更监听器EventListener<ConfigurationEvent> listener = event -> {System.out.println("Configuration changed: " + event.getPropertyName());};// 添加监听器builder.addEventListener(ConfigurationEvent.ANY, listener);// 模拟配置变更config.setProperty("new.property", "updated value");}
}

通过这些扩展,Apache Commons Configuration展现了其在处理不同配置需求和场景下的灵活性和强大功能。这使得开发者能够更加自由地选择适合其项目的配置管理方式。

2. Typesafe Config

2.1 概述

Typesafe Config是一款用于Java应用程序配置的库,强调简单性和可读性。它支持配置文件的层级结构,允许使用类似JSON的语法。

2.2 核心特性

  • 支持嵌套的配置结构。
  • 提供类型安全的配置获取方法。
  • 支持包含、继承等高级特性。

2.3 配置文件格式支持

import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;public class TypesafeConfigExample {public static void main(String[] args) {Config config = ConfigFactory.load("application.conf");String appName = config.getString("app.name");int maxConnections = config.getInt("db.maxConnections");System.out.println("App Name: " + appName);System.out.println("Max Connections: " + maxConnections);}
}

2.4 应用示例

import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;public class TypesafeConfigExample {public static void main(String[] args) {Config config = ConfigFactory.load("application.conf");AppConfig appConfig = new AppConfig(config);System.out.println("App Name: " + appConfig.getAppName());System.out.println("Max Connections: " + appConfig.getDbMaxConnections());}
}class AppConfig {private final Config config;public AppConfig(Config config) {this.config = config;}public String getAppName() {return config.getString("app.name");}public int getDbMaxConnections() {return config.getInt("db.maxConnections");}
}

2.5 多环境配置

Typesafe Config支持基于不同环境的配置文件加载,使得在不同阶段或环境中使用不同的配置信息变得简单。比如,可以使用application.dev.conf来定义开发环境的配置。

import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;public class TypesafeMultiEnvConfigExample {public static void main(String[] args) {// 指定环境String environment = "dev";Config config = ConfigFactory.load("application." + environment + ".conf");String appName = config.getString("app.name");int maxConnections = config.getInt("db.maxConnections");System.out.println("App Name: " + appName);System.out.println("Max Connections: " + maxConnections);}
}

2.6 引入额外配置文件

在实际应用中,有时需要将一些通用配置和特定配置分开管理,Typesafe Config支持通过include关键字引入额外的配置文件。

import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;public class TypesafeIncludeConfigExample {public static void main(String[] args) {Config commonConfig = ConfigFactory.load("common.conf");Config specificConfig = ConfigFactory.load("specific.conf").withFallback(commonConfig);String commonProperty = commonConfig.getString("common.property");String specificProperty = specificConfig.getString("specific.property");System.out.println("Common Property: " + commonProperty);System.out.println("Specific Property: " + specificProperty);}
}

2.7 配置验证与默认值

Typesafe Config允许为配置项定义验证规则和默认值,以确保在获取配置时能够得到期望的结果。

import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;public class TypesafeValidationExample {public static void main(String[] args) {Config config = ConfigFactory.load("application.conf");// 验证配置项存在if (!config.hasPath("app.name")) {throw new RuntimeException("Missing required configuration: app.name");}// 获取配置项,若不存在则使用默认值String appName = config.getString("app.name");int timeout = config.getInt("app.timeout", 5000);System.out.println("App Name: " + appName);System.out.println("Timeout: " + timeout);}
}

这些功能使Typesafe Config在处理多环境配置、引入额外配置文件以及配置验证与默认值方面更加灵活和强大。它适用于各种规模的Java应用,提供了一种简单而强大的配置管理解决方案。

3. Archaius

3.1 简介

Archaius是Netflix开源的配置管理库,旨在支持动态配置和灵活的配置变更。它与Netflix的其他库(如Eureka、Hystrix)良好集成,使得微服务架构中的配置管理更为便捷。

3.2 Netflix在配置管理中的应用

Netflix在微服务架构中广泛使用Archaius,以实现实时的配置更新和快速响应配置变更。

3.3 动态配置的实现方式

Archaius通过轮询、推送等方式实现动态配置,可以将配置信息存储在本地文件、数据库或远程配置服务中。

3.4 与其他Netflix库的整合

Archaius与Netflix的其他库(如Eureka、Hystrix)紧密整合,可以通过Netflix的开源平台实现全面的微服务支持。

import com.netflix.config.ConfigurationManager;
import com.netflix.config.DynamicPropertyFactory;public class ArchaiusExample {public static void main(String[] args) {ConfigurationManager.loadCascadedPropertiesFromResources("archaius.properties");// 使用动态属性获取配置值String appName = DynamicPropertyFactory.getInstance().getStringProperty("app.name", "DefaultAppName").get();int timeout = DynamicPropertyFactory.getInstance().getIntProperty("timeout", 5000).get();System.out.println("App Name: " + appName);System.out.println("Timeout: " + timeout);}
}

3.5 动态配置的远程存储

除了本地文件,Archaius还支持将配置信息存储在远程服务,例如在云端的配置服务。通过配置动态源,可以实现对远程配置的实时获取和更新。

import com.netflix.config.sources.URLConfigurationSource;
import com.netflix.config.ConfigurationManager;public class ArchaiusRemoteConfigExample {public static void main(String[] args) {// 配置远程配置服务地址String remoteConfigURL = "https://config-service.example.com/config";ConfigurationManager.getConfigInstance().addConfigurationSource(new URLConfigurationSource(remoteConfigURL));// 获取远程配置String remoteProperty = ConfigurationManager.getConfigInstance().getString("remote.property");System.out.println("Remote Property: " + remoteProperty);}
}

3.6 动态源的定制化

Archaius允许开发者定制化动态配置源,以满足特定的需求。通过实现PolledConfigurationSource接口,可以创建自定义的动态源。

import com.netflix.config.PolledConfigurationSource;
import com.netflix.config.ConfigurationManager;public class CustomConfigSourceExample {public static void main(String[] args) {// 注册自定义动态源PolledConfigurationSource customSource = new CustomPolledConfigSource();ConfigurationManager.getConfigInstance().addConfigurationSource(customSource);// 获取自定义配置String customProperty = ConfigurationManager.getConfigInstance().getString("custom.property");System.out.println("Custom Property: " + customProperty);}
}

3.7 使用Archaius实现动态特性开关

Archaius可以用于实现动态特性开关,即在运行时决定是否启用某些特性。这在微服务架构中对服务的快速调整和配置变更非常有用。

import com.netflix.config.DynamicBooleanProperty;
import com.netflix.config.DynamicPropertyFactory;public class DynamicFeatureToggleExample {public static void main(String[] args) {// 定义动态特性开关DynamicBooleanProperty featureToggle = DynamicPropertyFactory.getInstance().getBooleanProperty("feature.toggle", false);// 根据开关状态执行不同逻辑if (featureToggle.get()) {System.out.println("Feature is enabled.");// 执行特性开启时的逻辑} else {System.out.println("Feature is disabled.");// 执行特性关闭时的逻辑}}
}

Archaius通过这些特性为Java应用提供了高度的灵活性和可维护性,特别是在微服务架构中,它的动态配置管理能力成为了优秀的选择。

4. Spring Boot Configuration

4.1 Spring Boot中的配置管理

Spring Boot通过application.propertiesapplication.yml实现外部化配置,支持多种配置源,如环境变量、命令行参数等。

4.2 注解驱动的配置

使用@ConfigurationProperties注解,可以将配置文件中的属性映射到Java对象。

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@ConfigurationProperties(prefix = "app")
public class AppConfig {private String name;private int maxConnections;// 省略getter和setter
}

4.3 外部化配置的支持

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringBootConfigExample implements CommandLineRunner {@Autowiredprivate AppConfig appConfig;public static void main(String[] args) {SpringApplication.run(SpringBootConfigExample.class, args);}@Overridepublic void run(String... args) {System.out.println("App Name: " + appConfig.getName());System.out.println("Max Connections: " + appConfig.getMaxConnections());}
}

4.4 外部化配置文件的多环境支持

Spring Boot提供了多环境配置文件的支持,使得在不同环境中使用不同的配置变得更加灵活。通过创建对应环境的配置文件,可以轻松切换配置。

  • application-dev.properties 用于开发环境
  • application-prod.properties 用于生产环境
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class MultiEnvConfigExample {@Value("${app.environment}")private String environment;public void printEnvironment() {System.out.println("Environment: " + environment);}
}

4.5 使用@Value注解获取配置值

Spring Boot支持使用@Value注解直接在字段上获取配置值,这样可以方便地获取特定配置项的值。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class ValueAnnotationExample {@Value("${app.name}")private String appName;@Value("${db.maxConnections}")private int maxConnections;public void printConfigValues() {System.out.println("App Name: " + appName);System.out.println("Max Connections: " + maxConnections);}
}

4.6 配置属性的条件装配

Spring Boot支持使用条件注解,根据满足条件的情况选择性地装配配置。这在需要根据不同条件加载不同配置的场景下非常有用。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;@Configuration
public class ConditionalConfigExample {@Bean@Conditional(DevEnvironmentCondition.class)public DataSource devDataSource() {// 返回开发环境的数据源}@Bean@Conditional(ProdEnvironmentCondition.class)public DataSource prodDataSource() {// 返回生产环境的数据源}
}

Spring Boot的配置管理功能不仅仅局限于这些,还包括了事件监听、自定义配置处理等高级特性,使得在实际应用中更容易实现灵活的配置管理。

5. Config4J

5.1 Config4J概述

Config4J是一个简单而强大的Java配置文件解析库,支持多种数据类型和灵活的配置文件格式。

5.2 配置文件的语法和格式

Config4J支持XML、Properties、INI等多种配置文件格式,具有灵活的语法。

5.3 支持的数据类型

Config4J支持基本数据类型、字符串、数组等多种数据类型,使得配置文件更加灵活。

5.4 高级特性与用法

Config4J提供高级特性,如条件语句、包含文件等,可以更好地组织和管理配置文件。

import org.config4j.Configuration;
import org.config4j.ConfigurationException;
import org.config4j.ConfigurationManager;public class Config4JExample {public static void main(String[] args) throws ConfigurationException {ConfigurationManager.load("config4j.cfg");Configuration config = ConfigurationManager.getConfiguration("myConfig");String value = config.lookupString("property1");System.out.println("Property 1: " + value);}
}

5.5 支持条件语句

Config4J支持使用条件语句,根据不同的条件加载不同的配置项,使得配置文件更具灵活性。

import org.config4j.Configuration;
import org.config4j.ConfigurationException;
import org.config4j.ConfigurationManager;public class Config4JConditionalExample {public static void main(String[] args) throws ConfigurationException {ConfigurationManager.load("config4j.conditional.cfg");Configuration config = ConfigurationManager.getConfiguration("conditionalConfig");if (config.lookupBoolean("enableFeature", false)) {String featureConfig = config.lookupString("featureConfig");System.out.println("Feature Configuration: " + featureConfig);} else {System.out.println("Feature is disabled.");}}
}

5.6 INI格式配置文件

Config4J对INI格式的支持非常友好,可以轻松解析INI格式的配置文件。

import org.config4j.Configuration;
import org.config4j.ConfigurationException;
import org.config4j.ConfigurationManager;public class Config4JINIExample {public static void main(String[] args) throws ConfigurationException {ConfigurationManager.load("config4j.ini.cfg");Configuration config = ConfigurationManager.getConfiguration("iniConfig");String value = config.lookupString("section1.key1");System.out.println("Section1 Key1 Value: " + value);}
}

5.7 高级特性:包含文件

Config4J支持通过include指令引入其他配置文件,方便将配置信息进行组织和复用。

import org.config4j.Configuration;
import org.config4j.ConfigurationException;
import org.config4j.ConfigurationManager;public class Config4JIncludeExample {public static void main(String[] args) throws ConfigurationException {ConfigurationManager.load("config4j.include.cfg");Configuration config = ConfigurationManager.getConfiguration("mainConfig");String includedValue = config.lookupString("includedConfig.property");System.out.println("Included Config Property: " + includedValue);}
}

Config4J的简洁而强大的设计使得其在处理不同格式的配置文件和配置项间的复杂关系时表现出色。通过这些高级特性,Config4J为Java应用提供了更加灵活和强大的配置管理解决方案。

6. HOCON (Human-Optimized Config Object Notation)

6.1 HOCON简介

HOCON是一种人类友好的配置文件格式,与JSON类似但更具可读性和灵活性。

6.2 与JSON的关系

HOCON是JSON的超集,支持JSON的语法,同时添加了一些额外的特性,如对变量的支持。

6.3 核心语法特性

HOCON支持对象嵌套、数组、变量替换等语法特性,使得配置文件更易读且结构清晰。

6.4 在Java中的应用场景

import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;public class HOCONExample {public static void main(String[] args) {Config config = ConfigFactory.parseFile(new File("application.conf"));String appName = config.getString("app.name");int maxConnections = config.getInt("db.maxConnections");System.out.println("App Name: " + appName);System.out.println("Max Connections: " + maxConnections);}
}

6.5 变量替换和引用

HOCON支持变量替换,使得可以在配置文件中定义变量并在其他地方引用,提高了配置文件的灵活性。

import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;public class HOCONVariableExample {public static void main(String[] args) {Config config = ConfigFactory.parseFile(new File("variables.conf"));String appName = config.getString("app.name");String welcomeMessage = config.getString("app.welcomeMessage");System.out.println("App Name: " + appName);System.out.println("Welcome Message: " + welcomeMessage);}
}

6.6 数组和嵌套对象

HOCON支持数组和嵌套对象,使得配置文件可以更好地表示复杂的数据结构。

import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;public class HOCONArrayObjectExample {public static void main(String[] args) {Config config = ConfigFactory.parseFile(new File("array_object.conf"));List<String> fruits = config.getStringList("fruits");String color = config.getString("car.color");System.out.println("Fruits: " + fruits);System.out.println("Car Color: " + color);}
}

6.7 支持包含文件

HOCON支持通过include指令引入其他配置文件,方便将配置信息进行组织和复用。

import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;public class HOCONIncludeExample {public static void main(String[] args) {Config config = ConfigFactory.parseFile(new File("include.conf"));String includedValue = config.getString("includedConfig.property");System.out.println("Included Config Property: " + includedValue);}
}

HOCON的人类友好的语法和灵活性使得其在复杂配置场景下表现出色,尤其适用于需要人类直观编辑和管理的配置文件。通过这些特性,HOCON成为了一个现代化配置管理的理想选择。

总结

配置管理对于应用的可维护性和适应性至关重要。从传统的Apache Commons Configuration到支持动态配置的Netflix Archaius,再到Spring Boot的注解驱动配置和灵活的HOCON格式,每个库都有其独特之处。通过本文的学习,读者将能够选择适合其项目需求的配置管理库,并加以灵活应用。

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

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

相关文章

优秀的电机驱动MCU:MM32SPIN360C

DC-DC电源布局注意点&#xff1a; 电源模块布局布线可提前下载芯片的datasheet&#xff08;数据表&#xff09;&#xff0c;按照推荐的布局和布线进行设计。 1) 芯片电源接近原则&#xff1a; 对于为芯片提供电压的开关电源&#xff0c;应确保它尽量靠近芯片放置。这样可以避…

2024 CKS 题库 | 8、沙箱运行容器 gVisor

不等更新题库 CKS 题库 8、沙箱运行容器 gVisor Context 该 cluster 使用 containerd 作为 CRI 运行时。containerd 的默认运行时处理程序是 runc 。 containerd 已准备好支持额外的运行时处理程序 runsc (gVisor)。 Task 使用名为 runsc 的现有运行时处理程序&#xff0c;…

【打工日常】使用docker部署可视化工具docker-ui

一、docker-ui介绍 docker-ui是一个易用且轻量化的Docker管理工具&#xff0c;透过Web界面的操作&#xff0c;方便快捷操作docker容器化工作。 docker-ui拥有易操作化化界面&#xff0c;不须记忆docker指令&#xff0c;仅需下载镜像即可立刻加入完成部署。基于docker的特性&…

幻兽帕鲁新手游戏攻略分享

在幻兽帕鲁中&#xff0c;提高实力是玩家不断追求的目标。以下是一些提高实力的攻略&#xff1a; 1、升级和进化&#xff1a;通过战斗和完成任务&#xff0c;玩家可以获得经验值&#xff0c;提升自己的等级。随着等级的提升&#xff0c;玩家可以获得技能点&#xff0c;用于提升…

AGAST角点检测

一、AGAST角点检测 C #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/common/io.h> #include <pcl/visualization/pcl_visualizer.h> #include <boost/thread/thread.hpp> #include <p…

支付交易——跨境交易

摘要 老王兢兢业业经营生意多年&#xff0c;一步步从小杂货店做到现在&#xff0c;成立大型贸易公司。在做大做强的过程中&#xff0c;老王觉得国内市场已经饱和&#xff0c;竞争处处是红海。老王留意海外很多年了&#xff0c;决定走出去&#xff0c;转向海外:将国外的商品引进…

【51单片机】AD模数转换DA数模转换(江科大)

1.AD/DA介绍 AD(Analog to Digital):模拟-数字转换,将模拟信号转换为计算机可操作的数字信号 DA(Digital to Analog):数字-模拟转换,将计算机输出的数字信号转换为模拟信号 AD/DA转换打开了计算机与模拟信号的大门,极大的提高了计算机系统的应用范围,也为模拟信号数字化处理…

RestTemplate自定义设置

增加类&#xff1a;RestTemplateConfig import org.apache.http.client.HttpClient; import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy; import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; import org.apache.http.impl.client.Htt…

GB28181 2022 下联检测项

序号 检测项目 技术要求 1平台注册 (下联) 视频监控联网测试软件注册到受测平 台,并在注册到期前进行刷新注册; 宜支持注册重定向功能。 2平台注销 (下联) 视频监控联网测试软件从受测平台注 销 3平台校时 (下联) 视频监控联网测试软件获取受测平台 的时间。 4平…

Java面向对象案例之打印机对象Printer(一)

类主要结构图 抽象类&#xff1a;Printer&#xff08;打印机作为父类&#xff09;子类&#xff1a;DotMatrixPrinter&#xff08;针式打印机类&#xff09;、InkpetPrinter&#xff08;喷墨打印机类&#xff09;、LaserPrinter&#xff08;激光打印机类&#xff09;测试类&…

# Day44、动态规划(包含题目 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ )

代码随想录算法训练营第7周&#xff08;C语言&#xff09;|Day41&#xff08;动态规划&#xff09; Day44、动态规划&#xff08;包含题目 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ &#xff09; 518. 零钱兑换 II 题目描述 给定不同面额的硬币和一个总金额。写出函数来计…

【嵌入式硬件】ADC(模数转换器)

目录 1.简介 2.分类 2.1 并行比较模数转换器 2.2 逐次逼近型模数转换器

【网络安全/计算机/编程】实用小工具推荐,让你的电脑更强大

在日常的电脑使用中&#xff0c;我们可能会遇到各种各样的问题&#xff0c;比如找不到想要的音乐、不知道如何合并图片、蓝屏问题困扰等。 今天&#xff0c;我将向大家推荐几款实用的小工具&#xff0c;它们可以帮助我们更方便地解决这些问题。 首先&#xff0c;是PC洛雪音乐…

数据转换成json格式

// List<SpinfokuZD> xm GetmoreSpinfoku(id); // return JsonConvert.SerializeObject(xm); //将数据转换成json格式 return JsonConvert.SerializeObject(ds); //将数据转换成json格式 spcgjlZD spselld JsonConvert.Deseriali…

基于SSM的社区疫情防控管理系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的社区疫情防控管理系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spri…

题目 序列中删除指定数字

题目&#xff1a;有一个整数序列&#xff08;可能有重复的整数&#xff09;&#xff0c;现删除指定的某一个整数&#xff0c;输出删除指定数字之后的序列&#xff0c;序列中未被删除数字的前后位置没有发生改变。 解答&#xff1a; #include <stdio.h>void deleteNumbe…

精品springboot基于大数据技术的电商数据挖掘平台设计与实现购物商城

《[含文档PPT源码等]精品基于springboot基于大数据技术的电商数据挖掘平台设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; Java——涉及技术&#xff1a; 前端…

信息安全技术基础知识

一、考点分布 信息安全基础&#xff08;※※&#xff09;信息加密解密技术&#xff08;※※※&#xff09;密钥管理技术&#xff08;※※&#xff09;访问控制及数字签名技术&#xff08;※※※&#xff09;信息安全的保障体系 二、信息安全基础 信息安全包括5个基本要素&#…

ELAdmin 隐藏添加编辑按钮

使用场景 做了一个监控模块&#xff0c;数据都是定时生成的&#xff0c;所以不需要手动添加和编辑功能。 顶部不显示 可以使用 true 或者 false 控制现实隐藏 created() {this.crud.optShow {add: false,edit: false,del: true,download: true,reset: true}},如果没有 crea…

DNS出现问题了,怎么处理?-提供完整解决方案

DNS作用 将域名(网址)解析为IP地址 DNS的作用是将域名(网址)解析为IP地址,方便用户访问互联网。通过DNS,用户可以轻松地通过域名来获取对应的IP地址,无需记住复杂的数字串。 负载均衡 负载均衡是DNS的一种功能,它能够将访问请求转发到不同的服务器,从而实现负载均衡。…