Spring中具有分阶段接口的上下文加载程序控制

Spring中具有分阶段接口的上下文加载程序控制,spring,Spring,我试图控制上下文加载过程。正如我在Spring参考文档中所读到的,我决定使用Spring提供的分阶段接口 启动时,具有最低相位的对象首先启动 停止时,按照相反的顺序进行操作。因此,一个对象 实现SmartLifecycle,其getPhase()方法返回 Integer.MIN_值将在第一个开始和最后一个开始之间 停止在光谱的另一端,相位值为 Integer.MAX_值将指示应启动对象 最后一个并首先停止(可能是因为它依赖于其他进程) 正在运行)。当考虑相位值时,它也很重要 要知道任何“正常”生

我试图控制上下文加载过程。正如我在Spring参考文档中所读到的,我决定使用Spring提供的分阶段接口

启动时,具有最低相位的对象首先启动 停止时,按照相反的顺序进行操作。因此,一个对象 实现SmartLifecycle,其getPhase()方法返回 Integer.MIN_值将在第一个开始和最后一个开始之间 停止在光谱的另一端,相位值为 Integer.MAX_值将指示应启动对象 最后一个并首先停止(可能是因为它依赖于其他进程) 正在运行)。当考虑相位值时,它也很重要 要知道任何“正常”生命周期对象的默认阶段 未实现SmartLifecycle将为0。因此,任何负面的 相位值将指示对象应在这些相位值之前启动 标准组件(并在它们之后停止),反之亦然 正相位值

只有我想在所有其他控制器初始化后分阶段加载两个控制器

为了实现这种行为,我在两个Spring组件中都实现了分阶段接口

@首先要初始化的服务

@Service
public class BatchTaskController implements Phased{

    @Autowired
    private ActorService actorService;
    @Autowired
    private SessionFactory sessionFactory;

    public BatchTaskController(){

        this.batch();
    }

    public void batch(){

        //TO DO...
    }

    @Override
    public int getPhase() {

        return 1;
    }    
@Service
public class BatchTaskController implements Phased{

    @Autowired
    private ActorService actorService;
    @Autowired
    private SessionFactory sessionFactory;

    @PostConstruct    
    public void batch(){

        //TO DO...
    }

    @Override
    public int getPhase() {

        return 1;
    }    
}

@要在批处理任务@Service之后初始化的控制器

 @Controller
    public class MainController implements Phased{

        @Autowired
        private ActorService actorService;
        @Autowired
        private SessionFactory sessionFactory;

        @RequestMapping(value = {"/", "/index"})
        public String showHome(HttpServletRequest request) {

            //TO DO

            return "index";
        }

        @Override
        public int getPhase() {

            return 2;
        }   

    }
ActorService@Service未实现分阶段接口。因此,正如我在上面公开的Spring参考文章中所读到的,我猜想ActorService@Service比之前的@Controller更早启动,因为ActorService@Service phase valor默认为0

但是,当我部署应用程序时,会出现下一个NullPointerException错误

04-04-2014 08:34:10,286 AM ERROR ContextLoader:331 - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'batchTaskController' defined in file [E:\Desarrollo\Spring\pjcomspringehcache\target\pjcomspringehcache-1.0-SNAPSHOT\WEB-INF\classes\com\pjcom\pjcomspringehcache\BatchTaskController.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.pjcom.pjcomspringehcache.BatchTaskController]: Constructor threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1076)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1021)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4738)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5158)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:726)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:702)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:697)
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:579)
    at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1744)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.uti
l.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:744)
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.pjcom.pjcomspringehcache.BatchTaskController]: Constructor threw exception; nested exception is java.lang.NullPointerException
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:164)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:89)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1069)
    ... 26 more
Caused by: java.lang.NullPointerException
    at com.pjcom.pjcomspringehcache.BatchTaskController.batch(BatchTaskController.java:32)
    at com.pjcom.pjcomspringehcache.BatchTaskController.<init>(BatchTaskController.java:23)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
    ... 28 more

}

在您自己的代码中有一个
NullPointerException
,您应该在这里显示它或解释它与此的关系。此外,我不确定我是否理解使用
@控制器
实现
分阶段
的意义。您是在试图延迟http端点的可用性还是什么?因为这不是它所做的。NullPointerException是因为当调用构造函数时,BatchTaskController中的ActorService@Service autowired为null,我尝试使用它。这与您实现的
分阶段
无关。不能在构造函数中使用有线字段,因为一旦创建了对象(即在构造函数调用之后),这些字段就会初始化。您可能希望自动连接构造函数。看起来您试图在创建bean后延迟某些批处理任务的执行。如果您只想控制调用此方法的时间,您完全可以使用
@PostConstruct
甚至
@Scheduled
。谢谢大家,我对@PostConstruct行为感到困惑。现在它可以正常工作了
@Service
public class BatchTaskController implements Phased{

    @Autowired
    private ActorService actorService;
    @Autowired
    private SessionFactory sessionFactory;

    @PostConstruct    
    public void batch(){

        //TO DO...
    }

    @Override
    public int getPhase() {

        return 1;
    }