Spring 环境与profile——超简用例
Posted exmyth
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 环境与profile——超简用例相关的知识,希望对你有一定的参考价值。
什么是profile,为什么需要profile?
在开发时,不同环境(开发、联调、预发、正式等)所需的配置不同导致,如果每改变一个环境就更改配置不但麻烦(修改代码、重新构建)而且容易出错。Spring提供了解决方案。
方法一:配置profile bean
@Configuration public class DataSourceConfig //Spring 引入@Profile 制定某个bean属于哪个profile //在方法级别上使用@Profile注解
@Bean @Profile("dev") public DataSource embeddedDataSource() return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.H2) .addScript("classpath:schema.sql") .addScript("classpath:dev-data.sql") .build(); @Bean @Profile("prod") public DataSource embeddedDataSourceDev() return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.H2) .addScript("classpath:schema.sql") .addScript("classpath:prod-data.sql") .build();
在同一个类的不同方法上使用@Profile注解与@Bean一起使用
方法二:在XML中配置bean
与方法一等价的方式
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation=" http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <beans profile="dev"> <jdbc:embedded-database id="dataSource" type="H2"> <jdbc:script location="classpath:schema.sql" /> <jdbc:script location="classpath:dev-data.sql" /> </jdbc:embedded-database> </beans> <beans profile="prod"> <jdbc:embedded-database id="dataSource" type="H2"> <jdbc:script location="classpath:schema.sql" /> <jdbc:script location="classpath:prod-data.sql" /> </jdbc:embedded-database> </beans> </beans>
激活profile
Spring在确定哪个profile处于激活状态时,需要依赖两个独立属性:sping.profiles.active和spring.profiles.default。Spring提供了@ActiveProfiles用来指定运行测试时要激活哪个profile,如果没有指定sping.profiles.active,会采用spring.profiles.default的默认值。
测试
package profiles; import static org.junit.Assert.*; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import javax.sql.DataSource; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.myapp.DataSourceConfig; public class DataSourceConfigTest @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes=DataSourceConfig.class) @ActiveProfiles("dev") public static class DevDataSourceTest @Autowired private DataSource dataSource; @Test public void shouldBeEmbeddedDatasource() assertNotNull(dataSource); JdbcTemplate jdbc = new JdbcTemplate(dataSource); List<String> results = jdbc.query("select id, name from Things", new RowMapper<String>() @Override public String mapRow(ResultSet rs, int rowNum) throws SQLException return rs.getLong("id") + ":" + rs.getString("name"); ); assertEquals(1, results.size()); assertEquals("1:A", results.get(0)); @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:datasource-config.xml") @ActiveProfiles("prod") public static class ProductionDataSourceTest_XMLConfig @Autowired private DataSource dataSource; @Test public void shouldBeEmbeddedDatasource() assertNotNull(dataSource); JdbcTemplate jdbc = new JdbcTemplate(dataSource); List<String> results = jdbc.query("select id, name from Things", new RowMapper<String>() @Override public String mapRow(ResultSet rs, int rowNum) throws SQLException return rs.getLong("id") + ":" + rs.getString("name"); ); assertEquals(1, results.size()); assertEquals("1:B", results.get(0));
代码
以上是关于Spring 环境与profile——超简用例的主要内容,如果未能解决你的问题,请参考以下文章
spring boot使用profile来区分正式环境配置文件与测试环境配置文件