说明一:这里只展示通过JavaConfig进行配置的方式,暂时没有通过XML方式的配置。
说明二:这里假设使用的上下文环境为SpringBoot。
Spring Profile的配置:
关键字:@Profile 注解
这里以数据库的配置作为示例,程序中添加了两个配置,分别是开发环境和线上环境的数据库配置,只需根据实际的环境激活相应的配置即可。
import javax.activation.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
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;
import org.springframework.jndi.JndiObjectFactoryBean;
@Configuration
@ComponentScan
public class DataSourceConfig {
@Bean(destroyMethod="shutdown")
@Profile("dev")
public DataSource EmbeddedDataSource(){
return (DataSource) new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript("classpath:schema.sql")
.addScript("classpath:data.sql")
.build();
}
@Bean
@Profile("prod")
public DataSource jndiDataSource(){
JndiObjectFactoryBean jofb = new JndiObjectFactoryBean();
jofb.setJndiName("jndi/iDS");
jofb.setResourceRef(true);
jofb.setProxyInterface(xxx.class);
return (DataSource) jofb.getObject();
}
}
Spring Profile的激活:
在程序启动入口激活相应配置,这里是上面配置的"dev"(实际上的激活方式有多种,这里只展示其中一种)
import com.sdsxer.mmdiary.common.Constants;
import com.sdsxer.mmdiary.storage.StorageProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.support.SpringBootServletInitializer;
@SpringBootApplication
@EnableConfigurationProperties(StorageProperties.class)
public class Application extends SpringBootServletInitializer {
// war entry
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
application.profiles("dev");
return application.sources(Application.class);
}
// jar entry
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
Spring Profile的读取:
关键字:Environment
这里展示了一个过滤器读取环境变量决定是否进行身份校验的示例
@Autowired
private Environment environment;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// disable token validation interceptor under dev environment
String[] profiles = environment.getActiveProfiles();
if(!ArrayUtils.contains(profiles, "dev")) {
registry.addInterceptor(new TokenValidationInterceptor()).addPathPatterns("/**");
}
super.addInterceptors(registry);
}