深入Apache Commons Config:管理和使用配置文件

news2024/11/19 9:30:11

第1章:引言

咱们都知道,在软件开发中,管理配置文件是一件既重要又让人头疼的事。想象一下,咱们的应用程序有一堆设置需要调整,比如数据库的连接信息、应用的端口号,或者是一些功能的开关。如果这些信息硬编码在代码里,每次改动都要重新编译整个程序,那岂不是太麻烦了?这时候,配置文件就派上用场了。它允许咱们在不修改代码的情况下,灵活地调整这些设置。

Apache Commons Config,正是这样一个强大的工具,它帮助Java开发者轻松管理应用配置。使用它,咱们可以优雅地加载、读取、写入和监控配置文件。不仅如此,它支持多种格式的配置文件,比如XML、Properties、JSON等,非常方便。小黑在这里就要给咱们详细介绍一下这个工具的魅力所在。

第2章:Apache Commons Config简介

让小黑来介绍一下Apache Commons Config是什么。它是Apache软件基金会提供的一个开源Java库,专门用于处理应用程序的配置。这个库不仅可以帮咱们处理不同格式的配置文件,还可以让咱们以统一的方式访问这些配置信息。这意味着不管配置信息是存储在Properties文件、XML文件还是数据库中,咱们都可以用相同的方式来获取这些信息。够聪明的,对吧?

让小黑来举个例子。假设咱们有一个Properties格式的配置文件,内容大概是这样的:

# application.properties
database.url=jdbc:mysql://localhost:3306/mydb
database.user=root
database.password=123456

这是一个标准的数据库连接配置。使用Apache Commons Config,小黑可以轻松地读取这些信息。看看下面这段代码:

import org.apache.commons.configuration2.Configuration;
import org.apache.commons.configuration2.builder.fluent.Configurations;

