Spring Profiles示例

2023年1月11日08:59:40

Spring Profiles示例

 

 

Spring @Profile允许开发人员按条件注册bean。例如,根据您的应用程序正在运行的操作系统(Windows,* nix)注册bean,或者根据在开发,测试,登台或生产环境中运行的应用程序加载数据库属性文件。

在本教程中,我们将向您展示一个Spring @Profile应用程序,它执行以下操作:

  1. 创建两个配置文件 - devlive
  2. 如果启用了配置文件“dev”,则返回一个简单的缓存管理器 - ConcurrentMapCacheManager
  3. 如果启用了配置文件“live”,则返回高级缓存管理器 - EhCacheCacheManager

注意

 

  1. Spring从版本3.1开始支持@Profile注释
  2. @Profile位于spring-context.jar中

使用的工具 :

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

1. Spring @Profile示例

@Profile批注可以在类级别或方法级别应用。

1.1普通的Spring配置,启用缓存,以便Spring在运行时期望缓存管理器。

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 dev配置文件,它返回一个简单的缓存管理器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 live返回的配置文件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.启用@Profile

很少有代码片段向您展示如何启用Spring配置文件。

2.1对于非Web应用程序,您可以通过Spring上下文环境启用配置文件。

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();

	}
}

复制

产量

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

复制

或者,通过这样的系统属性

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);
		
	}
}

复制

产量

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

复制

2.2对于Web应用程序,在中定义了上下文参数 web.xml

web.xml中

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

复制

2.3对于Web应用程序没有web.xml,像servlet 3.0+容器

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对于单元测试,使用 @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.更多......

3.1 Spring @Profile可以在方法级别应用。

AppConfig.java

<span style="color:#212529"><span style="color:#000000"><code class="language-java"><span style="color:#0077aa">package</span> com<span style="color:#999999">.</span>mkyong<span style="color:#999999">.</span>test<span style="color:#999999">;</span>

<span style="color:#0077aa">import</span> org<span style="color:#999999">.</span>slf4j<span style="color:#999999">.</span>Logger<span style="color:#999999">;</span>
<span style="color:#0077aa">import</span> org<span style="color:#999999">.</span>slf4j<span style="color:#999999">.</span>LoggerFactory<span style="color:#999999">;</span>
<span style="color:#0077aa">import</span> org<span style="color:#999999">.</span>springframework<span style="color:#999999">.</span>cache<span style="color:#999999">.</span>CacheManager<span style="color:#999999">;</span>
<span style="color:#0077aa">import</span> org<span style="color:#999999">.</span>springframework<span style="color:#999999">.</span>cache<span style="color:#999999">.</span>annotation<span style="color:#999999">.</span>EnableCaching<span style="color:#999999">;</span>
<span style="color:#0077aa">import</span> org<span style="color:#999999">.</span>springframework<span style="color:#999999">.</span>cache<span style="color:#999999">.</span>concurrent<span style="color:#999999">.</span>ConcurrentMapCacheManager<span style="color:#999999">;</span>
<span style="color:#0077aa">import</span> org<span style="color:#999999">.</span>springframework<span style="color:#999999">.</span>cache<span style="color:#999999">.</span>ehcache<span style="color:#999999">.</span>EhCacheCacheManager<span style="color:#999999">;</span>
<span style="color:#0077aa">import</span> org<span style="color:#999999">.</span>springframework<span style="color:#999999">.</span>cache<span style="color:#999999">.</span>ehcache<span style="color:#999999">.</span>EhCacheManagerFactoryBean<span style="color:#999999">;</span>
<span style="color:#0077aa">import</span> org<span style="color:#999999">.</span>springframework<span style="color:#999999">.</span>context<span style="color:#999999">.</span>annotation<span style="color:#999999">.</span>Bean<span style="color:#999999">;</span>
<span style="color:#0077aa">import</span> org<span style="color:#999999">.</span>springframework<span style="color:#999999">.</span>context<span style="color:#999999">.</span>annotation<span style="color:#999999">.</span>ComponentScan<span style="color:#999999">;</span>
<span style="color:#0077aa">import</span> org<span style="color:#999999">.</span>springframework<span style="color:#999999">.</span>context<span style="color:#999999">.</span>annotation<span style="color:#999999">.</span>Configuration<span style="color:#999999">;</span>
<span style="color:#0077aa">import</span> org<span style="color:#999999">.</span>springframework<span style="color:#999999">.</span>context<span style="color:#999999">.</span>annotation<span style="color:#999999">.</span>Profile<span style="color:#999999">;</span>
<span style="color:#0077aa">import</span> org<span style="color:#999999">.</span>springframework<span style="color:#999999">.</span>core<span style="color:#999999">.</span>io<span style="color:#999999">.</span>ClassPathResource<span style="color:#999999">;</span>

