博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring 区分环境
阅读量:4050 次
发布时间:2019-05-25

本文共 5196 字,大约阅读时间需要 17 分钟。

– Start


我们开发软件时,通常有三个环境,开发环境(dev),测试环境(test)和生产环境(prod),不同的环境连接不同的数据库,我们该怎么配置呢?

首先我们可以定义三个 properties 文件,将不同环境的数据库的配置在里面。
system.dev.properties
system.test.properties
system.prod.properties

jdbc.driverClassName=org.hsqldb.jdbcDriverjdbc.url=jdbc:hsqldb:hsql://dev:9002jdbc.username=sajdbc.password=root
jdbc.driverClassName=org.hsqldb.jdbcDriverjdbc.url=jdbc:hsqldb:hsql://test:9002jdbc.username=sajdbc.password=root
jdbc.driverClassName=org.hsqldb.jdbcDriverjdbc.url=jdbc:hsqldb:hsql://production:9002jdbc.username=sajdbc.password=root

然后我们可以在 Spring XML 配置文件中配置注册我们的 properties,然后通过${xx} 方式引用属性。

package shangbo.spring.example43;import org.apache.commons.dbcp.BasicDataSource;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {    public static void main( String[] args )    {    	// 设置环境变量,通常在 shell 启动脚本中设置    	System.setProperty("env", "dev");    			// 实例化 Spring IoC 容器		ApplicationContext context = new ClassPathXmlApplicationContext("shangbo/spring/example43/example.xml");				// 从容器中获得对象		BasicDataSource dataSource = context.getBean(BasicDataSource.class);						// 使用对象		System.out.println(dataSource.getUrl());    }}

我们也可以使用 Java 配置。

package shangbo.spring.example44;import org.apache.commons.dbcp.BasicDataSource;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;@Configuration@PropertySource("classpath:shangbo/spring/example44/system.${env}.properties")public class AppConfig {		@Bean(destroyMethod = "close")	public BasicDataSource dataSource(			@Value("${jdbc.driverClassName}") String driverClassName,			@Value("${jdbc.url}") String url,			@Value("${jdbc.username}") String username,			@Value("${jdbc.password}") String password) {		BasicDataSource dataSource = new BasicDataSource();		dataSource.setDriverClassName(driverClassName);		dataSource.setUrl(url);		dataSource.setUsername(username);		dataSource.setPassword(password);				return dataSource;	}	}
package shangbo.spring.example44;import org.apache.commons.dbcp.BasicDataSource;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class App {    public static void main( String[] args )    {    	// 设置环境变量,通常在 shell 启动脚本中设置    	System.setProperty("env", "test");    			// 实例化 Spring IoC 容器		ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);				// 从容器中获得对象		BasicDataSource dataSource = context.getBean(BasicDataSource.class);						// 使用对象		System.out.println(dataSource.getUrl());    }}

在一个复杂的系统中,有时候一个对象在不同的环境中初始化的方式不一样,你可能会问为什么不弄成一样的呢,有时候事情并不是我们能决定的,但生活还的继续,怎么办?Spring 有办法,下面是一个简单的例子。

首先定义一个特殊的类,假设这个类在不同的环境中定义的方式不一样。

package shangbo.spring.example45;public class SpecialClass {	private String env;	public String getEnv() {		return env;	}	public void setEnv(String env) {		this.env = env;	}	}
package shangbo.spring.example45;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {    public static void main( String[] args )    {    	// 设置环境变量,通常在 shell 启动脚本中设置    	System.setProperty("spring.profiles.active", "dev");    			// 实例化 Spring IoC 容器		ApplicationContext context = new ClassPathXmlApplicationContext("shangbo/spring/example45/example.xml");				// 从容器中获得对象		SpecialClass specialBean = context.getBean(SpecialClass.class);						// 使用对象		System.out.println(specialBean.getEnv());    }}

我们也可以使用 Java 配置。

package shangbo.spring.example46;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Profile;@Configurationpublic class AppConfig {		@Bean	@Profile("dev")	public SpecialClass specialBean1() {		SpecialClass s = new SpecialClass();		s.setEnv("dev");				return s;	}		@Bean	@Profile("uat")	public SpecialClass specialBean2() {		SpecialClass s = new SpecialClass();		s.setEnv("uat");				return s;	}		@Bean	@Profile("prod")	public SpecialClass specialBean3() {		SpecialClass s = new SpecialClass();		s.setEnv("prod");				return s;	}	}
package shangbo.spring.example46;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class App {    public static void main( String[] args )    {    	// 设置环境变量,通常在 shell 启动脚本中设置    	System.setProperty("spring.profiles.active", "uat");    			// 实例化 Spring IoC 容器		ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);				// 从容器中获得对象		SpecialClass specialBean = context.getBean(SpecialClass.class);						// 使用对象		System.out.println(specialBean.getEnv());    }}

– 声 明:转载请注明出处
– Last Updated on 2017-05-26
– Written by ShangBo on 2017-05-26
– End

你可能感兴趣的文章
一个高速交警的忠告
查看>>
新车装饰的中国特色
查看>>
没看过这么NB的自驾游,笑的我眼泪都出来了
查看>>
李涯的哭
查看>>
和机器学习和计算机视觉相关的数学
查看>>
论文MICO for MRI bias field estimation and tissue segmentation品讲
查看>>
后现代
查看>>
VMware6关机后出现is not a valid virtual machine configuration file的解决办法
查看>>
通过ASP实现flash对数据库的访问
查看>>
“==”和equals方法究竟有什么区别?
查看>>
哈佛图书馆墙上的20条训言
查看>>
交流引发深入思考
查看>>
保持我们母语的纯洁
查看>>
免费的互联网时代如何盈利?
查看>>
可怕的宣传力量
查看>>
症状:可以上网,可以上QQ,不能登陆360安全卫士,360浏览器无法同步,有道词典等无法登陆,无法查询。
查看>>
重读《触龙说赵太后》
查看>>
2010的第一次思想触动
查看>>
文学大师做菜艺术20个"须知"
查看>>
SVN + 批处理 + Dropbox + TeamViewer实现远方协同工作
查看>>