다음 클래스를 실행하면 "mywork()"메소드가 Spring에 의해 예약되지 않습니다.@Configuration 클래스 내에서 @Scheduled @
@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);
}
}
누가 그 이유를 말해 줄 수 있습니까?
아마도 같은 클래스의 모든 것을하려고하기 때문에 나쁜 생각인데, Configuration 클래스는 로직이 아닌 구성 만 포함해야합니다. – luk2302
'@ Bean'을 사용할 때, Spring은'@Configuration' 클래스를위한 프록시를 생성 할 것입니다. 메소드가 프록시되기 때문에'@ Scheduled'를 읽을 수 없도록 만든다 (주석은 상속되지 않기 때문에 보이지 않을 것이다). @Configuration은 로직을 포함해서는 안되는 구성 일 것입니다. –
한 가지 더 요점은, 당신이 propertyConfigurer에 대한 bean 정의를 제거하면 작동하지 않을 것이라고 생각합니다. (@Configuration이있는 한) – pvpkiran