博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring 3.1 Environment Profiles--转载
阅读量:6906 次
发布时间:2019-06-27

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

原文地址:http://gordondickens.com/wordpress/2012/06/12/spring-3-1-environment-profiles/

Profiles

Spring 3.1 now includes support for the long awaited environment aware feature called profiles. Now we can activate profiles in our application, which allows us to define beans by deployment regions, such as “dev”, “qa”, “production”, “cloud”, etc.

We also can use this feature for other purposes: defining profiles for performance testing scenarios such as “cached” or “lazyload”.

Essential Tokens

Spring profiles are enabled using the case insensitive tokens spring.profiles.active orspring_profiles_active.

This token can be set as:

  • an Environment Variable
  • a JVM Property
  • Web Parameter
  • Programmatic

Spring also looks for the token, spring.profiles.default, which can be used to set the default profile(s) if none are specified with spring.profiles.active.

Grouping Beans by Profile

Spring 3.1 provides nested bean definitions, providing the ability to define beans for various environments:

1
2
3
4
<
beans
profiles
=
"dev,qa"
>
  
<
bean
id
=
"dataSource"
class
=
"..."
/>
  
<
bean
id
=
"messagingProvider"
class
=
"..."
/>
</
beans
>

Nested <beans> must appear last in the file. 

Beans that are used in all profiles are declared in the outer <beans> as we always have, such as Service classes.

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
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
beans
xmlns
=
""
       
xmlns:c
=
""
       
xmlns:xsi
=
""
       
xsi:schemaLocation="
       
">
 
    
<
bean
id
=
"businessService"
       
class
=
"com.c...s.springthreeone.business.SimpleBusinessServiceImpl"
/>
 
    
<
beans
profile
=
"dev,qa"
>
        
<
bean
id
=
"constructorBean"
          
class
=
"com.gordondickens.springthreeone.SimpleBean"
              
c:myString
=
"Constructor Set"
/>
 
        
<
bean
id
=
"setterBean"
          
class
=
"com.gordondickens.springthreeone.SimpleBean"
>
            
<
property
name
=
"myString"
value
=
"Setter Set"
/>
        
</
bean
>
    
</
beans
>
 
    
<
beans
profile
=
"prod"
>
        
<
bean
id
=
"setterBean"
          
class
=
"com.gordondickens.springthreeone.SimpleBean"
>
            
<
property
name
=
"myString"
value
=
"Setter Set - in Production YO!"
/>
        
</
bean
>
    
</
beans
>
</
beans
>

If we put a single <bean> declaration at below any nested <beans> tags we will get the exception org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'bean'.

Multiple beans can now share the same XML “id” 

In a typical scenario, we would want the DataSource bean to be called dataSource in both all profiles. Spring now allow us to create multiple beans within an XML file with the same ID providing they are defined in different <beans> sets. In other words, ID uniqueness is only enforced within each <beans> set.

Automatic Profile Discovery (Programmatic)

We can configure a class to set our profile(s) during application startup by implementing the appropriate interface. For example, we may configure an application to set different profiles based on where the application is deployed – in CloudFoundry or running as a local web application. In the web.xml file we can include an Servlet context parameter,contextInitializerClasses, to bootstrap this class:

1
2
3
4
<
context-param
>
  
<
param-name
>contextInitializerClasses</
param-name
>
  
<
param-value
>com.gordondickens.springthreeone.services.CloudApplicationContextInitializer</
param-value
>
</
context-param
>

The Initializer class

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
package
com.gordondickens.springthreeone.services;
 
import
org.cloudfoundry.runtime.env.CloudEnvironment;
import
org.slf4j.Logger;
import
org.slf4j.LoggerFactory;
import
org.springframework.context.ApplicationContextInitializer;
import
org.springframework.context.ConfigurableApplicationContext;
 
public
class
CloudApplicationContextInitializer
implements
  
ApplicationContextInitializer<ConfigurableApplicationContext> {
     
  
private
static
final
Logger logger = LoggerFactory
    
.getLogger(CloudApplicationContextInitializer.
class
);
 
  
@Override
  
public
void
initialize(ConfigurableApplicationContext applicationContext) {
    
CloudEnvironment env =
new
CloudEnvironment();
    
if
(env.getInstanceInfo() !=
null
) {
      
logger.info(
"Application running in cloud. API '{}'"
,
        
env.getCloudApiUri());
      
applicationContext.getEnvironment().setActiveProfiles(
"cloud"
);
      
applicationContext.refresh();
    
}
else
{
      
logger.info(
"Application running local"
);
      
applicationContext.getEnvironment().setActiveProfiles(
"dev"
);
    
}
  
}
}

 

Annotation Support for JavaConfig

If we are are using JavaConfig to define our beans, Spring 3.1 includes the @Profileannotation for enabling bean config files by profile(s).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package
com.gordondickens.springthreeone.configuration;
 
import
com.gordondickens.springthreeone.SimpleBean;
import
org.springframework.context.annotation.Bean;
import
org.springframework.context.annotation.Configuration;
import
org.springframework.context.annotation.Profile;
 
@Configuration
@Profile
(
"dev"
)
public
class
AppConfig {
  
@Bean
  
public
SimpleBean simpleBean() {
    
SimpleBean simpleBean =
new
SimpleBean();
    
simpleBean.setMyString(
"Ripped Pants"
);
    
return
simpleBean;
  
}
}

 

