springboot原理实战(5)-配置文件操作

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: springboot原理实战(5)-配置文件操作

目录


本篇博客主要的内容概要:

1dc618a0ed9580ce8bfa6facb208c08f.png


一.读取单个配置文件:


application.properties中自定义2个属性


local.ip=192.168.1.100
local.port=8080


@Value读取


@Component
public class Test {
    @Value("${local.ip}")
    private String ip;
    @Value("${local.port}")
    private Integer port;
    public void show(){
        System.out.println("local.ip===="+ip );
        System.out.println("local.port===="+port);
    }
}


入口中测试下:


@SpringBootApplication
public class Demo2Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Demo2Application.class, args);
        context.getBean(Test.class).show();
        context.close();
    }
}


结果显示已经读取到属性:

5d4c6812c8535adbb050f4ddf2e1bce8.png


②通过Environment的getProperty方法


修改test试下:


@Component
public class Test {
    @Autowired
    private Environment env;
    public void show(){
        System.out.println("local.ip===="+env.getProperty("local.ip") );
        System.out.println("local.ip===="+env.getProperty("local.port") );
    }
}


运行入口函数:


1dc618a0ed9580ce8bfa6facb208c08f.png

测试结果ok。

同时也可以在入口函数中使用:


@SpringBootApplication
public class Demo2Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Demo2Application.class, args);
        context.getBean(Test.class).show();
        System.out.println(context.getEnvironment().getProperty("local.ip"));
        System.out.println(context.getEnvironment().getProperty("local.port"));
        context.close();
    }
}


运行结果:

1dc618a0ed9580ce8bfa6facb208c08f.png

为什么context可以直接使用这种方式调用呢?

看下e-r图:

5d4c6812c8535adbb050f4ddf2e1bce8.png

ConfigurableApplicationContext 的上级可以找到EnvironmentCapable这个接口,该接口有获取Enviroment对象的方法,所以就可以直接使用了。

46a9d80a6e05e4e3b19d57a0ee70bcdf.png


二、配置文件的属性值操作


1.配置属性可以为空值


application.properties中让tomcat.port为空值


local.ip=192.168.1.100
local.port=8080
tomcat.port=


@Component
public class Test { 
    @Value("${tomcat.port}")
    private String tomcatPort;      
    public void show(){
        System.out.println("local.ip===="+tomcatPort );
    }
}


测试一下:


@SpringBootApplication
public class Demo2Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Demo2Application.class, args);
        context.getBean(Test.class).show();     
        context.close();
    }


运行结果:没有报错,打印空值:

1dc618a0ed9580ce8bfa6facb208c08f.png


2.配置属性设置默认值


@Component
public class Test {
    @Value("${tomcat.port:9090}")
    private String tomcatPort;
    public void show(){
        System.out.println("tomcat.port===="+tomcatPort );
    }
}


然后,properties配置文件中,删除这个属性 tomcat.port=

1dc618a0ed9580ce8bfa6facb208c08f.png

测试,已经设置了默认值9090:

5d4c6812c8535adbb050f4ddf2e1bce8.png


三、修改配置文件名称:


配置文件默认名称为:application,后缀,为properties或者yml:

如果不是这个名会报错:


怎么解决呢?


方式有2种,一种是启动参数修改,另一种哦是用@PropertySource指定。

我们先说启动参数修改的方法,注解的后面讲配置文件位置的时候一块说:


@Component
public class Test {
    @Value("${local.port}")
    private String port;
    public void show(){
        System.out.println("local.port===="+port );
    }
}


修改默认配置文件名称为app.properties:

1dc618a0ed9580ce8bfa6facb208c08f.png

启动报错,解决方式:

使用-spring.config.name来指定,只需要指定文件的名字,文件扩展名可以省略:

5d4c6812c8535adbb050f4ddf2e1bce8.png

再次运行,显示了属性值:

66ba272a0bfc97be54a5fa679e3d5482.png


四、配置配置文件位置操作


1.默认位置


默认位置在resurces的目录下,或者resources下的config目录下.


2.设置在其他位置并读取


启动方式设置,和刚才的修改配置文件名一样


我们来演示个复杂的,多个配置文件。一个在resources的其他目录下,一个在本地盘符,用启动方式设置启动,看是否可以读取到属性值:


项目中的配置文件

1dc618a0ed9580ce8bfa6facb208c08f.png

注意配置文件也可以是${}引用,如下面的app.name如果想使用上面的name的话:

app.properties内容:
local.ip=192.168.1.100
local.port=8080
name=springboot
app.name=this is ${name}
1


项目外的配置文件:

5d4c6812c8535adbb050f4ddf2e1bce8.png

my配置内容:


jetty.port=18880

修改启动类:

spring.config.location=classpath:/conf/app.properties,file:D:/tmp/my.properties

1dc618a0ed9580ce8bfa6facb208c08f.png

@Component
public class Test {
    @Value("${local.ip}")
    private String ip;
    @Value("${app.name}")
    private String appName;
    @Value("${jetty.port:9090}")
    private String jettPort;
    public void show(){
        System.out.println("local.ip===="+ip);
        System.out.println("app.name===="+appName);
        System.out.println("jetty.port===="+jettPort);
    }
}


