2016-10-11 8 views
2

다음과 같이 스프링 부트 응용 프로그램의 다른 패키지에서 찾을 수있는 3 개의 클래스가 있습니다. @Autowired은 왜 특정 클래스에서만 작동합니까? 스프링 부트 Autowired 실패 - null

@Configuration 
public class Configurations{ 
    @Autowired 
    Prop prop; //works fine 

    @Bean 
    //other bean definitions 

} 

@Component 
public class Prop{ 
    public void method(){}; 
} 

public class User{ 
    @Autowired 
    Prop prop; //does not work, null 

    public void doWork(){ 
     prop.method(); 
    } 

} 

나는 또한 @PostConstruct을 시도하지만, 봄은 클래스 자체가 스프링 빈해야한다고 감지하면 같은 결과

public class User{ 
     @Autowired 
     Prop prop; //does not work, null 

     @PostConstruct 
     public void doWork(){ 
      prop.method(); 
     } 

    } 
+0

bean annotation을 사용하여 bean annotation을 변경 한 후에 bean annotation을 사용하고 다른 메소드에서 사용할 수있는 방법으로 구성을 만들면 bean public Prop prop() {...} –

답변

5

@Autowired 주석에만 작동합니다.

첫 번째 예에서는 Configurations@Configuration 주석을 달았습니다. 반면에 User 클래스에는 Spring 빈이어야 함을 나타내는 주석이 없습니다.

이 클래스는 Spring 컨테이너에 의해 선택 될 수 있도록 (다른 의미로) 여러 주석이 있습니다, 몇 가지 예는, @Service, @Component, @Controller, @Configuration입니다 .... 그러나 이것은 스프링 컨테이너가 스캔중인 패키지에 클래스가있는 경우에만 작동합니다. 스프링 부트를 사용하면 가장 쉬운 방법은 메인 클래스 (서브 클래스) (@SpringBootApplication로 주석 된 클래스)의 하위 패키지에 User 클래스를 넣는 것입니다.

당신은 수동으로 다음과 같은 방법을 작성하여 빈을 생성 할 수 있습니다

당신의 Configurations :이 경우

@Bean 
public User user() { 
    return new User(); 
} 

당신은 당신의 User 클래스에 주석을 가지고도 당신이 있는지 확인해야하지 마십시오 스캔중인 패키지에 있습니다.

관련 문제