首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring缓存中的自定义键生成

Spring缓存中的自定义键生成
EN

Stack Overflow用户
提问于 2016-02-26 02:54:18
回答 1查看 2.5K关注 0票数 0

我刚刚开始研究Spring缓存。

这是我在其中实现缓存的类:

代码语言:javascript
复制
@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";
        }
    }
}

这是一个自定义bean,我将使用它来生成密钥:

代码语言:javascript
复制
@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

代码语言:javascript
复制
<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"/>

下面是自定义密钥生成类:

代码语言:javascript
复制
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;
    }   
}

Main方法:

代码语言:javascript
复制
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()));
}

当我从main方法运行程序时,在其中设置temp的值。我在keyGenerator类中以null_null_getDetails而不是ABC_DEF_getDetails的身份获取密钥。

但是我需要这个键由我在自定义bean temp中预先填充的值组成。

EN

回答 1

Stack Overflow用户

发布于 2016-02-26 03:09:57

您在main中创建的“Temp”不是spring上下文的一部分。相反,spring从创建一个bean‘temp

代码语言:javascript
复制
@Component
public class Temp

但是他们的名字和姓氏是空的。这个Temp实例用于您的keyGenerator,这就是为什么您在键中获取空值的原因。

您必须使用已设置的名称和姓氏创建Temp的bean。在java config中,您可以这样做:

代码语言:javascript
复制
@Bean
Temp temp() {
   Temp generate=new Temp();
   generate.setName("ABC");
   generate.setSurname("DEF");
   return temp; 
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35635892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档