zoukankan      html  css  js  c++  java
  • 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"});
  • 相关阅读:
    Atitit.播放系统规划新版本 v4 q18 and 最近版本回顾
    Atitit.播放系统规划新版本 v4 q18 and 最近版本回顾
    atitit.极光消息推送服务器端开发实现推送  jpush v3. 总结o7p
    atitit.极光消息推送服务器端开发实现推送  jpush v3. 总结o7p
    Atitit.文件搜索工具 attilax 总结
    Atitit.文件搜索工具 attilax 总结
    Atitit.软件命名空间  包的命名统计 及命名表(2000个名称) 方案java package
    Atitit.软件命名空间  包的命名统计 及命名表(2000个名称) 方案java package
    Atitit..状态机与词法分析  通用分词器 分词引擎的设计与实现 attilax总结
    Atitit..状态机与词法分析  通用分词器 分词引擎的设计与实现 attilax总结
  • 原文地址:https://www.cnblogs.com/davidwang456/p/5008206.html
Copyright © 2011-2022 走看看