Spring入门(七):Spring Profile使用讲解

在日常的开发工作中,我们经常需要将程序部署到不同的环境,比如Dev开发环境,QA测试环境,Prod生产环境,这些环境下的一些配置肯定是不一样的,比如数据库配置,Redis配置,RabbitMQ配置。

如果每次切换发布环境,都需要修改配置重新构建的话,那对程序员来说将是噩梦,针对这种场景,Spring提供了@Profile注解来实现按照不同的环境装配不同的bean,进而实现程序只需构建一次,但可以部署到多个环境。

2. 配置profile bean

为了更好的理解,我们通过具体的代码示例来理解下Spring profile的使用方法,这里我们以数据库配置为例。

说明:本篇博客的重点是讲解@Profile注解的使用,数据库的操作只是辅助理解@Profile,因此不会讲解的太详细,不过后续会单独写博客讲解

假设我们有3套环境(Dev,QA,Prod),这3套环境的数据库都使用的是mysql,但是其地址,用户名,密码都不一样,那么在Java配置中,该如何声明这些bean呢?

2.1 Java配置中配置profile bean

首先需要了解的是,@Profile注解是从Spring 3.1版本中开始引入的,并且在这个版本中,@Profile注解只能在类级别上使用。

因此我们可以按照环境分别创建数据库配置,如下所示:

Dev环境下的数据库配置:

package chapter03.profile; import org.apache.commons.dbcp2.BasicDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import javax.sql.DataSource; @Configuration @Profile("dev") public class DevDataSourceConfig { @Bean public DataSource devDataSource() { System.out.println("This is dev DataSource"); BasicDataSource basicDataSource = new BasicDataSource(); basicDataSource.setDriverClassName("com.mysql.jdbc.Driver"); basicDataSource.setUrl("jdbc:mysql://localhost:3306/mybatis_action_db"); basicDataSource.setUsername("dev"); basicDataSource.setPassword("dev"); return basicDataSource; } }

使用上述代码需要在pom.xml中添加如下依赖:

<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.7.0</version> </dependency>

注意事项:如果类级别上使用了@Profile("dev"),那么该类中的所有bean都会在profile为dev时创建。

QA环境下的数据库配置:

package chapter03.profile; import org.apache.commons.dbcp2.BasicDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import javax.sql.DataSource; @Configuration @Profile("qa") public class QADataSourceConfig { @Bean public DataSource qaDataSource() { System.out.println("This is qa DataSource"); BasicDataSource basicDataSource = new BasicDataSource(); basicDataSource.setDriverClassName("com.mysql.jdbc.Driver"); basicDataSource.setUrl("jdbc:mysql://localhost:3307/mybatis_action_db"); basicDataSource.setUsername("qa"); basicDataSource.setPassword("qa"); return basicDataSource; } }

Prod环境下的数据库配置:

package chapter03.profile; import org.apache.commons.dbcp2.BasicDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import javax.sql.DataSource; @Configuration @Profile("prod") public class ProdDataSourceConfig { @Bean public DataSource prodDataSource() { System.out.println("This is prod DataSource"); BasicDataSource basicDataSource = new BasicDataSource(); basicDataSource.setDriverClassName("com.mysql.jdbc.Driver"); basicDataSource.setUrl("jdbc:mysql://localhost:3308/mybatis_action_db"); basicDataSource.setUsername("prod"); basicDataSource.setPassword("prod"); return basicDataSource; } }

不过从Spring 3.2开始,@Profile注解可以与@Bean注解一起在方法级别上使用。

这也就使得我们可以将刚刚的3个配置类合并成1个配置类(推荐该方式),如下所示:

package chapter03.profile; import org.apache.commons.dbcp2.BasicDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import javax.sql.DataSource; @Configuration public class DataSourceConfig { @Bean @Profile("dev") public DataSource devDataSource() { System.out.println("This is dev DataSource"); BasicDataSource basicDataSource = new BasicDataSource(); basicDataSource.setDriverClassName("com.mysql.jdbc.Driver"); basicDataSource.setUrl("jdbc:mysql://localhost:3306/mybatis_action_db"); basicDataSource.setUsername("dev"); basicDataSource.setPassword("dev"); return basicDataSource; } @Bean @Profile("qa") public DataSource qaDataSource() { System.out.println("This is qa DataSource"); BasicDataSource basicDataSource = new BasicDataSource(); basicDataSource.setDriverClassName("com.mysql.jdbc.Driver"); basicDataSource.setUrl("jdbc:mysql://localhost:3307/mybatis_action_db"); basicDataSource.setUsername("qa"); basicDataSource.setPassword("qa"); return basicDataSource; } @Bean @Profile("prod") public DataSource prodDataSource() { System.out.println("This is prod DataSource"); BasicDataSource basicDataSource = new BasicDataSource(); basicDataSource.setDriverClassName("com.mysql.jdbc.Driver"); basicDataSource.setUrl("jdbc:mysql://localhost:3308/mybatis_action_db"); basicDataSource.setUsername("prod"); basicDataSource.setPassword("prod"); return basicDataSource; } }

注意事项:没有指定profile的bean始终都会创建,与激活哪个profile无关。

2.2 xml中配置profile bean

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdsjp.html