Можем ли мы автоматически связать экземпляр класса в пользовательском классе Thread? - PullRequest
2 голосов
/ 24 января 2020

У меня есть класс, который расширяет класс Thread, как показано ниже:

public class A extends Thread {  

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

}

У меня есть класс обслуживания, подобный приведенному ниже:

@Service
public class Service {

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

}

Как я могу автоматически связать экземпляр класса обслуживания внутри мой класс темы?

Ответы [ 6 ]

1 голос
/ 24 января 2020

Вы можете определенно автоматически подключить.

пример приведен ниже.

@Component
class A extends Thread{

 @Autowired
 Service service;

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

}

Вы должны зарегистрировать свой класс потока в контексте приложения весны с помощью @ component,@service или создание компонента с помощью @bean в классе конфигурации.

1 голос
/ 24 января 2020

Вы можете сделать class A компонентом Spring и затем добавить зависимость:

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

}

Тем не менее, обратите особое внимание на то, что вы делаете внутри run()

1 голос
/ 24 января 2020

Ответ на ваш вопрос - ДА. Вы можете использовать autowired в классе потока.

Посмотрите на эту тему

0 голосов
/ 26 января 2020

Есть много способов сделать это. Некоторые из них приведены ниже:

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. Использование @Autowired с методом установки Service:

@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 для получения более подробной информации.

0 голосов
/ 26 января 2020

Да, вы можете подключиться автоматически, как уже предлагали наши коллеги. Тем не менее, я хотел бы подчеркнуть один момент: класс должен быть весенним бобом. Spring может автоматически что-то связывать, только если сам класс управляется Spring.

Как только вы это сделаете, вы должны понимать, что по умолчанию spring создает bean-компонент, вызывая new A() во время инициализации, но не вызывает start для вас. Другая интересная идея заключается в том, что Thread будет создан только один раз (по умолчанию все bean-компоненты являются синглетонами весной), поэтому, если вам нужно много экземпляров A, вы можете объявить его как Prototype Scope.

0 голосов
/ 26 января 2020

Да, возможно автоматическое подключение экземпляра в классе Thread.

Исходный код приведен ниже:

@Component
public class A extends Thread {

  @Autowired
  private Service service;

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

  public void someMethod() {
     service.someMethod();
  }  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...