SpringBoot之Profile的两种使用方式详解

 更新时间:2024年10月04日 08:57:08   作者:太自由  
当在不同的环境下,想通过修改配置文件来连接不同的数据库,比如在开发过程中启动项目时,想连接开发环境对应的数据库,可以在配置文件中指定environment=dev,其他环境类似,此时就需要用到Spring为我们提供的Profile功能,本文给大家介绍了SpringBoot之Profile的两种使用方式

0. 需求

通常项目开发过程中,会经历多种环境转换,典型的如开发环境(dev)、测试环境(test)和生产环境(prod)。在这三种不同的环境下,连接数据库时使用的配置信息是不同的,即三个不同环境对应三个不同的数据库。

现在的需求是:当在不同的环境下,想通过修改配置文件来连接不同的数据库。比如在开发过程中启动项目时,想连接开发环境对应的数据库,可以在配置文件中指定 environment = dev。其他环境类似,此时就需要用到Spring为我们提供的Profile功能。

1. 采用一个配置文件的情况

当SpringBoot项目只使用一个配置文件(application.yml或application.properties)时,如果想在这个配置文件中通过配置切换不同数据源,可以按照如下步骤:

1.1. 数据源类

package com.shg.spring.ioc.bean;
 
import lombok.Data;
 
@Data
public class MyDataSource {
    
    private String username;
 
    private String password;
 
    private String url;
    private String driver;
    
}

1.2. 数据源配置类

package com.shg.spring.ioc.config;
 
import com.shg.spring.ioc.bean.MyDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
 
@Configuration
public class MyDataSourceConfig {
 
    @Value("${jdbc.user.dev}")
    private String usernameForDev;
    @Value("${jdbc.password.dev}")
    private String passwordForDev;
    @Value("${jdbc.jdbcUrl.dev}")
    private String urlForDev;
    @Value("${jdbc.driverClass.dev}")
    private String driverForDev;
 
    @Value("${jdbc.user.test}")
    private String usernameForTest;
    @Value("${jdbc.password.test}")
    private String passwordForTest;
    @Value("${jdbc.jdbcUrl.test}")
    private String urlForTest;
    @Value("${jdbc.driverClass.test}")
    private String driverForTest;
 
    @Value("${jdbc.user.prod}")
    private String usernameForProd;
    @Value("${jdbc.password.pro}")
    private String passwordForProd;
    @Value("${jdbc.jdbcUrl.pro}")
    private String urlForProd;
    @Value("${jdbc.driverClass.pro}")
    private String driverForProd;
 
    @Profile(value = {"default", "dev"})
    @Bean
    public MyDataSource dev() {
        MyDataSource myDataSource = new MyDataSource();
        myDataSource.setDriver(driverForDev);
        myDataSource.setUrl(urlForDev);
        myDataSource.setUsername(usernameForDev);
        myDataSource.setPassword(passwordForDev);
        return myDataSource;
    }
 
    @Profile(value = {"test"})
    @Bean
    public MyDataSource test() {
        MyDataSource myDataSource = new MyDataSource();
        myDataSource.setDriver(driverForTest);
        myDataSource.setUrl(urlForTest);
        myDataSource.setUsername(usernameForTest);
        myDataSource.setPassword(passwordForTest);
        return myDataSource;
    }
 
    @Profile(value = {"prod"})
    @Bean
    public MyDataSource prod() {
        MyDataSource myDataSource = new MyDataSource();
        myDataSource.setDriver(driverForProd);
        myDataSource.setUrl(urlForProd);
        myDataSource.setUsername(usernameForProd);
        myDataSource.setPassword(passwordForProd);
        return myDataSource;
    }
}

1.3 DAO层用到数据源

package com.shg.spring.ioc.dao;
 
import com.shg.spring.ioc.bean.MyDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
 
@Repository
public class HelloDao {
 
    // DAO层需要注入数据源
    @Autowired
    private MyDataSource myDataSource;
 
    // 保存发货信息
    public void saveDelivery() {
        System.out.println("保存发货信息...用的数据源信息是:" + myDataSource);
    }
 
}

1.4. 配置文件

spring.application.name=spring-01-ioc
 
spring.profiles.active=dev
 
jdbc.jdbcUrl.dev=jdbc:mysql://localhost:3306/dev
jdbc.driverClass.dev=com.mysql.jdbc.Driver
jdbc.user.dev=root
jdbc.password.dev=123
 
jdbc.jdbcUrl.test=jdbc:mysql://localhost:3306/test
jdbc.driverClass.test=com.mysql.jdbc.Driver
jdbc.user.test=root
jdbc.password.test=123
 
jdbc.jdbcUrl.prod=jdbc:mysql://localhost:3306/prod
jdbc.driverClass.prod=com.mysql.jdbc.Driver
jdbc.user.prod=root
jdbc.password.prod=123

1.5. 测试代码

package com.shg.spring.ioc;
 
import com.shg.spring.ioc.dao.HelloDao;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
 
@SpringBootApplication
public class Spring01IocApplication {
 