<span style="color:#999999">@Configuration</span>
<span style="color:#999999">@EnableCaching</span>
<span style="color:#999999">@ComponentScan</span><span style="color:#999999">(</span><span style="color:#999999">{</span> <span style="color:#669900">"com.mkyong.*"</span> <span style="color:#999999">}</span><span style="color:#999999">)</span>
<span style="color:#0077aa">public</span> <span style="color:#0077aa">class</span> AppConfig <span style="color:#999999">{</span>

	<span style="color:#0077aa">private</span> <span style="color:#0077aa">static</span> <span style="color:#0077aa">final</span> Logger log <span style="color:#a67f59">=</span> LoggerFactory<span style="color:#999999">.</span><span style="color:#dd4a68">getLogger</span><span style="color:#999999">(</span>AppConfig<span style="color:#999999">.</span><span style="color:#0077aa">class</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
	
	<span style="color:#999999">@Bean</span>
	<span style="color:#999999">@Profile</span><span style="color:#999999">(</span><span style="color:#669900">"dev"</span><span style="color:#999999">)</span>
        <span style="color:#0077aa">public</span> CacheManager <span style="color:#dd4a68">concurrentMapCacheManager</span><span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#999999">{</span>
		log<span style="color:#999999">.</span><span style="color:#dd4a68">debug</span><span style="color:#999999">(</span><span style="color:#669900">"Cache manager is concurrentMapCacheManager"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
                <span style="color:#0077aa">return</span> <span style="color:#0077aa">new</span> ConcurrentMapCacheManager<span style="color:#999999">(</span><span style="color:#669900">"movieFindCache"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
        <span style="color:#999999">}</span>
	
	<span style="color:#999999">@Bean</span>
	<span style="color:#999999">@Profile</span><span style="color:#999999">(</span><span style="color:#669900">"live"</span><span style="color:#999999">)</span>
	<span style="color:#0077aa">public</span> CacheManager <span style="color:#dd4a68">cacheManager</span><span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#999999">{</span>
		log<span style="color:#999999">.</span><span style="color:#dd4a68">debug</span><span style="color:#999999">(</span><span style="color:#669900">"Cache manager is ehCacheCacheManager"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
		<span style="color:#0077aa">return</span> <span style="color:#0077aa">new</span> EhCacheCacheManager<span style="color:#999999">(</span><span style="color:#dd4a68">ehCacheCacheManager</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">.</span><span style="color:#dd4a68">getObject</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
	<span style="color:#999999">}</span>

	<span style="color:#999999">@Bean</span>
	<span style="color:#999999">@Profile</span><span style="color:#999999">(</span><span style="color:#669900">"live"</span><span style="color:#999999">)</span>
	<span style="color:#0077aa">public</span> EhCacheManagerFactoryBean <span style="color:#dd4a68">ehCacheCacheManager</span><span style="color:#999999">(</span><span style="color:#999999">)</span> <span style="color:#999999">{</span>
		EhCacheManagerFactoryBean cmfb <span style="color:#a67f59">=</span> <span style="color:#0077aa">new</span> EhCacheManagerFactoryBean<span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
		cmfb<span style="color:#999999">.</span><span style="color:#dd4a68">setConfigLocation</span><span style="color:#999999">(</span><span style="color:#0077aa">new</span> ClassPathResource<span style="color:#999999">(</span><span style="color:#669900">"ehcache.xml"</span><span style="color:#999999">)</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
		cmfb<span style="color:#999999">.</span><span style="color:#dd4a68">setShared</span><span style="color:#999999">(</span><span style="color:#990055">true</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
		<span style="color:#0077aa">return</span> cmfb<span style="color:#999999">;</span>
	<span style="color:#999999">}</span>
	
<span style="color:#999999">}</span>
</code></span></span>

复制

3.2您可以启用多个配置文件。

<span style="color:#212529"><span style="color:#000000"><code class="language-java">	AnnotationConfigApplicationContext context <span style="color:#a67f59">=</span> <span style="color:#0077aa">new</span> AnnotationConfigApplicationContext<span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
	context<span style="color:#999999">.</span><span style="color:#dd4a68">getEnvironment</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">.</span><span style="color:#dd4a68">setActiveProfiles</span><span style="color:#999999">(</span><span style="color:#669900">"live"</span><span style="color:#999999">,</span> <span style="color:#669900">"linux"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
	<span style="color:#708090">//or</span>
	System<span style="color:#999999">.</span><span style="color:#dd4a68">setProperty</span><span style="color:#999999">(</span>AbstractEnvironment<span style="color:#999999">.</span>ACTIVE_PROFILES_PROPERTY_NAME<span style="color:#999999">,</span> <span style="color:#669900">"dev, windows"</span><span style="color:#999999">)</span><span style="color:#999999">;</span>
</code></span></span>

复制

web.xml中

<span style="color:#212529"><span style="color:#000000"><code class="language-markup">	<span style="color:#990055"><span style="color:#990055"><span style="color:#999999"><</span>context-param</span><span style="color:#999999">></span></span>
	    <span style="color:#990055"><span style="color:#990055"><span style="color:#999999"><</span>param-name</span><span style="color:#999999">></span></span>spring.profiles.active<span style="color:#990055"><span style="color:#990055"><span style="color:#999999"></</span>param-name</span><span style="color:#999999">></span></span>
	    <span style="color:#990055"><span style="color:#990055"><span style="color:#999999"><</span>param-value</span><span style="color:#999999">></span></span>stage, postgresql<span style="color:#990055"><span style="color:#990055"><span style="color:#999999"></</span>param-value</span><span style="color:#999999">></span></span>
	<span style="color:#990055"><span style="color:#990055"><span style="color:#999999"></</span>context-param</span><span style="color:#999999">></span></span>
</code></span></span>

复制

<span style="color:#212529"><span style="color:#000000"><code class="language-java">	<span style="color:#999999">@ActiveProfiles</span><span style="color:#999999">(</span><span style="color:#999999">{</span><span style="color:#669900">"dev"</span><span style="color:#999999">,</span> <span style="color:#669900">"mysql"</span><span style="color:#999999">,</span><span style="color:#669900">"integration"</span><span style="color:#999999">}</span><span style="color:#999999">)</span>
</code></span></span>

复制

<span style="color:#212529"><span style="color:#000000"><code class="language-java">        <span style="color:#999999">(</span><span style="color:#999999">(</span>ConfigurableEnvironment<span style="color:#999999">)</span>context<span style="color:#999999">.</span><span style="color:#dd4a68">getEnvironment</span><span style="color:#999999">(</span><span style="color:#999999">)</span><span style="color:#999999">)</span>
                   <span style="color:#999999">.</span><span style="color:#dd4a68">setActiveProfiles</span><span style="color:#999999">(</span><span style="color:#0077aa">new</span> String<span style="color:#999999">[</span><span style="color:#999999">]</span><span style="color:#999999">{</span><span style="color:#669900">"dev"</span><span style="color:#999999">,</span> <span style="color:#669900">"embedded"</span><span style="color:#999999">}</span><span style="color:#999999">)</span><span style="color:#999999">;</span></code></span></span>

  • 作者:kingmax54212008
  • 原文链接:https://blog.csdn.net/kingmax54212008/article/details/100730282
    更新时间:2023年1月11日08:59:40 ,共 16281 字。