运行入口函数:

5d4c6812c8535adbb050f4ddf2e1bce8.png

结果显示: 内部外部的配置文件都打印了。


@PropertySource编码方式读取


编写一个jdbc.properties


url=jdbc:mysql:///springboot
driverClassName=com.mysql.jdbc.Driver
@Component
@PropertySource(value = "classpath:jdbc.properties",encoding = "utf-8")
public class JdbcConfig {
    @Value("${url}")
    private String url;
    @Value("${driverClassName}")
    private String driverClassName;
    @Autowired
    private Environment env;
    public void show(){
        System.out.println("=============DataSourcePropeties===========");
        System.out.println("url: ===="+  env.getProperty("url"));
        System.out.println("driverClassName:==== "+ driverClassName );
    }
}

入口类:


@SpringBootApplication
public class Demo2Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Demo2Application.class, args);
        context.getBean(JdbcConfig.class).show();
        context.close();
    }
}


看下运行结果:

1dc618a0ed9580ce8bfa6facb208c08f.png

已经读取出来了。


五、一次读取多个配置文件属性


主要的方式就是使用@ConfigurationProperties(prefix = "xx"),配置文件前缀如果prefix 也可不写。


重写jdbc.properties


ds.url=jdbc:mysql:///springboot

ds.driverClassName=com.mysql.jdbc.Driver
ds.username=root
ds.password=12345


DataSourcePropeties 类,必须得有set方法:


@Component
@PropertySource(value = "classpath:jdbc.properties",encoding = "utf-8")
@ConfigurationProperties(prefix = "ds")
public class DataSourcePropeties {
    private String url;
    private String driverClassName;
    private String username;
    private String password;
    public void show(){
        System.out.println("========DataSourcePropeties============");
        System.out.println("ds.url: ===="+  url);
        System.out.println("ds.driverClassName:==== "+ driverClassName );
        System.out.println("ds.username:==== "+ username );
        System.out.println("ds.password:==== "+ password );
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getDriverClassName() {
        return driverClassName;
    }
    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}


测试:


@SpringBootApplication
public class Demo2Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Demo2Application.class, args);
        context.getBean(DataSourcePropeties.class).show();
        context.close();
    }
}


结果:

5d4c6812c8535adbb050f4ddf2e1bce8.png


完美显示.


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
2月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
710 0
|
2月前
|
前端开发 Java 数据库连接
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
|
6月前
|
缓存 NoSQL Java
基于SpringBoot的Redis开发实战教程
Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。
467 79
|
4月前
|
监控 Java 调度
SpringBoot中@Scheduled和Quartz的区别是什么?分布式定时任务框架选型实战
本文对比分析了SpringBoot中的`@Scheduled`与Quartz定时任务框架。`@Scheduled`轻量易用,适合单机简单场景,但存在多实例重复执行、无持久化等缺陷;Quartz功能强大,支持分布式调度、任务持久化、动态调整和失败重试,适用于复杂企业级需求。文章通过特性对比、代码示例及常见问题解答,帮助开发者理解两者差异,合理选择方案。记住口诀:单机简单用注解,多节点上Quartz;若是任务要可靠,持久化配置不能少。
456 4
|
5月前
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
488 5
|
10月前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
174 0
|
6月前
|
Java Spring
SpringBoot自动配置原理
本文深入解析了SpringBoot的核心功能——自动配置,重点探讨了`org.springframework.boot.autoconfigure`及相关注解的工作机制。通过分析`@SpringBootApplication`、`@EnableAutoConfiguration`等注解,揭示了SpringBoot如何基于类路径和条件自动装配Bean
323 7
|
7月前
|
Java Spring
SpringBoot 实战 不同参数调用不同实现
本文介绍了如何在实际工作中根据不同的入参调用不同的实现,采用`map+enum`的方式实现优雅且严谨的解决方案。通过Spring Boot框架中的工厂模式或策略模式,避免了使用冗长的`if...else...`语句。文中详细展示了定义接口、实现类、枚举类以及控制器调用的代码示例,确保用户输入的合法性并简化了代码逻辑。
175 1
SpringBoot 实战 不同参数调用不同实现
|
6月前
|
Java
SpringBoot自动装配的原理
在SpringBoot项目的启动引导类上都有一个注解@SpringBootApplication 这个注解是一个复合注解, 其中有三个注解构成 , 分别是 ● @SpringBootConfiguration : 是@Configuration的派生注解 , 标注当前类是一个SpringBoot的配置类 ● @ComponentScan : 开启组件扫描, 默认扫描的是当前启动引导了所在包以及子包 ● @EnableAutoConfiguration : 开启自动配置(自动配置核心注解) 2.在@EnableAutoConfiguration注解的内容使用@Import注解导入了一个AutoC
|
6月前
|
JavaScript 前端开发 Java
Idea启动SpringBoot程序报错:Veb server failed to start. Port 8082 was already in use;端口冲突的原理与解决方案
本文解决了Idea启动SpringBoot程序报错:Veb server failed to start. Port 8082 was already in use的问题,并通过介绍端口的使用原理和操作系统的端口管理机制,可以更有效地解决端口冲突问题,并确保Web服务器能够顺利启动和运行。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~