Spring 4项目如何基于配置启用/禁用Azure或AWS的Memcache
Hey there! Let's tackle this problem step by step. The goal here is to enable Memcache for your Spring 4 app (deployed on Azure/AWS) without modifying business code or relying on Maven Profiles, using the XML-based configuration structure you want. Here's a practical, maintainable approach:
1. Define a Centralized Cache Property File
First, create a cache.properties file to control all cache-related settings—this will be your single source of truth for enabling/disabling cache and switching providers:
# Toggle cache on/off globally cache.enabled=true # Choose provider: "aws" or "azure" cache.provider=aws # AWS ElastiCache settings (only used when provider is aws) aws.memcache.servers=your-elasticache-cluster-endpoint:11211 # Azure Cache for Redis (Memcache-compatible) settings (only used when provider is azure) azure.memcache.servers=your-azure-memcache-endpoint:11211
2. Link Properties and Cache Config in applicationContext.xml
Update your main application context to pull in the property file and import the cache-specific config:
<!-- Load cache properties --> <context:property-placeholder location="classpath:cache.properties" /> <!-- Import the cache configuration --> <import resource="cacheConfig.xml" />
3. Build cacheConfig.xml with Runtime Profile Switching
We'll use Spring Runtime Profiles (not Maven Profiles—these are applied at runtime, so no compile-time changes needed) to switch between cache providers and enable/disable caching entirely. This keeps your codebase clean and environment-agnostic.
Here's the full cacheConfig.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cache="http://www.springframework.org/schema/cache" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> <!-- Enable Spring Cache Abstraction (works with both enabled/disabled states) --> <cache:annotation-driven cache-manager="cacheManager" /> <!-- Profile: Cache Enabled --> <beans profile="cache-enabled"> <!-- Profile: AWS Memcache (ElastiCache) --> <beans profile="cache-provider-aws"> <!-- Configure SpyMemcached client for AWS ElastiCache --> <bean id="memcachedClient" class="net.spy.memcached.MemcachedClient"> <constructor-arg> <bean class="net.spy.memcached.DefaultConnectionFactory" /> </constructor-arg> <constructor-arg value="${aws.memcache.servers}" /> </bean> <!-- Integrate with Simple Spring Memcache (SSM) --> <bean id="cacheManager" class="com.google.code.ssm.CacheManagerFactoryBean"> <property name="cacheClientFactory"> <bean class="com.google.code.ssm.providers.spymemcached.MemcacheClientFactoryImpl" /> </property> <property name="addressProvider"> <bean class="com.google.code.ssm.config.DefaultAddressProvider"> <property name="address" value="${aws.memcache.servers}" /> </bean> </property> <property name="configuration"> <bean class="com.google.code.ssm.providers.CacheConfiguration"> <property name="consistentHashing" value="true" /> <property name="expiration" value="3600" /> <!-- 1 hour default TTL --> </bean> </property> </bean> </beans> <!-- Profile: Azure Memcache --> <beans profile="cache-provider-azure"> <!-- Configure SpyMemcached client for Azure Cache --> <bean id="memcachedClient" class="net.spy.memcached.MemcachedClient"> <constructor-arg> <bean class="net.spy.memcached.DefaultConnectionFactory" /> </constructor-arg> <constructor-arg value="${azure.memcache.servers}" /> </bean> <!-- SSM Cache Manager for Azure --> <bean id="cacheManager" class="com.google.code.ssm.CacheManagerFactoryBean"> <property name="cacheClientFactory"> <bean class="com.google.code.ssm.providers.spymemcached.MemcacheClientFactoryImpl" /> </property> <property name="addressProvider"> <bean class="com.google.code.ssm.config.DefaultAddressProvider"> <property name="address" value="${azure.memcache.servers}" /> </bean> </property> <property name="configuration"> <bean class="com.google.code.ssm.providers.CacheConfiguration"> <property name="consistentHashing" value="true" /> <property name="expiration" value="3600" /> </bean> </property> </bean> </beans> </beans> <!-- Profile: Cache Disabled --> <beans profile="cache-disabled"> <!-- Use a no-op cache manager to ignore @Cacheable annotations --> <bean id="cacheManager" class="org.springframework.cache.support.NoOpCacheManager" /> </beans> </beans>
4. Activate Profiles at Runtime
To switch between environments or toggle caching, just set the spring.profiles.active property—no code changes needed:
- For AWS with cache enabled: Set JVM argument
-Dspring.profiles.active=cache-enabled,cache-provider-aws - For Azure with cache enabled: Set
-Dspring.profiles.active=cache-enabled,cache-provider-azure - Disable cache entirely: Set
-Dspring.profiles.active=cache-disabled
In cloud environments like Azure App Service or AWS Elastic Beanstalk, you can set this as an environment variable or application setting instead of JVM args.
5. Ensure Correct Dependencies
Add these to your pom.xml to get SSM and SpyMemcached working:
<dependencies> <!-- Spring Cache Abstraction --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.3.30.RELEASE</version> <!-- Match your Spring 4 version --> </dependency> <!-- Simple Spring Memcached --> <dependency> <groupId>com.google.code.simple-spring-memcached</groupId> <artifactId>spring-cache</artifactId> <version>3.6.0</version> </dependency> <dependency> <groupId>com.google.code.simple-spring-memcached</groupId> <artifactId>spymemcached-provider</artifactId> <version>3.6.0</version> </dependency> </dependencies>
Key Benefits of This Approach
- No code changes: All configuration is externalized, so your business logic stays clean.
- No Maven Profiles: Runtime profiles mean you don't need separate builds for different environments.
- Centralized control: A single
cache.propertiesfile manages all cache settings. - Seamless cloud deployment: Works natively with Azure/AWS environment variables.
内容的提问来源于stack exchange,提问作者navaltiger

