当我运行以下类时,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);
}
}
谁能告诉我为什么?
正如评论中指出的那样,因为你在配置bean中正在做应用程序逻辑。
使用@Configuration
注释的类只是 - 配置,这些是旧XML配置的代码等价物,并且应该只包含用于设置应用程序的代码。
重复的任务和功能应该在使用@Component
(或包含@Component
的元注释,如@Controller
或@Service
)注释的类中,或者使用@Bean
注释的方法实例化的类,或者以上下文的其他方式注册的类。
现在,关于为什么在配置中有bean方法时它不起作用:
可能是因为M. Deinum说这是因为你的类被代理了,但Spring在已经代理的常规bean上找到@Scheduled
注释没有问题,所以我怀疑是这样的。
更可能的原因是@Bean
注释使Spring认为你的配置类是应用程序接线的一部分(这是有意义的 - 这就是它应该是什么),因此它可能在ScheduledAnnotationBeanPostProcessor
之前创建,这当然意味着后处理器永远不会在配置类上看到@Scheduled
注释,因此永远不会在调度程序中注册它。
TL; DR
不要将应用程序逻辑放在配置中。