Java Spring@计划在@Configuration类中

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

当我运行下面的类时,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);
    }
}
但是如果我删除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