Spring Boot 2.7.0 自定义配置属性(四)

背景

你是否在项目中遇到过磁盘路径、服务器的ip地址、秘钥字符串等属性写在代码中。当项目部署在服务器上发现路径需要修改,ip需要修改,秘钥更改,这时我们只能先修改好代码,然后在重新打包后发布。那么,为什么不把他们这类常量写在配置文件中呢。这样部署在服务器上后,我们仅需要告知运维人员如何修改配置文件即可。免去发布版本的问题,也可以将开发环境、生产环境、测试环境中的相关配置有效分开。

什么是自定义属性

在spring boot 中,我们通过读取application.properties中的属性来初始化项目。例如项目名称,端口号,数据库的地址等。我们将自己需要使用的属性写在一个拓展的配置文件application-config.properties中,这样方便我们区分系统配置或是自定义配置。

本教程使用如下版本

spring boot 2.7.0

创建项目

新建一个spring boot 项目。可以通过我之前的教程创建一个空项目。

Spring Boot 新手入门

编辑pom文件

在idea中新建一个maven项目后,首先需要在pom文件中引入如下依赖。

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
        <relativePath/>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>spring-boot-properties-demo</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

不要忘记重新加载一下依赖,防止找不到jar包!依次点击maven,项目名称=》右键=》Reimport

目录结构

建立好如下图的包及文件目录结构,具体如下:

在这里插入图片描述

编写自定义属性文件

在application-config.properties文件中编写属性,这里我们有几个测试属性。

#文件路径
file_path=C:\\9\\0
#文件最大大小
file_max=1024
#上传地址
upload_url=http://localhost:8085/
#是否开启测试
file_test=0

编写测试类

在 MainStarter 类中编写读取配置文件的相关测试代码:

package com.study;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;

@SpringBootApplication
@RestController
@Configuration
@PropertySource(value = {"classpath:config/application-config.properties","file:config/application-config.properties"},encoding = "utf-8", ignoreResourceNotFound = true)
public class MainStarter {

    @Value("${file_path}")
    private String filePath;
    @Value("${file_max}")
    private Integer fileMax;
    @Value("${upload_url}")
    private String uploadUrl;
    @Value("${file_test}")
    private Integer fileTest;

    @RequestMapping("getConf")
    public Map<String, Object> getConf(){
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("filePath", filePath);
        map.put("fileMax", fileMax);
        map.put("uploadUrl", uploadUrl);
        map.put("fileTest", fileTest);
        return map;
    }

    public static void main(String[] args) {
        SpringApplication.run(MainStarter.class, args);
    }
}

注意到上述文件中的@Configuration @PropertySource @Value注解 。Configuration是告诉spring boot这是一个配置类。@PropertySource是注解类,这里会优先读取相对文件的conf目录下的该文件,如果没有则使用classpath的conf目录下的该文件。@Value 会将我们自定义的属性和变量进行绑定。通过该变量即可读取到配置属性的值。getConf是我们的测试接口,用于读取配置内容。

测试

右键运行MainStarter类。观察控制台输出如下,观察项目正常启动:

在这里插入图片描述

打开浏览器,输入如下地址进行接口测试,选择一个查询数据的接口:

http://localhost:18080/getConf

结果如下

在这里插入图片描述

正常情况下只需要将相关的配置写在需要使用的类中加入@Configuration @PropertySource @Value 这三个注解,并配置好相关的变量即可。

在项目打包后,优先读取 jar包同一级的config下的application-config.properties。如果需要修改,只需要修改改文件即可。

打包后文件结构application-config.properties放入config文件夹内即可

在这里插入图片描述

写在最后

开源是一种美德,尽早加入开源社区,共建美好生态!

