2017-12-29 1 views
1

다음 클래스를 실행하면 "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); 
    } 
} 

누가 그 이유를 말해 줄 수 있습니까?

+0

아마도 같은 클래스의 모든 것을하려고하기 때문에 나쁜 생각인데, Configuration 클래스는 로직이 아닌 구성 만 포함해야합니다. – luk2302

+4

'@ Bean'을 사용할 때, Spring은'@Configuration' 클래스를위한 프록시를 생성 할 것입니다. 메소드가 프록시되기 때문에'@ Scheduled'를 읽을 수 없도록 만든다 (주석은 상속되지 않기 때문에 보이지 않을 것이다). @Configuration은 로직을 포함해서는 안되는 구성 일 것입니다. –

+0

한 가지 더 요점은, 당신이 propertyConfigurer에 대한 bean 정의를 제거하면 작동하지 않을 것이라고 생각합니다. (@Configuration이있는 한) – pvpkiran

답변

0

주석에서 설명한 바와 같이 구성 빈에서 응용 프로그램 논리를 수행하고 있기 때문입니다.

@Configuration으로 주석 된 클래스는 구성입니다. 이는 이전 XML 구성의 코드와 동일하므로 응용 프로그램을 설정하는 코드 만 포함해야합니다.

반복 작업 및 기능과는 다른 방법으로 @Bean 주석 방법에서 인스턴스화 또는 등록 @Component 주석 내부 클래스 (또는 포함하는 메타 주석 @Component 같은 @Controller이나 @Service) 또는 클래스이어야 문맥.

이제, 당신이 당신의 구성에서 빈 메소드를 가지고 때 작동하지 않는 이유에 :

M. Deinum이 클래스는 프록시되고 있기 때문에,하지만 봄이가 말한다 그것은있을 수 있습니다

프록시가 된 일반 콩에 대한 @Scheduled 주석을 찾는 데 아무 문제가 없으므로 의심 스럽습니다.

더 많은 이유는 @Bean 주석으로 인해 구성 클래스가 응용 프로그램 배선의 일부로 간주된다는 것입니다. (이는 의미가 있습니다.) 이것이 ScheduledAnnotationBeanPostProcessor 전에 생성 될 수 있습니다. 코스는 포스트 프로세서가 구성 클래스에서 @Scheduled 주석을 절대로 볼 수 없으므로 결코 스케줄러에 등록하지 않음을 의미합니다.

TL; DR

구성에서 애플리케이션 로직을 두지 않는다.