我们可以在自定义Thread类中自动装配类实例吗?

时间:2020-01-24 05:23:35

标签: java multithreading spring-mvc

我有一个扩展Thread类的类,如下所示:

public class A extends Thread {  

    public void run() {
      System.out.println("in thread");
    }

}

我下面有一个这样的服务类:

@Service
public class Service {

    public void someMethod() {
      .....
    } 

}

如何在我的线程类中自动装配服务类实例?

6 个答案:

答案 0 :(得分:1)

您的问题的答案为是。您可以在线程类中使用自动装配。

看看at this thread

答案 1 :(得分:1)

您可以使class A成为Spring组件,然后注入依赖项:

@Component
class A extends Thread{  
    public void run()
    {
     System.out.println("in thread");
    }

}

也就是说,请特别注意run()

中的操作

答案 2 :(得分:1)

您绝对可以自动接线。

示例如下。

@Component
class A extends Thread{

 @Autowired
 Service service;

 public void run(){
      System.out.println("HI");
     serivce.anyMethod();
 }

}

您应该在Spring应用程序上下文中通过@ component,@ service注册线程类,或者通过@bean在配置类中创建bean。

答案 3 :(得分:0)

是的,可以在Thread类中自动装配实例。

源代码如下:

@Component
public class A extends Thread {

  @Autowired
  private Service service;

  public void run() {
     System.out.println("in thread");
  }

  public void someMethod() {
     service.someMethod();
  }  
}

答案 4 :(得分:0)

是的,您可以按照我们的同事的建议自动接线。但是,我想强调一点:该类必须是Spring bean。仅当类本身由Spring管理时,Spring才能自动进行接线。

一旦这样做,您应该了解默认情况下,spring会在初始化期间通过调用new A()创建一个bean,但是不会为您调用start。另一个有趣的见解是,此Thread仅创建一次(默认情况下,所有bean在春季都是单例的),因此,如果要使用A的许多实例,则可能需要将其声明为原型范围。

答案 5 :(得分:0)

您可以通过多种方式进行操作。其中一些内容如下:

A。。将@Autowired与成员变量Service一起使用:

@Component
public class A extends Thread {     
    @Autowired
    private Service service;

    public void run() {
      System.out.println("in thread");
    }
}

B。。将@Autowired与构造函数结合使用来初始化Service的成员变量:

@Component
public class A extends Thread {         
    private Service service;

    @Autowired
    public A(Service service) {
        this.service = service;
    }

    public void run() {
      System.out.println("in thread");
    }
}

C。。将@AutowiredService的设置方法一起使用:

@Component
public class A extends Thread { 
    private Service service;

    @Autowired
    public void setService(Service service) {
        this.service = service;
    }

    public void run() {
      System.out.println("in thread");
    }
}   

请检查https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-autowire以获得更多详细信息。