Вы делаете вещи более сложными, чем необходимо. Spring может обработать расписание для вас, что заставит работать autowaring. Без необходимости указывать все шаблоны.
В основном угробите MyRunnable
, не расширяйте TimerTask
в вашем MyTask
. Аннотируйте ваш MyTask
как @Component
и добавьте @Scheduled
к методу, который вы хотите выполнить. (Поскольку вы расширили TimerTask
изначально, возможно, run
метод).
@Component
public class MyTask {
@Autowired
private Service service;
@Scheduled(cron = "0 0 5 * * *")
public void run() { ... }
}
Если вы действительно хотите сохранить сложность, вы можете сделать 2 вещи. Добавьте аннотацию @Component
к MyTask
и добавьте ее в MyRunnable
, используйте эту ссылку в планировании. Или вы можете удалить @Autowired
, создать поле final
и создать конструктор, который принимает зависимость Service
и выполняет настройку в конструкторе.
Однако я настоятельно рекомендую использовать более простой @Scheduled
, и если вам нужна начальная задержка, поместите это вычисление в отдельный компонент и используйте выражение SpEL, чтобы получить initialDelay
.