Java Spring@计划在@Configuration类中
当我运行下面的类时,Spring不会安排方法“mywork()”Java Spring@计划在@Configuration类中,java,spring,scheduling,Java,Spring,Scheduling,当我运行下面的类时,Spring不会安排方法“mywork()” @Configuration @EnableScheduling public class AppConfig { @Scheduled(fixedRate = 1000) public void mywork(){ System.out.println("test"); } @Bean(name = "propertyConfigurer") public Proper
@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);
}
}
但是如果我删除propertyconfiguer的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
注释的类就是-Configuration,它们是旧XML配置的代码等价物,应该只包含设置应用程序的代码
周期性任务和功能应该在类内,用@组件注释(或包含@组件的元注释,如@Controller
或@Service
),或从用@Bean
注释的方法实例化的类,或者以其他方式在上下文中注册
现在,当您的配置中有一个bean方法时,为什么它不起作用:
可能正如M.Deinum所说,这是因为您的类正在被代理,但Spring在已被代理的常规bean上找到@Scheduled
注释并没有问题,所以我怀疑这是真的
更可能的原因是<代码> bean Bean /代码>注解使Spring将您的配置类考虑到应用程序的布线部分(这是有意义的——这就是它应该是的)。因此,它可能会在之前创建,这当然意味着后处理器永远不会在配置类上看到
@Scheduled
注释,因此永远不会向调度器注册它
TL;DR
不要将应用程序逻辑放入配置中。可能是因为您试图在同一个类中执行所有操作,这是一个坏主意,配置类应该只包含配置,而不包含逻辑。当使用@Bean
时,Spring将为@configuration
类创建一个代理。使@Scheduled
不可读,因为该方法将被代理(并且由于注释不是继承的,所以它将不可见)。@Configuration
应该只是配置,它不应该包含逻辑等。还有一点,我认为如果您删除PropertyConfigure的bean定义,这不会起作用。(只要您有@Configuration
)