为什么自动装配不能在线程中运行?

use*_*458 7 java spring multithreading task autowired

我在Spring 3.0中创建了一个maven项目,我已经制作了一些DAO,服务和控制器,在我的一个控制器中我调用了一个服务,我在其中启动一个线程,问题是在线程中我声明了一个"服务"变量"应该使用自动装配的注释进行初始化,但它不起作用,并且变量未被初始化并且值为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));
  }
}
Run Code Online (Sandbox Code Playgroud)

这是调用线程的代码段

    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);
Run Code Online (Sandbox Code Playgroud)

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

JB *_*zet 6

对于要被Spring自动装配一个bean,bean必须是一个Spring bean(即在context.xml文件中声明或使用Spring的注释(进行标注@Service,@Component等等).

当然,它必须由Spring实例化,而不是由您的代码实例化.如果你自己实例化一个Spring bean new,Spring不会知道bean,也不会注入任何东西.


Arn*_*ter 5

Spring只是自动装配上下文的bean,没有new创建的实例.但是为什么你声明uServicein AddFriendInMyFriendListTask而不是外部(bean)类的bean属性AddFriendInMyFriendListTaskExecutor,应该只是工作:

@Component
public class AddFriendInMyFriendListTaskExecutor {

  private class AddFriendInMyFriendListTask implements Runnable {

    private final User a;
    private final User b;

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

    public void run() {
      AddFriendInMyFriendListTaskExecutor.this.uService.insertRightUserIntoLeftUserListOfFriends(a, b);
    }
  }

  @Autowired
  private IUserService uService;

  @Autowired
  private TaskExecutor taskExecutor;

  public void doIt(User a, User b) {
    taskExecutor.execute(new AddFriendInMyFriendListTask(a, b));
  }
}
Run Code Online (Sandbox Code Playgroud)

(删除了一些未使用的getter/setter,并使taskExecutor也成为bean属性)