2016-05-09 2 views
7

Ich bin eine dynamische Bohne zu schaffen mit "AutowireCapableBeanFactory", wieWie Cache für eine Methode in dynamischen Bean ermöglichen

folgt

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 
    } 
} 

Die Methode getValue() führt ihren Körper jedes Mal aus. Spring speichert den Wert nicht wie erwartet. Irgendwelche Vorschläge?

+0

Alle Eingänge hier wirklich geschätzt. – sag

+0

Haben Sie andere Orte in Ihrer Anwendung, wo der Cache funktioniert? Außer der dynamischen Bohne? – Patrick

+0

@Patrick - Ja, es funktioniert für normale Bohnen. d. h. die Bohnen, die mit der Anmerkung '' @ Bean''' erstellt wurden. – sag

Antwort

1

ich glaube, das Problem ist, dass, wenn der Frühling eine Bohne mit Annotation registrieren, ist es dann nachbearbeitet von einem Bean-Postprozessor, der @Cacheable verwalten

Wenn Sie es manuell registrieren, die Nachverarbeitung möglicherweise nicht fertig werden.

Ich kann es nicht für den Moment überprüfen, aber das ist, wo ich zuerst schauen werde.

Hoffe diese Hilfe.

Verwandte Themen