java - 为什么 Autowiring 在线程中不起作用?

标签 java multithreading spring task autowired

我在 Spring 3.0 中创建了一个 maven 项目,我创建了一些 DAO、服务和 Controller ,在我的一个 Controller 中我调用了一个服务,在该服务中我启动了一个线程,问题是在我声明的线程中应该使用 Autowiring 注解初始化的“服务变量”,但它不起作用并且变量未初始化且值为 null。

这是线程类

package com.project.tasks;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Component;

import com.project.entities.user.User;
import com.project.services.IUserService;

@Component
public class AddFriendInMyFriendListTaskExecutor {
private class AddFriendInMyFriendListTask implements Runnable {


     // HERE IS THE PROBLEM
    @Autowired
    private IUserService uService;

    private User a;
    private User b;

    public AddFriendInMyFriendListTask() {
        ;
    }

    public AddFriendInMyFriendListTask(User aA, User bB) {
        a = aA;
        b = bB;
    }

    public User getA() {
        return a;
    }
    public void setA(User a) {
        this.a = a;
    }
    public User getB() {
        return b;
    }
    public void setB(User b) {
        this.b = b;
    }


    public void run() {
                    // FROM HERE IT PRINTS THE VALUE OF uService THAT IS NULL
        System.out.println("uService:" + uService);
        uService.insertRightUserIntoLeftUserListOfFriends(a, b);
    }
}

private TaskExecutor taskExecutor;

  public AddFriendInMyFriendListTaskExecutor(TaskExecutor taskExecutor) {
    this.taskExecutor = taskExecutor;
  }

  public void doIt(User a, User b) {
      taskExecutor.execute(new AddFriendInMyFriendListTask(a, b));
  }
}

这是调用线程的一段代码

    User a = uDao.getUser(hrA.getMyIdApp());
    User b = uDao.getUser(hrA.getOtherIdApp());
    SimpleAsyncTaskExecutor taskExecutor = new SimpleAsyncTaskExecutor();
    AddFriendInMyFriendListTaskExecutor tmp = new AddFriendInMyFriendListTaskExecutor(taskExecutor);
    tmp.doIt(a, b);

我想强调的是,在我没有调用任何线程的所有其他测试中,UserService 实例的 Autowired 功能正常! 我调用的方法:insertRightUserIntoLeftUserListOfFriends(User a, User b),工作正常。

最佳答案

对于要由 Spring Autowiring 的 bean,bean 必须是 Spring bean(即在 context.xml 文件中声明或使用 Spring 注释进行注释(@Service @Component等)。

当然,它必须由 Spring 实例化,而不是由您的代码实例化。如果您使用 new 自己实例化一个 Spring bean,则 Spring 不知道该 bean,也不会向其中注入(inject)任何内容。

关于java - 为什么 Autowiring 在线程中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7405232/

相关文章:

java - 当对象的类存储在外部 jar 中时,如何反序列化对象?

java - 我可以将 Eclipse 设置为忽略 "Unhandled exception type"

java - Spring @Qualifier 不起作用,但 @Resource 起作用?

java - 为什么我不能在 Java 中解析模式为 "MMMMM dd"的 SimpleDateFormat?

java - 当每个 case block 都有相同的代码时,在 switch-case 语句中使用什么?

java - newSingleThreadExecutor 并行用例

java - 没有 Activity 的 runOnUiThread

java - 超时后调用方法

java - MySQLIntegrityConstraintViolationException : column "question_id" cannot be null error

java - 动态创建 spring bean 并更改现有 bean 的属性