Spring 3.1 Environment Profiles--转载

原文地址: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="http://www.springframework.org/schema/beans"

       xmlns:c="http://www.springframework.org/schema/c"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <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.

时间: 2024-11-26 16:48:17

Spring 3.1 Environment Profiles--转载的相关文章

Spring Boot Common application properties(转载)

转自官方文档:http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html 版本:1.5.4.RELEASE # =================================================================== # COMMON SPRING BOOT PROPERTIES # # This sample file is pro

Spring AOP详解(转载)

此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没有遇到过与之相关的问题.最近项目中遇到了以下几点需求,仔细思考之后,觉得采用AOP 来解决.一方面是为了以更加灵活的方式来解决问题,另一方面是借此机会深入学习Spring AOP相关的内容.本文是权当本人的自己AOP学习笔记,以下需求不用AOP肯定也能解决,至于是否牵强附会,仁者见仁智者见智. 对部分函数的调用进行日志记录,用于观察特定问题在运行过程中的函数调用情况 监控部分重要函数,若抛出指定的异常,需要以短信或邮件方式通知相关人员

Spring AOP详解(转载)所需要的包

上一篇文章中,<Spring Aop详解(转载)>里的代码都可以运行,只是包比较多,中间缺少了几个相应的包,根据报错,几经百度搜索,终于补全了所有包. 截图如下: 在主测试类里面,有人怀疑,没有main方法,是怎么运行的.这是用的junit,结合spring来进行的测试类. Spring AOP详解(转载)所需要的包,布布扣,bubuko.com

spring中context:property-placeholder/元素 转载

spring中context:property-placeholder/元素  转载 1.有些参数在某些阶段中是常量 比如 :a.在开发阶段我们连接数据库时的连接url,username,password,driverClass等 b.分布式应用中client端访问server端所用的server地址,port,service等 c.配置文件的位置 2.而这些参数在不同阶段之间又往往需要改变 比如:在项目开发阶段和交付阶段数据库的连接信息往往是不同的,分布式应用也是同样的情况. 期望:能不能有一

Build Spring MVC development environment

Short memo for how to build Spring MVC develepmnet environment (for windows). In case you have any questions, please feel free to leave message to me under this article. I will update and add more details according to your concern. Firstly, please ma

SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)【转载】

最近在学习Spring+SpringMVC+MyBatis的整合.以下是参考网上的资料自己实践操作的详细步骤. 1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来.它是为了解决企业应用开发的复杂性而创建的.Spring使用基本的JavaBean来完成以前只可能由EJ

Spring 中JCA CCI分析--转载

转载地址:http://blog.csdn.net/a154832918/article/details/6790612 J2EE提供JCA(Java Connector Architecture)规范来标准化对EIS(Enterprise Information System)的访问.这个规范被分为几个不同的部分: SPI(Service provider interfaces)是连接器提供者(connector provider)必须实现的接口. 这些接口组成了一个能被部署在J2EE应用服务

java的反射原理与Spring的自动注入(转载)

Java反射原理与Spring的自动注入 反射的定义 java的反射机制就是在运行状态中, 对于任意一个类都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法和属性. 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. Sping的自动注入原理 一个Bean的类: public class User{ private String username; private String mobile; public String getUsernam

Spring MVC-Hello World示例(转载实践)

以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_hello_world_example.htm 说明:示例基于Spring MVC 4.1.6. 以下示例显示如何使用Spring MVC框架编写一个简单的基于Web的Hello World应用程序.首先,让我们使用Eclipse IDE,并按照以下步骤使用Spring Web Framework开发动态Web应用程序: 步骤 描述 1 创建一个名为HelloWeb的动态Web项