1

所以,我有一个使用 @Scheduled 注释来完成各种工作的 Spring 应用程序。在产品中,它工作得很好。然而,这个特性在运行 spock 集成测试时给我们带来了一些问题——一旦容器启动,我们所有的任务都会被触发,它会破坏我们的测试运行。

我正在寻找一种关闭调度功能的方法,但仍然让容器(使用@ComponentScan 配置)将其作为常规的 'ol bean 来选择。

根据我到目前为止所做的一些工作,似乎如果我可以用无操作实现覆盖内置的 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% 配置的。

谢谢。

4

1 回答 1

1

我的错误是我没有正确命名 bean。我最终找到了这个 bean 的构建位置(在 org.springframework.scheduling.annotation.SchedulingConfiguration 中)并复制了它的配置。

此方法演示了正确的名称/配置:

@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
        }
    }
}
于 2014-02-20T22:06:46.537 回答