所以,我有一个使用@Scheduled注释的spring应用程序来完成各种工作。在生产中,它很有效。但是,这个功能在运行spock集成测试时会给我们带来一些问题 - 一旦容器启动,我们的所有任务都会被触发,它会破坏我们的测试运行。
我正在寻找一种关闭调度功能的方法,但仍然有容器(使用@ComponentScan配置)将其作为常规的“ol bean”进行选择。
基于我到目前为止所完成的一些练习,似乎如果我可以使用no-op实现覆盖内置的ScheduledAnnotationBeanPostProcessor,我可以实现这个目标..但是当我在容器中创建这个bean时(创建)使用@Bean(“scheduledAnnotationBeanPostProcessor” - 请参阅下面的代码部分),它似乎只是添加到BeanPostProcessors列表中 - 它仍然包含原始实现。
@Bean(name="scheduledAnnotationBeanPostProcessor")
ScheduledAnnotationBeanPostProcessor scheduledAnnotationBeanPostProcessor(){
return new ScheduledAnnotationBeanPostProcessor(){
@Override
public Object postProcessAfterInitialization(final Object bean, String beanName){
return bean
}
}
}
所以,我想我的问题是 - 如何连接一个将取代内置BeanPostProcessor的bean?仅供参考我正在使用Spring 3.2.4,应用程序通过Spring注释100%配置。
感谢。
答案 0 :(得分:1)
我的错误是我没有正确命名bean。我最终找到了这个bean的构建位置(在org.springframework.scheduling.annotation.SchedulingConfiguration中)并且我复制了它的配置。
此方法演示了正确的名称/ config:
@Bean(name=AnnotationConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME)
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
BeanPostProcessor scheduledAnnotationBeanPostProcessor(){
return new BeanPostProcessor(){
@Override
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean
}
@Override
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean
}
}
}