我需要在下面的可运行线程中访问 Spring bean(featureService
和 uxService
),但是我得到的是 null
值 applicationContext
因此我无法在 Runnable 中获取 Spring bean。我想知道是否可以在可运行的内部访问 spring bean?如果不是,请建议我另一种方法。
我正在使用 Spring 4.0.6
和 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;
}
}
我调用runnable如下
ExecutorService es = Executors.newCachedThreadPool();
es.execute(new UserMenuUpdateTask(activeUsers));
最佳答案
ApplicationContextAware
是 Spring 用来将其上下文设置为 Spring 本身管理(知道)的 bean 的接口(interface)。由于您自己创建了 UserMenuUpdateTask
,因此 Spring 甚至不知道该实例,也无法设置该字段。
如果您不需要为每个调用/每个线程创建一个新的 runnable 实例(即如果 UserMenuUpdateTask
是无状态或线程安全的),您可以让 Spring 管理它(通过注解)或 XML 配置)并在 ExecutorService.execute()
中使用 Spring 实例化的实例。
如果每次都需要 UserMenuUpdateTask
的新实例,则需要创建调用类 ApplicationContextAware
(假设它的实例由 Spring 管理),并在将指针提供给 ExecutorService
之前,在 UserMenuUpdateTask
中设置指向应用程序上下文的指针。
关于java - 在 Runnable 线程中访问 Spring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38379836/