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. 使用建议

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

Spring Boot可以使用两种类型的配置:内部配置和外部配置。 内部配置是在项目中定义的默认配置,通常包括在application.properties或application.yml文件中。这些配置通常是应用程序的默认配置,如果没有外部配置,则会使用这些配置。 外部配置是在应用程序外部定义的配置,可以通过命令行参数、环境变量或配置文件来定义。外部配置可以覆盖内部配置,从而允许您在不修改应用程序代码的情况下更改应用程序的行为。 Spring Boot支持以下外部配置文件: - application.properties - application.yml - application-{profile}.properties - application-{profile}.yml Spring Boot将按照以下顺序加载这些文件: 1. 当前目录下的/config子目录 2. 当前目录 3. classpath的/config包 4. classpath根目录 在应用程序中使用外部配置非常简单。只需在application.properties或application.yml文件中定义属性,并在应用程序中使用@Value注释或@ConfigurationProperties注释将其注入到bean中即可。如果您需要使用多个配置文件,可以使用@PropertySource注释指定要加载的外部配置文件。 例如,在application.properties文件中定义属性: ``` myapp.database.url=jdbc:mysql://localhost:3306/myapp myapp.database.username=root myapp.database.password=123456 ``` 然后,在您的应用程序中使用@Value注释将这些属性注入到bean中: ``` @Service public class MyService { @Value("${myapp.database.url}") private String databaseUrl; @Value("${myapp.database.username}") private String databaseUsername; @Value("${myapp.database.password}") private String databasePassword; // ... } ``` 或者,您可以使用@ConfigurationProperties注释来将属性绑定到自定义配置类: ``` @ConfigurationProperties(prefix = "myapp.database") public class DatabaseProperties { private String url; private String username; private String password; // getters and setters } @Service public class MyService { private final DatabaseProperties databaseProperties; public MyService(DatabaseProperties databaseProperties) { this.databaseProperties = databaseProperties; } // ... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值