Testing with XML Configuration

With XML configuration we can simply add the annotation @ActiveProfiles to the JUnit test class. To include multiple profiles, use the format @ActiveProfiles(profiles = {"dev", "prod"})

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
package
com.gordondickens.springthreeone;
 
import
org.junit.Test;
import
org.junit.runner.RunWith;
import
org.springframework.beans.factory.NoSuchBeanDefinitionException;
import
org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.context.ApplicationContext;
import
org.springframework.test.context.ActiveProfiles;
import
org.springframework.test.context.ContextConfiguration;
import
org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import
static
junit.framework.Assert.assertNotNull;
import
static
junit.framework.Assert.assertNull;
 
@RunWith
(SpringJUnit4ClassRunner.
class
)
@ContextConfiguration
@ActiveProfiles
(profiles =
"dev"
)
public
class
DevBeansTest {
 
  
@Autowired
  
ApplicationContext applicationContext;
 
  
@Test
  
public
void
testDevBeans() {
    
SimpleBean simpleBean =
      
applicationContext.getBean(
"constructorBean"
, SimpleBean.
class
);
    
assertNotNull(simpleBean);
  
}
 
  
@Test
(expected = NoSuchBeanDefinitionException.
class
)
  
public
void
testProdBean() {
    
SimpleBean prodBean = applicationContext.getBean(
"prodBean"
, SimpleBean.
class
);
    
assertNull(prodBean);
  
}
}

 

Testing with JavaConfig

JavaConfig allows us to configure Spring with or without XML configuration. If we want to test beans that are defined in a Configuration class we configure our test with the loaderand classes arguments of the @ContextConfiguration annotation.

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
package
com.gordondickens.springthreeone.configuration;
 
import
com.gordondickens.springthreeone.SimpleBean;
import
org.junit.Test;
import
org.junit.runner.RunWith;
import
org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.test.context.ActiveProfiles;
import
org.springframework.test.context.ContextConfiguration;
import
org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import
org.springframework.test.context.support.AnnotationConfigContextLoader;
 
import
static
org.junit.Assert.assertNotNull;
 
@RunWith
(SpringJUnit4ClassRunner.
class
)
@ContextConfiguration
(classes = AppConfig.
class
, loader = AnnotationConfigContextLoader.
class
)
@ActiveProfiles
(profiles =
"dev"
)
public
class
BeanConfigTest {
 
  
@Autowired
  
SimpleBean simpleBean;
 
  
@Test
  
public
void
testBeanAvailablity() {
    
assertNotNull(simpleBean);
  
}
}

 

Declarative Configuration in WEB.XML

If we desire to set the configuration in WEB.XML, this can be done with parameters onContextLoaderListener.

Application Context

1
2
3
4
5
6
7
8
<
context-param
>
  
<
param-name
>contextConfigLocation</
param-name
>
  
<
param-value
>/WEB-INF/app-config.xml</
param-value
>
</
context-param
>
<
context-param
>
  
<
param-name
>spring.profiles.active</
param-name
>
  
<
param-value
>DOUBLEUPMINT</
param-value
>
</
context-param
>

Log Results

DEBUG PropertySourcesPropertyResolver - Found key 'spring.profiles.active' in [servletContextInitParams] with type [String] and value 'DOUBLEUPMINT'

Environment Variable/JVM Parameter

Setting an environment variable can be done with either spring_profiles_default orspring_profiles_active. In Unix/Mac it would be export SPRING_PROFILES_DEFAULT=DEVELOPMENT for my local system.

We can also use the JVM “-D” parameter which also works with Maven when using Tomcat or Jetty plugins.

Note: Remember the tokens are NOT case sensitive and can use periods or underscores as separators. For Unix systems, you need to use the underscore, as above.

Logging of system level properties DEBUG PropertySourcesPropertyResolver - Found key 'spring.profiles.default' in [systemProperties] with type [String] and value 'dev,default'

Summary

Now we are equipped to activate various Spring bean sets, based on profiles we define. We can use  traditional, XML based configuration, or the features added to support JavaConfig originally introduced in Spring 3.0.

转载地址:http://dwgdl.baihongyu.com/

你可能感兴趣的文章
MBR和GPT分区学习
查看>>
1.单一职责原则(Single Responsibility Principle)
查看>>
LeetCode--058--最后一个单词的长度
查看>>
Mysql JSON 新特性用法
查看>>
python List 对象
查看>>
@RequestParam注解的使用
查看>>
JQ_简单图片拖动
查看>>
【直视骄阳】生命的留言
查看>>
shell脚本:不登陆KVM虚拟机,修改虚拟机网卡IP地址
查看>>
性能测试loadrunner场景问题之socket
查看>>
fdisk分区命令详解与fdisk非交互式分区
查看>>
LINUX下PHP运行环境搭建之三(转)
查看>>
asp.net中连接字符串问题(类库中使用ConfigurationManager.ConnectionStrings)
查看>>
艾伟_转载:Web网站缓存文件并发问题解决方案
查看>>
iOS LaunchScreen设置启动图片 启动页停留时间
查看>>
android137 360 双击三击事件
查看>>
PHP-002
查看>>
web接口开发与测试
查看>>
谷歌笔试题整理(一)
查看>>
IOS-KVO、KVC
查看>>