    public static void main(String[] args) {
        ConfigurableApplicationContext ioc = SpringApplication.run(Spring01IocApplication.class, args);
        HelloDao helloDao = ioc.getBean(HelloDao.class);
        helloDao.saveDelivery();
    }
    
}

1.6. 测试结果

 1.6.1 配置文件中的spring.profiles=dev

1.6.2 配置文件中的spring.profiles=test

1.6.3 配置文件中的spring.profiles=prod

 2. 采用多个配置文件的情况

上面的例子中,只使用一个配置文件。需要在这个配置文件中配置三种环境的配置信息,感觉不太好...

【你也可能会反驳说,我直接使用一组配置信息,不分什么dev,test和prod环境,在配置类中也不用标注@Profile注解,而是在部署对应环境的时候,修改这个数据源的配置信息,这当然也是可以的,但是不要忘了我们现在是在讨论 Profile这个功能,这样举例子会更加清楚明了】

下面我们采用另一种方式,来实现我们的需求,即:在不同的环境下,可以直接通过修改配置文件来连接不同的数据库。

2.1 . 三个环境对应的配置文件

2.1.1 dev环境的配置信息

2.1.2 test环境的配置信息

2.1.3 prod环境的配置信息

2.2. 数据源类

package com.shg.spring.ioc.bean;
 
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
 
@Data
@Component
public class MyDataSource {
 
    @Value("${jdbc.user}")
    private String usernameForDev;
    
    @Value("${jdbc.password}")
    private String passwordForDev;
    
    @Value("${jdbc.jdbcUrl}")
    private String urlForDev;
    
    @Value("${jdbc.driverClass}")
    private String driverForDev;
    
}

2.3. DAO层需要用到数据源

package com.shg.spring.ioc.dao;
 
import com.shg.spring.ioc.bean.MyDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
 
@Repository
public class HelloDao {
 
    // DAO层需要注入数据源
    @Autowired
    private MyDataSource myDataSource;
 
    // 保存发货信息
    public void saveDelivery() {
        System.out.println("保存发货信息...用的数据源信息是:" + myDataSource);
    }
 
}

2.4. 在主配置文件中开启需要使用哪个环境的配置文件

2.4.1. 开启dev

测试结果:

2.4.2. 开启test

测试结果:

2.4.3. 开启prod

测试结果:

3. 使用建议

在实际项目中,推荐在不同环境使用不同的配置文件。 

以上就是SpringBoot之Profile的两种使用方式详解的详细内容,更多关于SpringBoot Profile使用方式的资料请关注脚本之家其它相关文章!

相关文章

  • IntelliJ IDEA 2020下载与安装教程图文详解

    IntelliJ IDEA 2020下载与安装教程图文详解

    这篇文章主要介绍了IDEA 2020下载与安装的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Java实现表白小程序

    Java实现表白小程序

    本文讲述了Java实现表白的代码实例。具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧,具体如下:
    2018-05-05
  • SpringSecurity Jwt Token 自动刷新的实现

    SpringSecurity Jwt Token 自动刷新的实现

    这篇文章主要介绍了SpringSecurity Jwt Token 自动刷新的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java桥接模式原理及用法解析

    Java桥接模式原理及用法解析

    这篇文章主要介绍了Java桥接模式原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • SpringBoot集成图片验证码框架easy-captcha的详细过程

    SpringBoot集成图片验证码框架easy-captcha的详细过程

    本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是一款轻量级的开源验证码框架,通过简洁的API和高度可定制性,可以快速实现验证码功能,文章详细介绍了如何配置、生成和展示验证码,并提供了Easy-Captcha的GitHub地址
    2025-03-03
  • SpringBoot对数据访问层进行单元测试的方法详解

    SpringBoot对数据访问层进行单元测试的方法详解

    我们公司作为一个面向银行、金融机构的TO B类企业,频繁遇到各个甲方爸爸提出的国产化数据库的改造需求,包括OceanBase, TiDB,geldenDB等等,本文就介绍一种快高效、可复用的解决方案——对数据访问层做单元测试,需要的朋友可以参考下
    2023-08-08
  • Java JAR包运行与反编译实践

    Java JAR包运行与反编译实践

    这篇文章主要介绍了Java JAR包运行与反编译实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-03-03
  • Spring Boot 基于 SCRAM 认证集成 Kafka 的过程详解

    Spring Boot 基于 SCRAM 认证集成 Kafka 的过程详解

    在本篇文章中,我们将探讨如何在 Spring Boot 应用中集成 Kafka 并使用 SCRAM 认证机制进行安全连接,并实现动态创建账号、ACL 权限、Topic,以及生产者和消费者等操作,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • java实现自定义时钟并实现走时功能

    java实现自定义时钟并实现走时功能

    这篇文章主要为大家详细介绍了java实现自定义时钟并实现走时功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 关于Java类的构造方法详解

    关于Java类的构造方法详解

    这篇文章主要介绍了关于Java类的构造方法详解的相关资料,需要的朋友可以参考下
    2023-01-01

最新评论