public class AppConfig {
    public static void main(String[] args) {
        Configurations configs = new Configurations();
        try {
            Configuration config = configs.properties("application.properties");
            String dbUrl = config.getString("database.url");
            String dbUser = config.getString("database.user");
            String dbPassword = config.getString("database.password");

            System.out.println("数据库URL: " + dbUrl);
            System.out.println("用户名: " + dbUser);
            System.out.println("密码: " + dbPassword);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这段代码中,小黑首先导入了必要的Apache Commons Config类。然后,创建了一个Configurations对象,它是配置操作的起点。通过调用configs.properties()方法,小黑加载了那个Properties文件。随后,就可以使用getString()方法来获取配置项的值了。

这样做的好处是显而易见的。咱们的配置信息变得更加灵活和动态,不需要重新编译代码就可以随时调整配置。而且,如果咱们的应用程序需要支持多种格式的配置文件,Apache Commons Config也能轻松应对。

第3章:安装和配置

添加Maven依赖

在项目的pom.xml文件中,咱们需要添加Apache Commons Config的依赖。像这样:

<dependencies>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-configuration2</artifactId>
        <version>2.7</version> <!-- 这里的版本号根据最新版自行调整 -->
    </dependency>
</dependencies>

加入这段代码后,Maven会在构建项目时自动下载和引入Apache Commons Config。咱们就不用操心手动管理库文件了。

基本配置文件

接下来,小黑来讲讲如何创建一个基本的配置文件。假设咱们正在开发一个Web应用,需要配置一些数据库连接的信息。咱们可以创建一个名为database.properties的文件,内容大概是这样的:

# database.properties
database.url=jdbc:mysql://localhost:3306/myapp
database.user=admin
database.password=secret

这个文件包含了连接数据库所需的基本信息:URL、用户名和密码。

加载配置文件

现在,咱们来看看如何在Java代码中加载这个配置文件。小黑先写个简单的类来演示:

import org.apache.commons.configuration2.Configuration;
import org.apache.commons.configuration2.builder.fluent.Configurations;

public class DatabaseConfig {
    public static void main(String[] args) {
        Configurations configs = new Configurations();
        try {
            // 加载配置文件
            Configuration config = configs.properties("database.properties");

            // 读取配置信息
            String dbUrl = config.getString("database.url");
            String dbUser = config.getString("database.user");
            String dbPassword = config.getString("database.password");

            // 输出配置信息
            System.out.println("数据库URL: " + dbUrl);
            System.out.println("数据库用户名: " + dbUser);
            System.out.println("数据库密码: " + dbPassword);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这段代码展示了如何使用Apache Commons Config来读取配置文件。咱们首先创建了一个Configurations对象,这是操作配置文件的起点。通过调用configs.properties()方法,咱们加载了刚才创建的database.properties文件。然后,就可以用getString()方法读取各项配置了。

第4章:核心功能解析

配置文件格式支持

Apache Commons Config支持多种格式的配置文件,比如Properties、XML、JSON等。这意味着咱们可以根据项目的需求灵活选择配置文件的格式。比如说,如果咱们需要一个XML格式的配置文件,可以这样写:

<!-- database.xml -->
<configuration>
    <property name="database.url">jdbc:mysql://localhost:3306/myapp</property>
    <property name="database.user">admin</property>
    <property name="database.password">secret</property>
</configuration>

然后在Java代码中这样加载它:

Configuration xmlConfig = configs.xml("database.xml");
String dbUrl = xmlConfig.getString("database.url");
// 其他操作与之前类似
基本读取操作

读取配置文件中的值是Apache Commons Config的基本功能。咱们不仅可以读取字符串类型的数据,还可以直接读取其他类型,比如整数、布尔值等。比如:

// 假设配置文件中有这样的项
// app.timeout=30
// app.featureEnabled=true

int timeout = config.getInt("app.timeout");
boolean isFeatureEnabled = config.getBoolean("app.featureEnabled");

System.out.println("超时时间: " + timeout);
System.out.println("功能是否启用: " + isFeatureEnabled);
数据类型转换

Apache Commons Config还提供了数据类型转换的功能。这意味着即使配置值是以字符串的形式存储的,咱们也可以轻松地将其转换为其他类型。这个功能在处理数字、布尔值等类型的配置项时特别有用。

写入和保存配置

除了读取配置,Apache Commons Config还允许咱们写入或修改配置项,并将更改保存到文件中。这在需要动态更新配置时非常有用。看看下面的例子:

FileBasedConfigurationBuilder<FileBasedConfiguration> builder =
    new FileBasedConfigurationBuilder<FileBasedConfiguration>(PropertiesConfiguration.class)
    .configure(new Parameters().properties().setFileName("database.properties"));

Configuration config = builder.getConfiguration();

// 修改配置
config.setProperty("database.user", "newUser");
config.setProperty("database.password", "newPassword");

// 保存更改
builder.save();

这段代码展示了如何修改配置文件中的值并保存这些更改。咱们首先创建了一个FileBasedConfigurationBuilder对象,指定了配置文件的类型和位置。然后,获取配置对象,修改配置项,并通过调用builder.save()来保存更改。

第5章:高级特性

层次化配置

在大型项目中,配置可能会变得非常复杂。咱们可能需要根据不同的环境(开发、测试、生产)加载不同的配置文件。Apache Commons Config提供了层次化配置的功能,使得这种情况更容易处理。比如说,咱们可以有一个基础的配置文件,然后根据不同环境叠加额外的配置。

看看下面的代码:

Configurations configs = new Configurations();
// 加载基础配置
Configuration config = configs.properties("base.properties");
// 根据环境变量加载额外的配置
String env = System.getenv("APP_ENV");
if ("development".equals(env)) {
    config = configs.properties("dev.properties");
} else if ("production".equals(env)) {
    config = configs.properties("prod.properties");
}
// 使用合并的配置
String dbUrl = config.getString("database.url");
// 其他操作

这段代码首先加载了一个基础配置文件,然后根据应用的运行环境加载额外的配置文件。这种方式可以让咱们的配置更加灵活和模块化。

组合配置

有时候,咱们可能需要从多个配置源中读取配置。Apache Commons Config允许咱们创建一个组合配置,这个配置可以包含多个单独的配置对象。例如,咱们可能有一个默认的配置文件,再加上用户自定义的配置文件。咱们可以这样做:

CompositeConfiguration compositeConfig = new CompositeConfiguration();
compositeConfig.addConfiguration(new PropertiesConfiguration("user.properties"));
compositeConfig.addConfiguration(new PropertiesConfiguration("default.properties"));

String dbUrl = compositeConfig.getString("database.url");
// 其他操作

在这个例子中,CompositeConfiguration对象首先尝试从user.properties中读取配置,如果找不到,再从default.properties中读取。

动态配置更新

在某些应用场景中,咱们可能需要在运行时动态更新配置。Apache Commons Config支持这一功能。通过使用文件监控机制,咱们可以在配置文件发生变化时自动重新加载配置。这样,应用程序可以响应配置的变化,而无需重启。

看看如何实现这个功能:

FileBasedConfigurationBuilder<FileBasedConfiguration> builder =
    new FileBasedConfigurationBuilder<FileBasedConfiguration>(PropertiesConfiguration.class)
    .configure(new Parameters().properties().setFileName("config.properties"));

PeriodicReloadingTrigger trigger = new PeriodicReloadingTrigger(builder.getReloadingController(),
                                                                null, 1, TimeUnit.MINUTES);
trigger.start();

// 在应用程序的其他部分使用 builder.getConfiguration() 获取最新配置

在这个例子中,小黑创建了一个PeriodicReloadingTrigger,它会定期检查配置文件是否有更新。如果有,它会自动重新加载配置。

第6章:实战案例

案例1:配置动态加载

想象一下,咱们正在开发一个Web应用,需要根据不同的部署环境加载相应的数据库配置。这时,动态加载配置文件就显得尤为重要了。比如,咱们可以根据环境变量来确定加载哪个配置文件。

public class DynamicConfigLoader {
    public static void main(String[] args) {
        String environment = System.getenv("APP_ENV");
        Configurations configs = new Configurations();
        try {
            Configuration config;
            if ("production".equals(environment)) {
                config = configs.properties("config-prod.properties");
            } else {
                config = configs.properties("config-dev.properties");
            }
            // 使用配置
            String dbUrl = config.getString("database.url");
            System.out.println("数据库URL: " + dbUrl);
        } catch (ConfigurationException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,根据APP_ENV环境变量的值,程序决定是加载生产环境的配置文件config-prod.properties,还是开发环境的config-dev.properties

案例2:配置变更通知

另一个常见的需求是在配置文件更改时自动更新应用程序中的配置。这在需要热更新配置的系统中尤其重要。看看下面这个例子:

public class ConfigChangeNotifier {
    public static void main(String[] args) {
        FileBasedConfigurationBuilder<FileBasedConfiguration> builder =
            new FileBasedConfigurationBuilder<FileBasedConfiguration>(PropertiesConfiguration.class)
            .configure(new Parameters().properties().setFileName("config.properties"));

        ReloadingController reloadingController = builder.getReloadingController();
        reloadingController.addEventListener(ReloadingEvent.ANY, event -> {
            try {
                Configuration config = builder.getConfiguration();
                // 处理配置变更
                String newValue = config.getString("some.config.key");
                System.out.println("配置已更新: " + newValue);
            } catch (ConfigurationException e) {
                e.printStackTrace();
            }
        });

        // 启动自动重载
        new PeriodicReloadingTrigger(reloadingController, null, 1, TimeUnit.MINUTES).start();
    }
}

这里,小黑使用了ReloadingController来监听配置文件的变更。一旦检测到文件有变化,程序就会重新加载配置,并执行相应的更新操作。

案例3:组合不同来源的配置

在一些复杂的项目中,咱们可能需要从多个来源获取配置信息。例如,一部分配置存储在文件中,另一部分可能来自环境变量或者数据库。Apache Commons Config可以轻松处理这种情况。

public class CombinedConfigExample {
    public static void main(String[] args) {
        Configurations configs = new Configurations();
        try {
            Configuration fileConfig = configs.properties("config.properties");
            EnvironmentConfiguration envConfig = new EnvironmentConfiguration();

            CompositeConfiguration compositeConfig = new CompositeConfiguration();
            compositeConfig.addConfiguration(fileConfig);
            compositeConfig.addConfiguration(envConfig);

            // 使用组合配置
            String dbUrl = compositeConfig.getString("database.url");
            String someEnvVar = compositeConfig.getString("SOME_ENV_VAR");
            System.out.println("数据库URL: " + dbUrl);
            System.out.println("环境变量值: " + someEnvVar);
        } catch (ConfigurationException e) {
            e.printStackTrace();
        }
    }
}

在这个例子中,小黑创建了一个CompositeConfiguration对象,它包含了从文件和环境变量中读取的配置。这样,咱们就可以在一个地方统一管理所有的配置信息了。

第7章:最佳实践

1. 保持配置文件简洁明了

在编写配置文件时,清晰和简洁至关重要。避免使用模糊不清的键名或过于复杂的结构。例如,如果咱们在处理数据库相关的配置,最好是这样命名:

# Good
database.url=jdbc:mysql://localhost:3306/mydb
database.user=root
database.password=123456

# Not so good
dbConnection=jdbc:mysql://localhost:3306/mydb
userForDatabase=root
pass=123456

在第一种情况下,每个配置项的含义一目了然,而第二种则不那么直观。

2. 避免硬编码

尽量避免在代码中硬编码配置值。这样做的问题在于,一旦需要更改配置,就必须重新编译和部署应用。使用Apache Commons Config,咱们可以轻松从外部文件加载配置,使得应用更加灵活。

3. 处理异常情况

读取配置文件时可能会遇到各种异常,例如文件不存在、格式错误等。咱们应该妥善处理这些异常,避免应用在启动或运行时崩溃。

try {
    Configuration config = configs.properties("config.properties");
    // 使用配置
} catch (ConfigurationException e) {
    // 异常处理逻辑
    e.printStackTrace();
}
4. 安全地处理敏感信息

如果配置文件中包含敏感信息(如数据库密码),考虑使用加密或其他机制来保护这些数据。不应该直接以明文形式存储在配置文件中。

5. 使用类型安全的读取方法

Apache Commons Config提供了多种读取配置值的方法。使用类型安全的方法可以减少运行时错误。例如,使用getInt()getBoolean()等方法,而不是将所有值都作为字符串读取。

6. 利用环境变量和系统属性

在某些情况下,咱们可以利用环境变量或系统属性来覆盖配置文件中的值。这在多环境部署时特别有用,比如开发环境和生产环境。

String dbUrl = config.getString("database.url", System.getenv("DB_URL"));

在这里,如果环境变量DB_URL被设置,它将覆盖配置文件中的database.url值。

7. 定期复查和更新配置文件

随着应用的发展,配置需求可能会发生变化。定期复查和更新配置文件,确保它们仍然符合当前的需求。

8. 使用版本控制

将配置文件放在版本控制系统中,这样可以跟踪历史更改,也便于在出现问题时回滚到早期版本。

9. 文档化配置项

对于复杂的配置文件,编写相关文档说明每个配置项的作用和预期值是非常有帮助的。这对于新加入项目的开发者来说尤其重要。

第8章:性能和限制

性能考虑

首先,咱们来谈谈性能。通常情况下,Apache Commons Config的性能对大多数应用来说是足够的。它在读取和解析配置文件时是相当高效的,特别是对于那些只在应用启动时加载一次配置的场景。但是,如果咱们需要频繁地读取或重新加载配置,那就得考虑一下性能的影响了。

例如,如果咱们的应用程序依赖于实时更新的配置数据,频繁地检查和重新加载配置文件可能会影响性能。这种情况下,咱们可能需要考虑缓存机制,或者是优化配置文件的结构,以减少不必要的性能开销。

// 示例:使用缓存来优化性能
Configuration config = new CachingConfiguration(configs.properties("config.properties"));

在这个例子中,CachingConfiguration提供了一个简单的缓存机制,可以减少频繁读取配置文件所带来的开销。

限制和局限性

接下来,谈谈限制和局限性。虽然Apache Commons Config是一个功能强大的库,但它也有一些限制。比如,它并不支持所有可能的配置文件格式。虽然常见的格式如Properties、XML和JSON都得到了支持,但对于一些更特殊的格式,比如YAML,就需要另外寻找解决方案了。

此外,Apache Commons Config在处理非常大的配置文件时可能会遇到性能问题。如果配置文件的大小超过了常规范围,解析和加载这些文件可能会消耗相当多的时间和内存资源。这种情况下,咱们可能需要考虑拆分配置文件,或者寻找更适合处理大文件的工具。

最佳实践

为了在使用Apache Commons Config时获得最佳性能,咱们应该:

  1. 适当地组织配置文件:避免创建过大或过于复杂的配置文件。
  2. 合理使用缓存:对于经常访问的配置,使用缓存可以提高性能。
  3. 优化读取频率:如果可能,减少配置文件的读取频率,比如通过使用事件触发的重新加载,而不是定时检查。

第9章:总结

Apache Commons Config的优势
  1. 多格式支持:支持Properties、XML、JSON等多种常见的配置文件格式,满足不同项目的需求。
  2. 灵活性:提供了多种配置读取和写入的方式,支持动态配置、层次化配置和组合配置等高级功能。
  3. 易于使用:简单直观的API,使得快速上手和使用变得容易。
  4. 集成友好:能够轻松集成到各种Java项目中,与其他Apache Commons库良好配合。
应用场景

Apache Commons Config非常适合那些需要灵活配置管理的Java项目。无论是小型项目,还是需要复杂配置管理的大型应用,它都是一个不错的选择。尤其是在多环境部署的场景下,它的优势更加明显。

思考角度

在选择和使用配置管理工具时,咱们需要考虑以下几个方面:

  1. 项目需求:评估项目对配置管理的具体需求,选择最适合的工具。
  2. 未来扩展:考虑项目未来的发展,选择可以轻松扩展和维护的配置管理方案。
  3. 性能要求:根据项目的性能要求,考虑配置管理工具的性能影响,并做出相应的优化。
  4. 安全性:对于涉及敏感信息的配置,考虑加密和安全访问的需求。

通过本文,咱们学习了如何使用Apache Commons Config来管理Java项目中的配置。希望这些知识能帮助大家在实际工作中更高效地处理配置相关的问题。配置管理虽然是一个基础性的话题,但它对于保证软件质量和灵活性来说是非常关键的。

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

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

相关文章

Spring高手之路-SpringBean的生命周期

目录 SpringBean的生命周期 整体介绍 详细介绍 1.实例化Bean 2.设置属性值 3.检查Aware 4.调用BeanPostProcessor的前置处理方法 5.调用InitializingBean的afterPropertiesSet方法 6.调用自定义init-method方法 7.调用BeanPostProcessor的后置处理方法 8.注册Destru…

【深入之Java进阶篇】fastjson的反序列化漏洞(详解总结)

✔️ fastjson的反序列化漏 1️⃣典型解析2️⃣拓展知识仓1️⃣AutoType2️⃣AutoType 有何错?3️⃣ 绕过checkAutotype&#xff0c;黑客与fastjson的博弈4️⃣autoType不开启也能被攻击?5️⃣利用异常进行攻击6️⃣AutoType 安全模式? 1️⃣典型解析 当我们使用fastjson进行…

ueditor富文本编辑器中图片上传地址配置以及抓取远程图片地址的配置

一&#xff1a;图片上传保存地址配置 打开文件ueditor.php,找到imagePathFormat进行修改即可 一&#xff1a;远程抓取图片配置 打开文件ueditor.config.js,找到catchRemoteImageEnable&#xff0c;取消注释即可

Unity之ShaderGraph如何实现瓶装水效果

前言 有一个场景在做效果时,有一个水瓶放到桌子上的设定,但是模型只做了个水瓶,里面是空的,所以我就想办法,如何做出来瓶中装睡的效果,最好是能跟随瓶子有液体流动的效果。 如下图所示: 水面实现 水面效果 液体颜色设置 因为液体有边缘颜色和内里面颜色,所以要分开…

strlen和sizeof的初步理解

大家好我是Beilef&#xff0c;一个美好的下我接触到编程并且逐渐喜欢。我虽然不是科班出身但是我会更加努力地去学&#xff0c;有啥不对的地方请斧正 文章目录 目录 文章目录 前言 想必大家对sizeof肯定很了解&#xff0c;那对strlen又了解多少。其实这个问题应该让不少人困扰。…

内网穿透的应用-Ubuntu安装XRDP远程桌面结合内网穿透实现远程桌面Ubuntu

文章目录 一、 同个局域网内远程桌面Ubuntu二、使用Windows远程桌面连接三、公网环境系统远程桌面Ubuntu1. 注册cpolar账号并安装2. 创建隧道&#xff0c;映射3389端口3. Windows远程桌面Ubuntu 四、 配置固定公网地址远程Ubuntu1. 保留固定TCP地址2. 配置固定的TCP地址3. 使用…

python 通过opencv及face_recognition识别人脸

效果&#xff1a; 使用Python的cv2库和face_recognition库来进行人脸检测和比对的 0是代表一样 认为是同一人。 代码&#xff1a; pip install opencv-python pip install face_recognition# 导入cv2库&#xff0c;用于图像处理 import cv2 # 导入face_recognition库&#…

【MySQL】数据库之事务

目录 一、什么是事务 二、事务的ACID是什么&#xff1f; 三、有哪些典型的不一致性问题&#xff1f; 第一种&#xff1a;脏读 第二种&#xff1a;不可重复读 第三种&#xff1a;幻读 第四种&#xff1a;丢失更新 四、隔离级别有哪些&#xff1f; &#xff08;1&#xf…

Sublime Text 4 中文汉化教程(Version: Build 4169)

Sublime Text 4汉化 1 知识小课堂1.1 sublim简介1.2 其他编辑器 2 安装过程2.1 安装Install Package Control2.2 Install Package2.3 安装工具包2.4 常用的插件2.5 安装中文包 1 知识小课堂 1.1 sublim简介 Sublime是一款代码编辑器&#xff0c;致力于为开发人员提供快速、高…

IDEA 控制台中文出现乱码问题解决

一、问题概述 请看下图 二、问题分析 IDEA控制台输出乱码一般会有三种来源&#xff1a; ① IDEA本身编码错误 ② Tomcat日志输出编码错误 ③ 项目本身原因。 终极原因&#xff1a;IDEA编码和Tomcat编码不一致&#xff0c;统一设置为UTF-8即可。 三、解决思路 修改…

双向循环链表实现C语言关键字中英翻译机 ฅ( ̳• · • ̳ฅ)

目录 1.双向循环链表的声明与定义&#xff1a; 2. 创建链表并对节点中的数据赋初值 3. 插入节点并链接 4.中英翻译 5. 小游戏的实现 6.菜单的实现 7. 释放内存 8.在主函数中用刚才定义的函数实现各种代码 输入样例&#xff1a; 实现方法&#xff1a;双向循环链表来实…

同城配送小程序解决方案

前言 同城配送小程序解决方案。 一、用户用车 用户打开小程序后发货地址自动定位到用户当前位置&#xff0c;用户可通过地址后的>号在地图上选择新的发货地址和卸货地址&#xff0c;小程序会自动规划出行线路&#xff0c;计算距离和运费价格。 用户仅用简单操作后就可以…

【网络协议】远程登录安全连接协议SSH(Secure Shell)

文章目录 什么是SSH协议&#xff1f;SSH为何是安全的&#xff1f;SSH由哪些组件构成&#xff1f;SSH可以帮助实现的功能SSH的工作原理SSH的历史版本常用的SSH工具有哪些SSH配置案例参考Windows 安装SSHUbuntu系统SSH配置Cisco Switch SSH配置华为Switch SSH配置 客户端启用SSH连…

uni-app 命令行创建

1. 首先创建项目&#xff0c;命令如下: npx degit dcloudio/uni-preset-vue#vite-ts uni-app-demo如果出现报错&#xff0c;如下图. 大概率就是没有目录C:\Users\Administrator\AppData\Roaming\npm 解决办法&#xff1a; 创建目录 C:\Users\Administrator\AppData\Roaming\n…

cpp_05_类_string类

1 类的定义 1.1 构造函数 定义&#xff1a;函数名必须与类名相同&#xff0c;且没有返回值类型 &#xff0c;连void也没有。 构造函数调用时间&#xff1a; 在定义对象的同时自动被调用&#xff0c;而且仅被调用一次&#xff1a; 1&#xff09;对象定义语句 2&#xff09;n…

20231226在Firefly的AIO-3399J开发板上在Android11下调通后摄像头ov13850

20231226在Firefly的AIO-3399J开发板上在Android11下调通后摄像头ov13850 2023/12/26 8:22 开发板&#xff1a;Firefly的AIO-3399J【RK3399】 SDK&#xff1a;rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2.ab And…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)EventLoop初始化

这个Dispatcher是一个事件分发模型&#xff0c;通过这个模型,就能够检测对应的文件描述符的事件的时候,可以使用epoll/poll/select,前面说过三选一。另外不管是哪一个底层的检测模型,它们都需要使用一个数据块,这个数据块就叫做DispatcherData。除此之外,还有另外一个部分,因为…

idea导入spring-framework异常:error: cannot find symbol

从github上clone代码spring-framework到本地后导入idea&#xff0c;点击gradle构建后控制台提示异常&#xff1a; 具体异常信息&#xff1a; /Users/ZengJun/Desktop/spring-framework/buildSrc/src/main/java/org/springframework/build/KotlinConventions.java:44: error:…

智能优化算法应用:基于侏儒猫鼬算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于侏儒猫鼬算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于侏儒猫鼬算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.侏儒猫鼬算法4.实验参数设定5.算法结果6.…

【操作系统】探究文件系统奥秘:创建proc文件系统的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;Linux专栏&#xff1a;《探秘Linux | 操作系统解密》⏰诗赋清音&#xff1a;月悬苍穹泛清辉&#xff0c;梦随星河徜徉辉。情牵天际云千层&#xff0c;志立乘风意自飞。 ​ 目录 &a…