Ich brauche Spring-Beans zugreifen (featureService
und uxService
) in meinem ausführbaren Thread unten, aber sind immer null
Wert für applicationContext
daher könnte ich Frühling Bohnen im Innern des Runnable bekommen. Ich frage mich, ob es möglich ist, auf Frühlingsbohnen in einem Runnable zuzugreifen oder nicht? Wenn nicht, bitte schlagen Sie mir einen alternativen Ansatz vor.Zugriff auf Frühling Bohnen in ausführbarem Thread
Ich bin mit Spring 4.0.6
und Java 8
@Component
public class UserMenuUpdateTask implements Runnable, Serializable, ApplicationContextAware {
private static final long serialVersionUID = 3336518785505658027L;
List<User> userNamesList;
FeatureService featureService;
UXService uxService;
private ApplicationContext applicationContext;
public UserMegaMenuUpdateTask() {}
public UserMegaMenuUpdateTask(List<User> userNamesList) {
this.userNamesList = userNamesList;
}
@Override
public void run() {
try {
for (User user : userNamesList) {
featureService = (FeatureService) applicationContext.getBean("featureService");
uxService = (UxService) applicationContext.getBean("uxService");
//.........
}
} catch (BaseApplicationException ex) {
throw new BaseApplicationException(ex);
}
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}
Ich rufe die runnable wie unten
ExecutorService es = Executors.newCachedThreadPool();
es.execute(new UserMenuUpdateTask(activeUsers));
Rufst du 'setApplicationContext()', bevor es ausgeführt wird? Sie sollten uns auch zeigen, wie Sie das Runnable verwenden. –
@JiriTousek 'setApplicationContext()' soll von 'Spring'-Container beim Programmstart aufgerufen werden ..? Ich habe den Code für den Aufruf der Runnable aktualisiert – RanPaul
Nur auf die Bohnen (Objekte), die es kennt. Du erstellst eine lokale Instanz in deinem Code, über die Spring keine Ahnung hat (Spring verwendet keine Magie, auch wenn es manchmal so scheint :) –