通常开发测试与上线生产使用不同的环境配置,我们可以使用@Profile注解实现。
在类上使用@Profile注解
开发环境配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| package cn.hff;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
@Configuration @Profile("dev") public class DevProfileConfig {
@Bean(destroyMethod = "shutdown") public DataSource dataSource() { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.DERBY) .addScript("classpath:schema.sql") .addScript("classpath:test-data.sql") .build(); } }
|
因为要使用Derby作为内嵌数据库,所以要导入Derby的依赖:
1 2 3 4 5 6
| <dependency> <groupId>org.apache.derby</groupId> <artifactId>derby</artifactId> <version>10.14.1.0</version> <scope>test</scope> </dependency>
|
Spring支持HSQL,H2,Derby三种内嵌数据库,我们只需把数据库的依赖jar包放在类路径下,Spring会自动为我们创建数据库以及数据库连接,在连接关闭的时候数据库就会被删除,这个很适合在开发环境下使用。
生产环境配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| package cn.hff;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment;
import com.alibaba.druid.pool.DruidDataSource;
@Configuration @Profile("prod") @PropertySource("classpath:db.properties") public class ProdProfileConfig {
@Autowired private Environment env;
@Bean public DataSource dataSource() { DruidDataSource ds = new DruidDataSource(); ds.setUrl(env.getProperty("jdbc.url")); ds.setDriverClassName(env.getProperty("jdbc.driverClass")); ds.setUsername(env.getProperty("jdbc.username")); ds.setPassword(env.getProperty("jdbc.password")); return ds; } }
|
这里使用阿里的Druid连接池:
1 2 3 4 5
| <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.6</version> </dependency>
|
另外在类路径下的db.properties
文件中配置数据源的详细配置。
在方法上使用@Profile注解
Spring3.2开始,@Profile注解就可以在方法级别上使用了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| package cn.hff;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import com.alibaba.druid.pool.DruidDataSource;
@Configuration @PropertySource("classpath:db.properties") public class DataSourceConfig {
@Autowired private Environment env;
@Bean("dataSource") @Profile("dev") public DataSource embeddedDerbyDataSource(){ return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.DERBY) .addScript("classpath:schema.sql") .addScript("classpath:test-data.sql") .build(); }
@Bean("dataSource") @Profile("prod") public DataSource mysqlDataSource() { DruidDataSource ds = new DruidDataSource(); ds.setUrl(env.getProperty("jdbc.url")); ds.setDriverClassName(env.getProperty("jdbc.driverClass")); ds.setUsername(env.getProperty("jdbc.username")); ds.setPassword(env.getProperty("jdbc.password")); return ds; }
}
|
XML配置方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| <?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:property-placeholder location="classpath:db.properties"/>
<beans profile="dev"> <jdbc:embedded-database id="dataSource"> <jdbc:script location="classpath:schema.xml"/> <jdbc:script location="classpath:test-data.xml"/> </jdbc:embedded-database> </beans>
<beans profile="prod"> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" p:url="${jdbc.url}" p:driverClassName="${jdbc.driverClass}" p:username="${jdbc.username}" p:password="${jdbc.password}"> </bean> </beans>
</beans>
|
激活Profile
激活Profile需要两个独立的properties属性:spring.profiles.active
和spring.profiles.default
。如果设置了spring.profiles.active
的值,就用它的值来确定哪个profile是激活的,如果没有设置,则使用spring.profiles.default
设置的值。如果两个值都没有设置,则所有的profile都不会被激活,也就是至创建哪些没有定义在profile中的bean。
我们有以下几种方式设置这两个值:
在SpringBoot中通常会把服务打成jar包部署,可以在命令后面指定激活哪个profile
1
| java -jar XXX.jar --spring.profiles.active=prod
|
参考:
Spring In Action
Spring Framework Documentation
本作品采用 知识共享署名 4.0 国际许可协议 进行许可。
转载时请注明原文链接:https://blog.hufeifei.cn/2018/02/J2EE/Spring%E9%AB%98%E7%BA%A7%E7%AF%87-Profile/