Spring3.1环境与profile
Posted Java全栈从0到1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring3.1环境与profile相关的知识,希望对你有一定的参考价值。
程序运行有多个环境,比如开发环境、测试环境、生产环境等。
在每个环境中,很多东西有不同的做法,如使用的数据库等。
为了避免在切换运行环境是需要对程序进行大量修改,Spring提供了profile设置,使程序能对不同环境做出对应的处理。
使用profile,可以使一个部署单元(如war包)可以用于不同的环境,内部的bean会根据环境所需而创建。
1、配置profile bean
Java配置profile
使用@Profile注解指定bean属于哪个profile
针对类,表明这个类下所有的bean都在对应profile激活时才创建
@Configuration @Profile("dev") public class DataSourceConfig { @Bean(destroyMethod = "shutdown") public DataSource embeddedDataSource() { return new EmbeddedDatabaseBuilder().build(); } }
针对方法,表明
@Configuration public class DataSourceConfig { @Bean(destroyMethod = "shutdown") @Profile("dev") public DataSource embeddedDataSource() { return new EmbeddedDatabaseBuilder().build(); } @Bean @Profile("prod") public DataSource jndiDataSource() { JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();return (DataSource) jndiObjectFactoryBean.getObject(); } }
XML配置profile
设置整个XML文件属于某个profile, 每一个环境创建一个XML文件,把这些XML文件都放在部署环境中,根据环境自动调用
<?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" profile="dev"> <jdbc:embedded-database id="dataSource" type="H2"> <jdbc:script location="classpath:schema.sql" /> <jdbc:script location="classpath:test-data.sql" /> </jdbc:embedded-database> </beans>
也可以通过嵌套<beans>元素,在同一个XML文件下创建不同profile 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:test-data.sql" /> </jdbc:embedded-database> </beans> <beans profile="prod"> <jee:jndi-lookup id="dataSource" lazy-init="true" jndi-name="jdbc/myDatabase" resource-ref="true" proxy-interface="javax.sql.DataSource" /> </beans> </beans>
2、激活profile
1、没有指定profile的bean任何时候都会创建
2、根据spring.profiles.active属性,找到当前激活的profile
3、如果active属性没有设置,则找spring.profiles.default属性,找到默认的profile
4、如果2个值都没有设置,则不会创建任何定义在profile里面的bean
spring.profiles.active,spring.profiles.default2个参数的设置方式:
1、作为DispatcherServlet的初始化参数;
2、作为Web应用的上下文参数;
3、作为JNDI条目;
4、作为环境变量;
5、作为JVM的系统属性;
6、在集成测试类上,使用@ActiveProfiles注解设置
具体写法,后面的例子会讲到
3、使用profile进行测试
使用@ActiveProfiles注解
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes=DataSourceConfig.class) @ActiveProfiles("prod") public static class ProductionDataSourceTest { @Autowired private DataSource dataSource; @Test public void shouldBeEmbeddedDatasource() { // should be null, because there isn‘t a datasource configured in JNDI assertNull(dataSource); } }
以上是关于Spring3.1环境与profile的主要内容,如果未能解决你的问题,请参考以下文章
如何通过属性文件而不是通过 env 变量或系统属性设置活动 spring 3.1 环境配置文件