五、Spring 3.1新規キャッシュメカニズム

8231 ワード

Springキャッシュを有効にする:
Springプロファイルは特にキャッシュにcache:名前空間を提供しています.Springキャッシュを有効にするためには、設定ファイルにcache:名前空間を導入する必要があります.contextをインポートします.名前空間の後、Springキャッシュを有効にするにはまだ2ステップが必要です.
  • は、注釈に従ってビーンレベルまたは方法レベルのキャッシュを有効にするSpringを指定するSpringプロファイルに追加される.
  • は、異なるキャッシュに対応するキャッシュマネージャを構成することを実現する.
  • 1、Spring内蔵キャッシュ実現の構成:
    Spring内蔵のキャッシュはメモリの中のキャッシュだけで実現されています.本当のキャッシュでは実現されていませんので、通常は簡単なテスト環境だけに利用できます.実際のプロジェクトではSpring内蔵キャッシュを使用することは推奨されません.Spring内蔵のキャッシュは、キャッシュマネージャとしてSimpleCacheManagerを使用して、SimpleCacheManager設定キャッシュを使用するのは非常に簡単で、Spring容器に直接このBenを配置し、このキャッシュマネージャを駆動してsetCaches()を実行する方法でキャッシュエリアを設定すれば良いです.SimpleCacheManagerはメモリの中のキャッシュエリアで、下の階に直接JDKのConcerentMapを使ってキャッシュを実現しています.SimpleCacheManagerはConcerentMapCacheFactoryBenをキャッシュエリアとして使用しています.各ConcerentMapCacheFactoryBenにキャッシュエリアを配置しています.
    
    
        
         
             
                 
                 
                  
            
         
    
    
    2、EhCacheキャッシュ実現の構成:
    EhCacheキャッシュを設定する前に、まずEhCacheキャッシュのJARパケットをクラスローディングパスに追加する必要があります.Hibernate解圧経路の下でlib\optional\ehcache\経路下のehcache-coree-24.30.jarとslaf 4 j-appi-1.6.1.jarをプロジェクトのロードパスの下にコピーすればいいです.
    EhCacheを使用するためには、アプリケーションのクラスローディングパスにehcache.xmlプロファイルを追加する必要があります.下の二つのキャッシュエリアを設定します.ehcache.xml
    
    
        
        
    
    
    
    @Cachebaleを使ってキャッシュを実行します.
    @cacheableは、クラスまたは修飾方法を修飾するために用いることができ、@Cachebale修飾クラスを使用する場合、クラスレベルで高数Springをキャッシュするために使用される---プログラムは、クラスのインスタンスを呼び出すためのいかなる方法でもキャッシュが必要となり、同じキャッシュエリアを共有する.@Cachebale修飾方法を使用する場合、Springに方法レベルでキャッシュを行うように教えるためには、この方法を起動するときにのみキャッシュが必要となります.
    1、クラスレベルのキャッシュ:
    @service("userService")
    @Cacheable(value="users")
    public class UserServiceImpl implements UserService{
        public User getUsersByNameAndAge(String name,int age){
            System.out.println("--    findUsersByNameAndAge()    --");
            return new User(name,age);
        }
        public User getAnotherUser(String name,int age){
            System.out.println("--    findAnotherUser()    --");
            return new User(name,age);
        }
    }
    
    ここでいうキャッシュの意味は、プログラムが初めてこのクラスのインスタンスを呼び出すある方法の場合、Springキャッシュメカニズムは、この方法で返されたデータを指定されたキャッシュエリアに入れるということです.つまり@Cachebale注釈のvalue属性値で指定されたキャッシュエリアです..以降、このクラスのインスタンスのいずれかの方法が起動されると、Springは、入力されたパラメータが同じであれば、この方法を本当に指定するのではなく、キャッシュ領域のデータを直接利用することになる.
    public class SpringTest{
        public static void main(String[] args){
            ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
            UserService us=ctx.getBean("userService",UserService.class);
            //     us            ,         
            User u1=us.getUserNynameAndAge("  ",500);
            //     us               ,         
            User u2=us.getAnotherUser("  ","500");
            System.out.println(u1==u2);
        }
    }
    
    出力:
    --    findUsersByNameAndAge()    --
    true
    
    クラスレベルのキャッシュは、デフォルトでは、すべての方法のパラメータをkeyとしてキャッシュし、方法によって戻ります.同じクラスのデータは、どの方法を呼び出しても、メソッドを呼び出した時に入ってきたパラメータが同じであれば、Springはキャッシュエリアのデータをそのまま利用します.@Cachebaleを使用すると、次の属性を指定できます.
  • value:必須属性です.この属性は、指定されたキャッシュエリアにメソッドの戻り値を入れることを指定するために、多バッファの名前を指定することができます.
  • key:SpEL表現により指定されたキャッシュのkeyを表示します.
  • condition:この属性はbootleanに戻るためのSpEL式を指定しています.この表現がtrueに戻るときだけ、Springは方法の戻り値をキャッシュします.
  • unless:この属性はbootleanに戻るべきSpEL式を指定し、式がtrueに戻るとSpringは戻り値をキャッシュしません.
  • @Cachebale注解機能と似ているのは@CachePut注解がもう一つあります.@CachePut注解も同じです.Springに方法の戻り値をバッファエリアに入れます.@Cacheableと違って、@CachePut修飾の方法はキャッシュエリアのデータを読み取ることができません.つまり、キャッシュエリアにデータがあるかどうかに関わらず、@CachePutはSpringにこれらの方法を再実行するように教えて、再び方法をバッファエリアに戻します.
    condition属性は、unless属性の機能と基本的に似ていますが、規則は正反対です.condtionで指定された条件がtrueである場合、Springキャッシュメカニズムはキャッシュを実行します.unlessが指定した条件がtrueである場合、Springキャッシュ機構はキャッシュを実行しません.
    @service("userService")
    @Cacheable(value="users" condition="#age<100")
    public class UserServiceImpl implements UserService{...}
    
    public class SpringTest{
        public static void main(String[] args){
            ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
            UserService us=ctx.getBean("userService",UserService.class);
            //     age     100,      
            User u1=us.getUsersByNameAndAge("  ",500);
            User u2=us.getAnotherUser("  ",500);
            System.out.println(u1==u2);//  false
            //     age    100,     
            User u3=us.getUsersByNameAndAge("  ",50);
            User u4=us.getAnotherUser("  ",50);
            System.out.println(u3==u4);//  true
        }
    }
    
    2、方法レベルのキャッシュ:
    @Caheable修飾方法を使用すると、Springを制御して方法レベルでキャッシュすることができ、このようにプログラムが起動されると、入力されたパラメータが同じであれば、Springはキャッシュを使用する.
    @service("userService")
    public class UserServiceImpl implements UserService{
       @Cacheable(value="user1")
       public User getUsersByNameAndAge(String name,int age){
            System.out.println("--    findUsersByNameAndAge()    --");
            return new User(name,age);
        }
        @Cacheable(value="user2")
        public User getAnotherUser(String name,int age){
            System.out.println("--    findAnotherUser()    --");
            return new User(name,age);
        }
    }
    
    上の二つのプログラムはそれぞれusers 1、users 2のキャッシュエリアを使用していますので、ehcache.xmlファイルにこの二つのキャッシュエリアを配置する必要があります.
    public class SpringTest{
        public static void main(String[] args){
            ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
            UserService us=ctx.getBean("userService",UserService.class);
            //     us            ,         
            User u1=us.getUserNynameAndAge("  ",500);
            //  getAnotherUser()          ,      getUserNynameAndAge()       
            User u2=us.getAnotherUser("  ","500");
            System.out.println(u1==u2);//  false
            //getAnotherUser()          ,         
            User u3=us.getAnotherUser("  ","500");
            System.out.println(u2==u3);//  true
        }
    }
    
    @Cacheevictを使ってキャッシュをクリアします.
    @Cacheevictに注釈されて修飾された方法はキャッシュをクリアするために使用できます.@Cacheevictで注釈すると、下記の属性を指定できます.
  • value:必須属性.どのキャッシュエリアのデータを消去するかを指定する方法です.
  • all Enties:この属性はキャッシュエリア全体の内容をクリアするかどうかを指定します.
  • before Invocation:この属性は、方法を実行する前にキャッシュをクリアするかどうかを指定します.デフォルトは、メソッドの実行に成功した後にキャッシュをクリアします.
  • condition:この属性はSpEL式を指定し、この表現がtrueである場合にのみキャッシュをクリアします.
  • key:SpEL式でキャッシュ指定のkeyを表示します.
  • @service("userService")
        @Cacheable(value="users")
    public class UserServiceImpl implements UserService{
       
       public User getUsersByNameAndAge(String name,int age){
            System.out.println("--    findUsersByNameAndAge()    --");
            return new User(name,age);
        }
        
        public User getAnotherUser(String name,int age){
            System.out.println("--    findAnotherUser()    --");
            return new User(name,age);
        }
        //  name、age      
        @CacheEvict(value="users")
        public void evictUser(String name,int age){
            System.out.println("--    "+name+","+age+"     --")
        }
        
        //    user          
        @CacheEvict(value="users",allEntries=true)
        public void evictALL(){
            System.out.println("--        --")
        }
    }