为什么Spring autowire会失败?

为什么Spring autowire会失败?,spring,timer,autowired,Spring,Timer,Autowired,我把ApplicationConfiguration服务像这样自动连接到了所有地方,它工作得很好。正在扫描此类的包,因此这不是问题所在。这可能与调用此特定方法的方式有关。我有一个servlet,它在所有其他servlet之后加载,它触发一个计时器,以60秒的延迟执行上述方法。我想所有的自动布线都应该完成 @Service public class LogProcessorServiceImpl { @Autowired private static ApplicationConf

我把ApplicationConfiguration服务像这样自动连接到了所有地方,它工作得很好。正在扫描此类的包,因此这不是问题所在。这可能与调用此特定方法的方式有关。我有一个servlet,它在所有其他servlet之后加载,它触发一个计时器,以60秒的延迟执行上述方法。我想所有的自动布线都应该完成

@Service
public class LogProcessorServiceImpl {
    @Autowired
    private static ApplicationConfigurationService applicationConfigurationService;

    public static void processPageRequestsLogs() {
        if(applicationConfigurationService==null) {
            System.out.println("autowire failed");
        }
以下是在我真正使用ApplicationConfiguration Service时发生的情况:

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);
     }
==2012-11-18============================================================


另请参见:

您不能在Spring中自动关联静态字段,下面将对此进行讨论

或者,如果您的
LogProcessorService
驻留在中,您可以 使用Spring实用程序类自动连接它

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)
一般来说,应该避免使用Java单例,因为使用Spring单例就足够了

另外,如果您使用
@Service
注释声明了
LogProcessorServiceImpl
,这意味着它是一个Spring单例,因此您不应该在那里使用静态字段


这个答案是关于自动生成的,它假定TimeTebug的想法是正确的,在实际应用程序中考虑使用

证明我撒谎了,这是我唯一尝试自动写静态属性的地方。注释应该检测到它被放置在静态属性上,并报告其问题。我想知道,在没有Spring的情况下重新开始我的项目之前,我还要在Spring上浪费多少时间。谢谢,Boris。@jacekn只是一点澄清-这里我们手动自动连接ProcessSchedulerServlet的字段,因为Servlet是用Servlet容器而不是Spring应用程序上下文实例化的。应用程序服务是Spring管理的主要候选对象,因此将它们放在Spring容器中是合理的。
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);