<think>好的,我现在需要处理用户关于Spring Boot的技术框架的查询。首先,回顾用户之前的对话,他们之前询问了大型储能电站的日志管理系统,并得到了一个详细的概要设计,其中提到了使用JavaSpring Boot的可能性。现在用户希望了解基于JavaSpring Boot技术框架,可能他们正在考虑技术选型,或者需要进一步的技术细节来实施之前的日志管理系统。 用户可能是开发人员或系统架构师,负责储能电站系统的开发或维护。他们的深层需求可能是了解Spring Boot是否适合他们的项目,或者如何利用Spring Boot来实现之前提到的日志管理模块。他们可能希望得到Spring Boot的概述、核心特性、优势以及应用场景,以便评估其适用性。 接下来,我需要组织回答的结构,确保涵盖Spring Boot的基本概念、核心功能、优势,以及与其他技术的整合,比如在日志管理中的应用。考虑到用户之前的项目涉及日志管理,可能需要强调Spring Boot在模块化开发、快速集成数据库和安全方面的能力。 需要确保回答清晰,结构合理,使用用户容易理解的语言,避免过于技术化的术语,但也要提供足够的技术细节。可能还需要提到Spring Boot的自动配置、起步依赖、内嵌服务器等特性,这些对于快速开发和部署非常重要,特别是在大型系统中。 另外,用户可能关心Spring Boot的扩展性和维护性,尤其是在处理高并发日志写入和查询时,可以结合之前提到的性能指标,比如写入吞吐量≥5000条/秒,说明Spring Boot结合相关技术(如Spring Data JPA、Spring Security)如何满足这些需求。 最后,可能需要提供示例代码或配置片段,帮助用户更好地理解如何在Spring Boot中实现日志管理模块的功能,比如操作日志的记录、存储和查询。同时,强调Spring Boot的社区支持和生态系统,这对于长期项目维护至关重要。 总结来说,回答需要全面介绍Spring Boot,突出其优势和在日志管理系统中的实际应用,同时关联用户之前的项目需求,提供有针对性的信息,帮助用户做出技术决策。</think>以下是对Spring Boot技术框架的详细介绍,结合其在企业级应用中的典型应用场景: ### 一、框架定位 Spring Boot是基于Spring Framework的快速开发脚手架,采用"约定优于配置"的设计理念。其核心价值体现在: $$\begin{array}{|c|c|} \hline \textbf{传统Spring} & \textbf{Spring Boot} \\ \hline XML配置为主 & 自动配置优先 \\ \hline 需要手动依赖管理 & 起步依赖(starter)机制 \\ \hline 外置服务器部署 & 内嵌Tomcat/Jetty \\ \hline \end{array}$$ ### 二、核心架构 ```mermaid graph TD A[Spring Boot] --> B[自动配置] A --> C[起步依赖] A --> D[Actuator] A --> E[CLI] B --> F[条件化Bean注册] C --> G[依赖传递管理] D --> H[健康检查] ``` ### 三、关键技术特性 #### 1. 自动配置原理 通过`@EnableAutoConfiguration`注解触发,基于classpath检测自动配置组件: ```java @Configuration @ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class}) @EnableConfigurationProperties(DataSourceProperties.class) public class DataSourceAutoConfiguration { // 自动配置数据源 } ``` #### 2. 起步依赖示例 常用starter依赖关系: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- Web开发 --> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <!-- 数据库访问 --> </dependency> ``` #### 3. 配置优先级 按以下顺序覆盖配置(数字越小优先级越高): 1. 命令行参数 2. SPRING_APPLICATION_JSON 3. JNDI属性 4. Java系统属性 5. OS环境变量 6. application-{profile}.yml 7. application.yml ### 、性能优化策略 #### 1. 启动加速方案 ```java @SpringBootApplication public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class) .web(WebApplicationType.NONE) // 非Web模式 .lazyInitialization(true) // 延迟加载 .run(args); } } ``` #### 2. 内存优化指标 | 优化项 | 默认值 | 优化建议值 | |-----------------|-------------|---------------| | 堆内存(-Xmx) | 1/4物理内存 | 根据负载动态调整 | | Metaspace | 无限制 | 设置256m上限 | | 线程池大小 | 200 | 按公式计算:$$T = N_{cpu} \times U \times (1 + W/C)$$ | ### 五、企业级应用实践 #### 1. 高可用架构 ```mermaid graph LR A[客户端] --> B[API Gateway] B --> C[服务注册中心] C --> D[Service A] C --> E[Service B] D --> F[Config Server] E --> F ``` #### 2. 监控指标体系 通过`/actuator`端点暴露的监控项: - 健康检查:`/health` - 性能指标:`/metrics` - 线程转储:`/threaddump` - 环境配置:`/env` #### 3. 安全防护方案 ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/api/**").authenticated() .and() .oauth2ResourceServer().jwt(); } } ``` ### 六、扩展开发模式 #### 1. 自定义Starter 创建步骤: 1. 创建`autoconfigure`模块 2. 编写`META-INF/spring.factories` 3. 定义条件化配置类 4. 打包为可复用组件 #### 2. 插件化开发 通过`Spring Factories Loader`机制实现模块动态加载: ```properties # spring.factories org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.MyPluginConfiguration ``` ### 七、典型应用场景 1. 微服务架构中的基础服务单元 2. 快速构建RESTful API服务 3. 批处理任务调度系统 4. 物联网设备接入平台 5. 实时数据处理系统 ### 八、版本演进路线 | 版本 | 发布时间 | 重要特性 | |--------|------------|-------------------------------| | 3.2.0 | 2023.11 | 支持JDK21虚拟线程 | | 3.1.0 | 2023.05 | 增强Docker镜像构建能力 | | 2.7.0 | 2022.05 | 弃用Spring Cloud Netflix组件 | | 2.0.0 | 2018.03 | 全面支持响应式编程 | 该框架特别适合需要快速迭代的日志管理系统开发,其自动配置特性可简化数据库访问、安全控制等模块的实现,内嵌服务器机制便于部署在储能电站的本地化环境中。建议结合Spring Cloud体系构建分布式日志采集系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

y打伞的鱼y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值