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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 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


完美显示.


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
存储 Java Maven
Spring Boot WebFlux 增删改查完整实战 demo
Spring Boot WebFlux 增删改查完整实战 demo
|
2月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
93 0
|
13天前
|
NoSQL Java Redis
Redis6入门到实战------ 八、Redis与Spring Boot整合
这篇文章详细介绍了如何在Spring Boot项目中整合Redis,包括在`pom.xml`中添加依赖、配置`application.properties`文件、创建配置类以及编写测试类来验证Redis的连接和基本操作。
Redis6入门到实战------ 八、Redis与Spring Boot整合
|
2天前
|
Java API UED
【实战秘籍】Spring Boot开发者的福音:掌握网络防抖动,告别无效请求,提升用户体验!
【8月更文挑战第29天】网络防抖动技术能有效处理频繁触发的事件或请求,避免资源浪费,提升系统响应速度与用户体验。本文介绍如何在Spring Boot中实现防抖动,并提供代码示例。通过使用ScheduledExecutorService,可轻松实现延迟执行功能,确保仅在用户停止输入后才触发操作,大幅减少服务器负载。此外,还可利用`@Async`注解简化异步处理逻辑。防抖动是优化应用性能的关键策略,有助于打造高效稳定的软件系统。
12 2
|
2天前
|
JSON Java API
解码Spring Boot与JSON的完美融合:提升你的Web开发效率,实战技巧大公开!
【8月更文挑战第29天】Spring Boot作为Java开发的轻量级框架,通过`jackson`库提供了强大的JSON处理功能,简化了Web服务和数据交互的实现。本文通过代码示例介绍如何在Spring Boot中进行JSON序列化和反序列化操作,并展示了处理复杂JSON数据及创建RESTful API的方法,帮助开发者提高效率和应用性能。
12 0
|
2天前
|
Java 开发者 Spring
Spring Boot实战宝典:揭秘定时任务的幕后英雄,让业务处理如流水般顺畅,轻松驾驭时间管理艺术!
【8月更文挑战第29天】在现代应用开发中,定时任务如数据备份、报告生成等至关重要。Spring Boot作为流行的Java框架,凭借其强大的集成能力和简洁的配置方式,为开发者提供了高效的定时任务解决方案。本文详细介绍了如何在Spring Boot项目中启用定时任务支持、编写定时任务方法,并通过实战案例展示了其在业务场景中的应用,同时提供了注意事项以确保任务的正确执行。
10 0
|
2月前
|
SQL Java 数据库连接
springboot~mybatis-pagehelper原理与使用
【7月更文挑战第15天】MyBatis-PageHelper是用于MyBatis的分页插件,基于MyBatis的拦截器机制实现。它通过在SQL执行前动态修改SQL语句添加LIMIT子句以支持分页。使用时需在`pom.xml`添加依赖并配置方言等参数。示例代码: PageHelper.startPage(2, 10); List<User> users = userMapper.getAllUsers(); PageInfo<User> pageInfo = new PageInfo<>(users); 这使得分页查询变得简单且能获取总记录数等信息。
|
16天前
|
Dubbo Java Nacos
【实战攻略】破解Dubbo+Nacos+Spring Boot 3 Native打包后运行异常的终极秘籍——从零开始彻底攻克那些让你头疼不已的技术难题!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但使用Dubbo+Nacos+Spring Boot 3进行GraalVM native打包后常遇运行异常。本文剖析此问题及其解决策略:确认GraalVM版本兼容性;配置反射列表以支持必要类和方法;采用静态代理替代动态代理;检查并调整配置文件;禁用不支持的功能;利用日志和GraalVM诊断工具定位问题;根据诊断结果调整GraalVM配置。通过系统排查方法,能有效解决此类问题,确保服务稳定运行。
39 0
|
2月前
|
监控 Java 微服务
Spring Boot微服务部署与监控的实战指南
【7月更文挑战第19天】Spring Boot微服务的部署与监控是保障应用稳定运行和高效维护的重要环节。通过容器化部署和云平台支持,可以实现微服务的快速部署和弹性伸缩。而利用Actuator、Prometheus、Grafana等监控工具,可以实时获取应用的运行状态和性能指标,及时发现并解决问题。在实际操作中,还需根据应用的具体需求和场景,选择合适的部署和监控方案,以达到最佳效果。
|
2月前
|
Java 开发者 Spring
深入理解Spring Boot中的自动配置原理
深入理解Spring Boot中的自动配置原理
下一篇
云函数