Spring @Scheduled在@Configuration类中

问题描述 投票:2回答:1

当我运行以下类时,Spring将不会安排方法“mywork()”。

@Configuration
@EnableScheduling
public class AppConfig {

    @Scheduled(fixedRate = 1000)
    public void mywork(){
        System.out.println("test");
    }

    @Bean(name = "propertyConfigurer")
    public PropertyPlaceholderConfigurer propertyConfigurer(){
        PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
        return ppc;
    }

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    }
}

但是如果我删除了propertyConfigurer的Bean定义,它将正常工作。

@Configuration
@EnableScheduling
public class AppConfig {

    @Scheduled(fixedRate = 1000)
    public void mywork(){
        System.out.println("test");
    }

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    }
}

谁能告诉我为什么?

java spring scheduling
1个回答
1
投票

正如评论中指出的那样,因为你在配置bean中正在做应用程序逻辑。

使用@Configuration注释的类只是 - 配置,这些是旧XML配置的代码等价物,并且应该只包含用于设置应用程序的代码。

重复的任务和功能应该在使用@Component(或包含@Component的元注释,如@Controller@Service)注释的类中,或者使用@Bean注释的方法实例化的类,或者以上下文的其他方式注册的类。

现在,关于为什么在配置中有bean方法时它不起作用:

可能是因为M. Deinum说这是因为你的类被代理了,但Spring在已经代理的常规bean上找到@Scheduled注释没有问题,所以我怀疑是这样的。

更可能的原因是@Bean注释使Spring认为你的配置类是应用程序接线的一部分(这是有意义的 - 这就是它应该是什么),因此它可能在ScheduledAnnotationBeanPostProcessor之前创建,这当然意味着后处理器永远不会在配置类上看到@Scheduled注释,因此永远不会在调度程序中注册它。

TL; DR

不要将应用程序逻辑放在配置中。

© www.soinside.com 2019 - 2024. All rights reserved.