public class ProcessSchedulerServlet implements javax.servlet.Servlet {
Timer timer=new Timer();
@Override
public void init(ServletConfig arg0) throws ServletException {
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
LogProcessorService logProcessorService=new LogProcessorServiceImpl();
logProcessorService.processPageRequestsLogs();
}
}, 60*1000, 120*1000);
}
Это некрасиво, и это все равно не работает. LogProcessorServiceImpl имеет свойства с @Autowired аннотацией. При запуске этого кода эти свойства не автоувеличиваются. Это можно ожидать.Как проехать автостраду?
Реальный вопрос: как это сделать работать() метод работать. Мне кажется, что Spring хочет, чтобы функция logProcessorService была автоматически отлажена, чтобы иметь свойства в Autovired LogProcessorServiceImpl.
=== СЦЕНАРИЙ 1 ==================================================================================================================== =====================
public void run() {
final LogProcessorService logProcessorService=null;
WebApplicationContextUtils.getWebApplicationContext(arg0.getServletContext()).getAutowireCapableBeanFactory().autowireBean(logProcessorService);
logProcessorService.processPageRequestsLogs();
}
Результат: ошибка компиляции времени: не удается обратиться к неконечное переменной arg0 внутри внутреннего класса, определенного в другой метод
=== СЦЕНАРИЙ 2 ====================================== =======================
@Autowired
LogProcessorService logProcessorService;
public void run() {
logProcessorService.processPageRequestsLogs();
}
Результат: ошибка времени выполнения: logProcessorService нулевой;
==== РЕШЕНИЕ (от Бориса) ========================================== =================
public class ProcessSchedulerServlet implements javax.servlet.Servlet {
Timer timer=new Timer();
@Autowired
LogProcessorService logProcessorService;
@Override
public void init(ServletConfig arg0) throws ServletException {
final AutowireCapableBeanFactory autowireCapableBeanFactory=WebApplicationContextUtils.getWebApplicationContext(arg0.getServletContext()).getAutowireCapableBeanFactory();
autowireCapableBeanFactory.autowireBean(this);
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
logProcessorService.processPageRequestsLogs();
}
}, 60*1000, 120*1000);
}
что не так с руководством по автопостановке, показанным в [моем ответе] (http://stackoverflow.com/questions/13437741/why-would-spring-autowire-fail/13437803#13437803)? Почему вы создаете LogProcessorService с новым оператором вместо делегирования его создания в контейнер Spring? –
Борис, ничего, что я пытаюсь, работает. Я просто отправляю другой вопрос с меньшей информацией и более прямой проблемой, чтобы люди не переваривали всю мою логику. Это прямо сейчас должно быть очень простой проблемой для понимания. Невозможно autowire статическое свойство, поэтому я пытаюсь выполнить реализацию напрямую. Не повезло. Что бы вы сделали с этим? Ответ должен иметь дело непосредственно с двумя строками в методе run(). – jacekn
RE 'LogProcessorServiceImpl имеет свойства с @Autowired annotation', что означает, что это скорее Spring; вы все равно можете выполнять ручное автообучение 'WebApplicationContextUtils.getWebApplicationContext (arg0.getServletContext()) .getAutowireCapableBeanFactory(). autowireBean (logProcessorService);' но нет объективной причины для этого, так как предполагается, что это будет Spring bean - то есть созданный и автообновленный с помощью Весенний контейнер. –