2016-02-25 89 views
0

我剛開始使用Spring緩存。春季緩存中的自定義密鑰生成

這是我所實現的高速緩存類:

@CacheConfig(cacheNames="empcache") 
public class General { 

    @Cacheable 
    public String getDetails(int empId) { 

     if(empId==1) { 
      System.out.println("Inside getDetails. Emp id is 1."); 
      return "Amar"; 
     } else { 
      System.out.println("Emp id is not 1."); 
      return "Anthony"; 
     } 
    } 
} 

這是一個自定義的豆,我將用戶密鑰生成:

@Component 
public class Temp { 

    private String name; 
    private String surname; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getSurname() { 
     return surname; 
    } 

    public void setSurname(String surname) { 
     this.surname = surname; 
    } 
} 

我的context.xml

<context:component-scan base-package="com.packages.beans" /> 
<cache:annotation-driven key-generator="enhancedDefaultKeyGenerator"/> 

<bean id ="enhancedDefaultKeyGenerator" class="com.packages.beans.myKeyGenerator"/> 

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" 
         p:cache-manager-ref="ehcache"/> 

<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" 
         p:config-location="classpath:ehcache.xml" p:shared="true"/> 

以下是自定義密鑰生成類:

public class MyKeyGenerator implements KeyGenerator { 

    @Autowired 
    private Temp temp1; 

    @Override 
    public Object generate(Object arg0, Method arg1, Object... arg2) { 

     String key = temp1.getName() + temp1.getSurname() + "_" + arg1.getName(); 
     System.out.println("key is "+key); 

     return key; 
    } 
} 

主要方法:

public static void main(String args[]) 
{ 
    Temp generate=new Temp(); 
    generate.setName("ABC"); 
    generate.setSurname("DEF"); 

    ApplicationContext context = new ClassPathXmlApplicationContext("context.xml"); 
    General main=(General) context.getBean("mybean"); 

    System.out.println(main.getDetails(main.getEmpId())); 
} 

當我正在從主要的方法時,設置臨時的值的程序。我將keyGenerator類中的鍵作爲null_null_getDetails而不是ABC_DEF_getDetails。

但我需要的鑰匙是由我預先填寫在自定義的bean temp中的值組成的。

+0

問題是相關的,與使用「新」創建自己的類的實例。當你執行generate = new temp();那麼spring不會管理這個實例。所以它不像你期望的那樣是@autowired。 –

+0

感謝您輸入它的工作 – sid297

回答

0

您在main中創建的'Temp'不屬於春季環境。 而是春天從

@Component 
public class Temp 

創建一個豆「臨時」但有名字和surename爲空。 Temp的這個實例用於您的keyGenerator,這就是爲什麼您在密鑰中得到空值的原因。

您必須使用已設置的名稱和姓氏創建一個Temp的bean。 在java中的配置,你可以這樣做:給Spring管理豆

@Bean 
Temp temp() { 
    Temp generate=new Temp(); 
    generate.setName("ABC"); 
    generate.setSurname("DEF"); 
    return temp; 
} 
+0

感謝您的答案現在的工作 – sid297