Spring中具有分阶段接口的上下文加载程序控制
我试图控制上下文加载过程。正如我在Spring参考文档中所读到的,我决定使用Spring提供的分阶段接口 启动时,具有最低相位的对象首先启动 停止时,按照相反的顺序进行操作。因此,一个对象 实现SmartLifecycle,其getPhase()方法返回 Integer.MIN_值将在第一个开始和最后一个开始之间 停止在光谱的另一端,相位值为 Integer.MAX_值将指示应启动对象 最后一个并首先停止(可能是因为它依赖于其他进程) 正在运行)。当考虑相位值时,它也很重要 要知道任何“正常”生命周期对象的默认阶段 未实现SmartLifecycle将为0。因此,任何负面的 相位值将指示对象应在这些相位值之前启动 标准组件(并在它们之后停止),反之亦然 正相位值 只有我想在所有其他控制器初始化后分阶段加载两个控制器 为了实现这种行为,我在两个Spring组件中都实现了分阶段接口 @首先要初始化的服务Spring中具有分阶段接口的上下文加载程序控制,spring,Spring,我试图控制上下文加载过程。正如我在Spring参考文档中所读到的,我决定使用Spring提供的分阶段接口 启动时,具有最低相位的对象首先启动 停止时,按照相反的顺序进行操作。因此,一个对象 实现SmartLifecycle,其getPhase()方法返回 Integer.MIN_值将在第一个开始和最后一个开始之间 停止在光谱的另一端,相位值为 Integer.MAX_值将指示应启动对象 最后一个并首先停止(可能是因为它依赖于其他进程) 正在运行)。当考虑相位值时,它也很重要 要知道任何“正常”生
@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;
}