java - 在 Runnable 线程中访问 Spring bean

标签 java spring multithreading spring-mvc executorservice

我需要在下面的可运行线程中访问 Spring bean(featureServiceuxService),但是我得到的是 nullapplicationContext 因此我无法在 Runnable 中获取 Spring bean。我想知道是否可以在可运行的内部访问 spring bean?如果不是,请建议我另一种方法。

我正在使用 Spring 4.0.6Java 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/

相关文章:

java - Windows 中非管理员权限所需文件的 Log4j 属性

java - 为什么Spring Security不提供密码的字符数组参数

java - Jackson ObjectMapper hibernate 问题

java - 未能执行 AirportWeb 项目的目标

java - 从 Marshmallow 升级到 Nougat 后,Android 方法性能突然变慢

c++ - 在 C++Amp 中并行的几个算术运算

java - 一个程序(eclipse Mars)需要java 8,一个程序(控制台应用程序)需要java 7 怎么办?

java - 无法安装我自己的 ElasticSearch 插件

java - Spring MVC 与 OSGi - 如何注册新 Controller - 第二部分?

multithreading - 与GCD并行进行光线追踪时,线程捕获了正在燃烧的CPU