2017-02-21 13 views
1

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

@Autowired 
public void setUserDao(UserDao userDao) { 
    this.userDao = userDao; 
} 

Я хочу, чтобы начать новую нить менеджера и передать этот дао в конструкторе.

new MyThread(userDao).start(); 

Это безопасно? Или возможно? Если нет, как я могу это сделать?

Благодарим вас за ответ.

+0

Почему вы хотите передать существующий dao, вместо того, чтобы использовать весну в MyThread для инъекций? – azurefrog

+0

Мне нужно сделать сложный/длинный код на фоне –

+0

Считаете ли вы использование Spring @ «@Async» или ExecutorService от Java? –

ответ

0

Создайте функцию, которая принимает ваш DAO в качестве параметра. Комментирование функцию с @Aysnc

При вызове функции, имейте в виду следующее:

  • При вызове аннотированный функцию Async из того же класса, вызов будет синхронным (это связано с проксированном объекты)
  • методы Async не будут участвовать в том же контексте транзакции в качестве вызывающей

Этот подход побуждает вас думать о своей классовой структуре и следует поощрять. Например, вы можете также обернуть его с помощью @Retryable в случае сбоя.

Конечно, вы также сделать что-то вроде

ExecutorService executorService = Executors.newFixedThreadPool(3); 
MyWorker worker = new MyWorker(UserDao userDao); 
executorService.submit(worker); 

private class MyWorker implements Callable { 
    private UserDao userDao 
    MyWorker(UserDao userDao){ 
     this.userDao = userDao; 
    } 

    public void call() { 
     .. do something 
    } 
} 

Но это намного больше кода.

 Смежные вопросы

  • Нет связанных вопросов^_^