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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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天前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
13 0
|
7天前
|
Java Spring
SpringBoot自动装配的原理
在Spring Boot项目中,启动引导类通常使用`@SpringBootApplication`注解。该注解集成了`@SpringBootConfiguration`、`@ComponentScan`和`@EnableAutoConfiguration`三个注解,分别用于标记配置类、开启组件扫描和启用自动配置。
44 17
|
24天前
|
自然语言处理 Java API
Spring Boot 接入大模型实战:通义千问赋能智能应用快速构建
【10月更文挑战第23天】在人工智能(AI)技术飞速发展的今天,大模型如通义千问(阿里云推出的生成式对话引擎)等已成为推动智能应用创新的重要力量。然而,对于许多开发者而言,如何高效、便捷地接入这些大模型并构建出功能丰富的智能应用仍是一个挑战。
96 6
|
28天前
|
Java Spring 容器
springboot @RequiredArgsConstructor @Lazy解决循环依赖的原理
【10月更文挑战第15天】在Spring Boot应用中,循环依赖是一个常见问题,当两个或多个Bean相互依赖时,会导致Spring容器陷入死循环。本文通过比较@RequiredArgsConstructor和@Lazy注解,探讨它们解决循环依赖的原理和优缺点。@RequiredArgsConstructor通过构造函数注入依赖,使代码更简洁;@Lazy则通过延迟Bean的初始化,打破创建顺序依赖。两者各有优势,需根据具体场景选择合适的方法。
51 4
|
4月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
118 0
|
2月前
|
Java 应用服务中间件 API
Vertx高并发理论原理以及对比SpringBoot
Vertx 是一个基于 Netty 的响应式工具包,不同于传统框架如 Spring,它的侵入性较小,甚至可在 Spring Boot 中使用。响应式编程(Reactive Programming)基于事件模式,通过事件流触发任务执行,其核心在于事件流 Stream。相比多线程异步,响应式编程能以更少线程完成更多任务,减少内存消耗与上下文切换开销,提高 CPU 利用率。Vertx 适用于高并发系统,如 IM 系统、高性能中间件及需要较少服务器支持大规模 WEB 应用的场景。随着 JDK 21 引入协程,未来 Tomcat 也将优化支持更高并发,降低响应式框架的必要性。
Vertx高并发理论原理以及对比SpringBoot
|
2月前
|
Java 开发者 数据格式
【Java笔记+踩坑】SpringBoot基础4——原理篇
bean的8种加载方式,自动配置原理、自定义starter开发、SpringBoot程序启动流程解析
【Java笔记+踩坑】SpringBoot基础4——原理篇
|
2月前
|
缓存 NoSQL Java
Springboot实战——黑马点评之秒杀优化
【9月更文挑战第27天】在黑马点评项目中,秒杀功能的优化对提升系统性能和用户体验至关重要。本文提出了多项Spring Boot项目的秒杀优化策略,包括数据库优化(如索引和分库分表)、缓存优化(如Redis缓存和缓存预热)、并发控制(如乐观锁、悲观锁和分布式锁)以及异步处理(如消息队列和异步任务执行)。这些策略能有效提高秒杀功能的性能和稳定性,为用户提供更佳体验。
146 6
|
3月前
|
NoSQL Java Redis
Redis6入门到实战------ 八、Redis与Spring Boot整合
这篇文章详细介绍了如何在Spring Boot项目中整合Redis,包括在`pom.xml`中添加依赖、配置`application.properties`文件、创建配置类以及编写测试类来验证Redis的连接和基本操作。
Redis6入门到实战------ 八、Redis与Spring Boot整合
|
3月前
|
Java API UED
【实战秘籍】Spring Boot开发者的福音:掌握网络防抖动,告别无效请求,提升用户体验!
【8月更文挑战第29天】网络防抖动技术能有效处理频繁触发的事件或请求,避免资源浪费,提升系统响应速度与用户体验。本文介绍如何在Spring Boot中实现防抖动,并提供代码示例。通过使用ScheduledExecutorService,可轻松实现延迟执行功能,确保仅在用户停止输入后才触发操作,大幅减少服务器负载。此外,还可利用`@Async`注解简化异步处理逻辑。防抖动是优化应用性能的关键策略,有助于打造高效稳定的软件系统。
72 2