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

本文涉及的产品
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


完美显示.


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
Java 应用服务中间件 测试技术
深入探索Spring Boot Web应用源码及实战应用
【5月更文挑战第11天】本文将详细解析Spring Boot Web应用的源码架构,并通过一个实际案例,展示如何构建一个基于Spring Boot的Web应用。本文旨在帮助读者更好地理解Spring Boot的内部工作机制,以及如何利用这些机制优化自己的Web应用开发。
31 3
|
4天前
|
安全 Java 开发者
深入理解Spring Boot配置绑定及其实战应用
【4月更文挑战第10天】本文详细探讨了Spring Boot中配置绑定的核心概念,并结合实战示例,展示了如何在项目中有效地使用这些技术来管理和绑定配置属性。
15 1
|
4天前
|
安全 Java 测试技术
Spring Boot集成支付宝支付:概念与实战
【4月更文挑战第29天】在电子商务和在线业务应用中,集成有效且安全的支付解决方案是至关重要的。支付宝作为中国领先的支付服务提供商,其支付功能的集成可以显著提升用户体验。本篇博客将详细介绍如何在Spring Boot应用中集成支付宝支付功能,并提供一个实战示例。
41 2
|
4天前
|
Java 关系型数据库 数据库
Spring Boot多数据源及事务管理:概念与实战
【4月更文挑战第29天】在复杂的企业级应用中,经常需要访问和管理多个数据源。Spring Boot通过灵活的配置和强大的框架支持,可以轻松实现多数据源的整合及事务管理。本篇博客将探讨如何在Spring Boot中配置多数据源,并详细介绍事务管理的策略和实践。
40 3
|
3天前
|
Java 开发者 Spring
springboot @RequiredArgsConstructor @Lazy解决循环依赖的原理
【5月更文挑战第16天】在Spring Boot中,@RequiredArgsConstructor 和 @Lazy 是两个有用的注解,它们分别用于简化构造函数的生成和控制Bean的加载时间。下面详细解析这两个注解的概念、优缺点以及在实际应用中的示例。
7 1
|
4天前
|
Java 开发者 Spring
springboot DDD的概念以及实战
【5月更文挑战第15天】领域驱动设计(Domain-Driven Design,简称DDD)是一种软件设计方法论,它强调基于业务领域的复杂性来构建软件
10 2
|
4天前
|
开发框架 监控 Java
深入探索Spring Boot的监控、管理和测试功能及实战应用
【5月更文挑战第14天】Spring Boot是一个快速开发框架,提供了一系列的功能模块,包括监控、管理和测试等。本文将深入探讨Spring Boot中监控、管理和测试功能的原理与应用,并提供实际应用场景的示例。
16 2
|
4天前
|
XML Java 开发者
springboot 启动原理、启动过程、启动机制的介绍
【5月更文挑战第13天】Spring Boot 是一种基于 Java 的框架,用于创建独立的、生产级别的 Spring 应用程序。它的主要目标是简化 Spring 应用的初始搭建和开发过程,同时提供一系列大型项目常见的非功能性特征(如嵌入式服务器、安全性、度量、健康检查和外部化配置)。
18 3
|
4天前
|
Java Spring 容器
深入理解Spring Boot启动流程及其实战应用
【5月更文挑战第9天】本文详细解析了Spring Boot启动流程的概念和关键步骤,并结合实战示例,展示了如何在实际开发中运用这些知识。
19 2
|
4天前
|
JavaScript Java 开发者
Spring Boot中的@Lazy注解:概念及实战应用
【4月更文挑战第7天】在Spring Framework中,@Lazy注解是一个非常有用的特性,它允许开发者控制Spring容器的bean初始化时机。本文将详细介绍@Lazy注解的概念,并通过一个实际的例子展示如何在Spring Boot应用中使用它。
21 2