• Spring Profiles example--转载


    原文地址:http://www.mkyong.com/spring/spring-profiles-example/

    Spring @Profile allow developers to register beans by condition. For example, register beans based on what operating system (Windows, *nix) your application is running, or load a database properties file based on the application running in development, test, staging or production environment.

    In this tutorial, we will show you a Spring @Profile application, which does the following stuff :

    1. Create two profiles – dev and live
    2. If profile “dev” is enabled, return a simple cache manager – ConcurrentMapCacheManager
    3. If profile “live” is enabled, return an advanced cache manager – EhCacheCacheManager
    Note
    1. Spring has supported @Profile annotation since version 3.1
    2. @Profile is inside spring-context.jar

    Tools used :

    1. Spring 4.1.4.RELEASE
    2. Ehcache 2.9.0
    3. JDK 1.7

    1. Spring @Profile Examples

    This @Profile annotation can be applied at class level or method level.

    1.1 Normal Spring Configuration, enable caching, so that Spring will expect a cache manager at runtime.

    AppConfig
    package com.mkyong.test;
    
    import org.springframework.cache.annotation.EnableCaching;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @EnableCaching
    @ComponentScan({ "com.mkyong.*" })
    public class AppConfig {
    }
    

    1.2 A dev profile, which returns a simple cache manager concurrentMapCacheManager

    CacheConfigDev.java
    package com.mkyong.test;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.cache.CacheManager;
    import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Profile;
    
    @Configuration
    @Profile("dev")
    public class CacheConfigDev {
    
    	private static final Logger log = LoggerFactory.getLogger(CacheConfigDev.class);
    	
    	@Bean
            public CacheManager concurrentMapCacheManager() {
    		log.debug("Cache manager is concurrentMapCacheManager");
                    return new ConcurrentMapCacheManager("movieFindCache");
            }
    	
    }
    

    1.3 A live profile, which returns ehCacheCacheManager

    CacheConfigLive.java
    package com.mkyong.test;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.cache.CacheManager;
    import org.springframework.cache.ehcache.EhCacheCacheManager;
    import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Profile;
    import org.springframework.core.io.ClassPathResource;
    
    @Configuration
    @Profile("live")
    public class CacheConfigLive {
    
    	private static final Logger log = LoggerFactory.getLogger(CacheConfigDev.class);
    	
    	@Bean
    	public CacheManager cacheManager() {
    		log.debug("Cache manager is ehCacheCacheManager");
    		return new EhCacheCacheManager(ehCacheCacheManager().getObject());
    	}
    
    	@Bean
    	public EhCacheManagerFactoryBean ehCacheCacheManager() {
    		EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
    		cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));
    		cmfb.setShared(true);
    		return cmfb;
    	}
    	
    }
    
     

    2. Enable @Profile

    Few code snippets to show you how to enable a Spring profile.

    2.1 For non-web application, you can enable a profile via the Spring context environment.

    App.java
    package com.mkyong.test;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.context.ConfigurableApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class App {
    
    	public static void main(String[] args) {
    
    	  AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
    	  //Enable a "live" profile
    	  context.getEnvironment().setActiveProfiles("live");
    	  context.register(AppConfig.class);
    	  context.refresh();
    		
    	  ((ConfigurableApplicationContext) context).close();
    
    	}
    }
    

    Output

    DEBUG com.mkyong.test.CacheConfigDev - Cache manager is ehCacheCacheManager
    

    Or, via the system property like this

    App.java
    package com.mkyong.test;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.core.env.AbstractEnvironment;
    
    public class App {
    
    	public static void main(String[] args) {
    
    	  //Enable a "dev" profile
    	  System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, "dev");
    	  ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    		
    	}
    }
    

    Output

    DEBUG com.mkyong.test.CacheConfigDev - Cache manager is concurrentMapCacheManager
    

    2.2 For web application, defined a context parameter in web.xml

    web.xml
    	<context-param>
    	    <param-name>spring.profiles.active</param-name>
    	    <param-value>live</param-value>
    	</context-param>
    

    2.3 For web application don’t have web.xml, like servlet 3.0+ container

    MyWebInitializer.java
    package com.mkyong.servlet3;
     
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
     
    public class MyWebInitializer extends
    	AbstractAnnotationConfigDispatcherServletInitializer {
     
    	//...
    	@Override
    	public void onStartup(ServletContext servletContext) throws ServletException {
    		super.onStartup(servletContext);
    		servletContext.setInitParameter("spring.profiles.active", "live");
    	}
     
    }
    

    2.4 For Unit Test, uses @ActiveProfiles

    CacheManagerTest.java
    package com.mkyong.test;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.test.context.ActiveProfiles;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import org.springframework.cache.CacheManager;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = { AppConfig.class })
    @ActiveProfiles("dev")
    public class CacheManagerTest {
    
    	@Autowired
    	private CacheManager cacheManager;
    	
    	@Test
    	public void test_abc() {
    		//...
    	}
    	
    }
    
     

    3. More…

    3.1 Spring @Profile can apply at method level.

    AppConfig.java
    package com.mkyong.test;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.cache.CacheManager;
    import org.springframework.cache.annotation.EnableCaching;
    import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
    import org.springframework.cache.ehcache.EhCacheCacheManager;
    import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
    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.core.io.ClassPathResource;
    
    @Configuration
    @EnableCaching
    @ComponentScan({ "com.mkyong.*" })
    public class AppConfig {
    
    	private static final Logger log = LoggerFactory.getLogger(AppConfig.class);
    	
    	@Bean
    	@Profile("dev")
            public CacheManager concurrentMapCacheManager() {
    		log.debug("Cache manager is concurrentMapCacheManager");
                    return new ConcurrentMapCacheManager("movieFindCache");
            }
    	
    	@Bean
    	@Profile("live")
    	public CacheManager cacheManager() {
    		log.debug("Cache manager is ehCacheCacheManager");
    		return new EhCacheCacheManager(ehCacheCacheManager().getObject());
    	}
    
    	@Bean
    	@Profile("live")
    	public EhCacheManagerFactoryBean ehCacheCacheManager() {
    		EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
    		cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));
    		cmfb.setShared(true);
    		return cmfb;
    	}
    	
    }
    

    3.2 You can enable multiple profiles.

    	AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
    	context.getEnvironment().setActiveProfiles("live", "linux");
    	//or
    	System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, "dev, windows");
    
    web.xml
    	<context-param>
    	    <param-name>spring.profiles.active</param-name>
    	    <param-value>stage, postgresql</param-value>
    	</context-param>
    
    	@ActiveProfiles({"dev", "mysql","integration"})
    
            ((ConfigurableEnvironment)context.getEnvironment())
                       .setActiveProfiles(new String[]{"dev", "embedded"});
  • 相关阅读:
    Connection termination(by client)” 错误的处理方法
    Loadrunner教程读后感-VuGen
    通过HP Loadrunner VuGen来录制安卓的应用
    Test Android with QTP
    Junit单步调试
    魔法方法
    手写配置文件
    理解self与this
    幂等性
    Python assert作用
  • 原文地址:https://www.cnblogs.com/davidwang456/p/5008206.html
Copyright © 2020-2023  润新知