2016-10-07 2 views
1

私はアノテーションを使用して私のプロジェクトでスプリングキャッシングを使用しています。プロファイルに基づいて私はElasticacheとSimpleCacheManagerを使用しています。使用注釈は、私はどこでも私は好まないどのハードコードキャッシュ名「MyCacheという」に強制していますスプリングキャッシングとハードコードされたキャッシュ名

//For the initial configuration settings in some class when profile is cloud. 
@EnableElastiCache({@CacheClusterConfig(name = "MyCache", expiration = 86400)}) 

// For the initial configuration settings in some class when profile is non-cloud. 
SimpleCacheManager simpleCacheManager = new SimpleCacheManager(); 
     simpleCacheManager.setCaches(newArrayList(new ConcurrentMapCache("MyCache"))); 



@CacheConfig(cacheNames = {"MyCache"}) 
public class CachingRequiredClass{ 
........ 
    @Cacheable 
    public String blablaMethod(String id){ 
    ..... 
    } 
} 

public class SomeOtherClass{ 
    ...... 
    @Caching(evict={ 
     @CacheEvict(value="MyCache", key="T(com.myclass).myMethod()+':blablaMethod()'"), 
     @CacheEvict(value="MyCache", key="T(com.myclass).myMethod()+':blablaMethod()+':blablabla2Method()'") 
    }) 
    public void logout(){ 
    ...... 
    } 
} 

です。これを構成可能にする方法はありますか?どういうわけかプロパティファイルから来ますか?

答えて

1

いくつかのオプションがあります。

まず、Javaであるため、どこかに定数を作成して参照することができます。これらの場所ではSpELを使用できるので、${myCache}と書かれ、キャッシュの値を持つ環境にはmyCacheというプロパティがあります。

最後に、コードでキャッシュ名を指定するのではなく、CacheResolverを実装してプログラムで使用するキャッシュを決定することができます。ビジネスロジックに応じてキャッシュを変更する必要がない場合は、より多くの作業が必要となり、おそらく過剰な作業になります。

あなたが気にしている匂いの一部は、あまりにも多くのものに対して同じキャッシュを使用している可能性があるということです。あなたの最後の例では、keyという属性が私には心配しています。クラスとメソッドの名前をキーに追加する必要がある場合、同じキャッシュにあまりにも多くのものを置こうとしていると伝えます。このようにキャッシュを設計すべきではありません。それは単なるショートカットなので、手動で行う必要はありません。キャッシュの値を照会する場合は、クラスの名前とメソッドを使用してキーを計算することに真剣に取り組んでいますか?

+0

提案していただきありがとうございます。私はSpELの方法で試してみます。キャッシュのクエリの質問については、私はcom.myclass.myMethod()を呼び出すときにいくつかのユーザー固有のIDを返すキージェネレータを持っています。だからそれに基づいて追い払う。 – paramupk

+0

それは私がIMOを書いたものを変更しません。キャッシュを手動で操作する場合は、キーにメソッドの名前を含めないでください。物事があなたのために行われたら、それをしないでください、それは起こっていることを理解することが難しくなります。 –

関連する問題