2016-05-09 1 views
7

Я создаю динамический компонент, используя "AutowireCapableBeanFactory" следующимКак включить кэш для метода внутри динамического боба

RegisterFoo.java

@Configuration 
public class registerFoo { 
    @Autowired 
    ApplicationContext appcontext; 

    AutowireCapableBeanFactory bf; 

    @PostConstruct 
    public void registerFoo() { 
     bf = appContext.getAutowireCapableBeanFactory(); 
     RootBeanDefinition def = new RootBeanDefinition(Foo.class); 
     ((DefaultListableBeanFactory)bf).registerBean("foo", def); 
    } 
} 

RegisterBar.java

@Configuration 
public class registerBar { 
    @Autowired 
    ApplicationContext appcontext; 

    AutowireCapableBeanFactory bf; 

    @PostConstruct 
    public void registerFoo() { 
     bf = appContext.getAutowireCapableBeanFactory(); 
     RootBeanDefinition def = new RootBeanDefinition(Bar.class); 
     Foo foo = (Foo) appContext.getBean("foo"); 
     ConstructorArgumentValues cav = new ConstructorArgumentValues(); 
     cav.add(0, foo.getValue()); 
     def.setArgumentValues(cav); 
     ((DefaultListableBeanFactory)bf).registerBean("bar", def); 
    } 
} 

Foo.class

public class Foo { 
    @Cacheable 
    public String getValue() { 
     // return value 
    } 
} 

Метод getValue() выполняет свое тело каждый раз. Spring не кэширует значение, как ожидалось. Какие-либо предложения?

+0

Любые входы здесь действительно оценены. – sag

+0

У вас есть другие места в приложении, где работает кеш? Кроме динамического компонента? – Patrick

+0

@Patrick - Да, он работает на нормальные бобы. т.е. бобы, созданные с помощью аннотации '' @ Bean''. – sag

ответ

1

Я думаю, что проблема в том, что когда весной зарегистрировать фасоль с аннотацией, то тогда после обработки с помощью постпроцессора компонента, который будет управлять @Cacheable

При регистрации вручную, пост-обработка не может сделано.

Не могу проверить это на данный момент, но вот где я буду смотреть первым.

Надеюсь, что эта помощь.