@Service
public class LogProcessorServiceImpl {
@Autowired
private static ApplicationConfigurationService applicationConfigurationService;
public static void processPageRequestsLogs() {
if(applicationConfigurationService==null) {
System.out.println("autowire failed");
}
我将ApplicationConfigurationService服务自动装配到这个地方,并且工作正常。正在扫描此类包,这不是问题所在。它可能与调用此特定方法的方式有关。我有一个servlet,它在所有其他servlet之后被加载,它会触发一个执行上述方法的计时器,延迟时间为60秒。我假设应该完成所有自动装配。
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() {
LogProcessorServiceImpl.processPageRequestsLogs();
}
}, 60*1000, 120*1000);
}
只要我真的使用ApplicationConfigurationService,就会发生这种情况:
autowire failed
Exception in thread "Timer-1" java.lang.NullPointerException
at com.siteadmin.services.impl.LogProcessorServiceImpl.processPageRequestsLogs(LogProcessorServiceImpl.java:39)
at com.siteadmin.servlets.ProcessSchedulerServlet$1.run(ProcessSchedulerServlet.java:20)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
=== 2012-11-18 ======================================= =====================
答案 0 :(得分:3)
您无法在Spring中自动装配静态字段,这将在here
中进行讨论另外,如果您的LogProcessorService
位于root web application context,则可以
使用Spring WebApplicationContextUtils实用程序类自动装配它。
public class ProcessSchedulerServlet implements javax.servlet.Servlet {
Timer timer=new Timer();
@Autowired
LogProcessorService logProcessorService;
@Override
public void init(ServletConfig arg0) throws ServletException {
WebApplicationContextUtils.getWebApplicationContext(arg0.getServletContext())
.getAutowireCapableBeanFactory().autowireBean(this);
final LogProcessorService svc = this.logProcessorService;
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
svc.processPageRequestsLogs();
}
}, 60*1000, 120*1000);
一般来说,你应该避免使用Java单例,使用Spring单例就足够了。
此外,如果您使用LogProcessorServiceImpl
注释声明@Service
,则表示它是一个Spring单例,因此您根本不应使用静态字段。
P.S。这个答案是关于自动装配的,它假设TimerTask的想法是正确的,在真正的应用程序中考虑使用Spring Scheduling API