說明一:這裏只展示通過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);
}