복붙노트

[SPRING] SpringBootApplication이 내 서비스를 Autowire하지 않습니다.

SPRING

SpringBootApplication이 내 서비스를 Autowire하지 않습니다.

스프링 부트 초기화에 문제가 있습니다. 간단한 스프링 부트 프로젝트에이 구조가 있습니다.

com.project.name
|----App.java (Annoted with @SpringBootApplication and Autowire MyCustomService)
|----com.project.name.service
     |----MyCustomService.java (Annoted with @Service)

SpringBootApplication Annotation에서 scanBasePackages 속성을 설정하려고했지만 작동하지 않습니다. 어쨌든 나는 주석이 달린 @Bean을 가지고 있으며 다음과 같이 응용 프로그램을 실행할 때 로그를 볼 수 있기 때문에 스프링 부팅이 응용 프로그램에 올바르게 삽입되어 있음을 알 수 있습니다.

2019-03-09 15:23:47.917  INFO 21764 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'jobLauncherTaskExecutor'
...
2019-03-09 15:23:51.775  INFO 21764 --- [       Thread-3] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'jobLauncherTaskExecutor'

내 AppClass.java의 기본 스키마

@SpringBootApplication(
        exclude = { DataSourceAutoConfiguration.class }
        //,scanBasePackages  = {"com.project.name.service"}
)

public class App{

    private static Logger logger = LoggerFactory.getLogger(App.class);

    @Autowired
    private static MyCustomService myCustomService;

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);

        ...

        myCustomService.anyMethod();//NullPointerException
    }
}

@Bean
public ThreadPoolTaskExecutor jobLauncherTaskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(10);
    executor.setMaxPoolSize(20);
    executor.setQueueCapacity(25);
    return executor;
}

나는 내가 뭔가를 놓치고 있다고 생각하지만, 일부 가이드를 읽고 있는데 이것에 대해 아무것도 발견하지 못한다.

해결법

  1. ==============================

    1.Spring은 정적 필드를 @Autowire 할 수 없다. ApplicationContext를 사용하여 빈을 얻는다.

    Spring은 정적 필드를 @Autowire 할 수 없다. ApplicationContext를 사용하여 빈을 얻는다.

    @SpringBootApplication(
        exclude = { DataSourceAutoConfiguration.class }
        //,scanBasePackages  = {"com.project.name.service"}
    )
    
    public class App{
    
        private static Logger logger = LoggerFactory.getLogger(App.class);
    
        public static void main(String[] args) {
            ApplicationContext context = SpringApplication.run(App.class, args);
    
            MyCustomService myCustomService = (MyCustomService)context.getBean("myCustomService");
            ...
    
            myCustomService.anyMethod();
        }
    }
    

    또는 CommandLineRunner를 사용할 수 있습니다.

     @SpringBootApplication(
        exclude = { DataSourceAutoConfiguration.class }
        //,scanBasePackages  = {"com.project.name.service"}
    )
    
    public class App implements CommandLineRunner {
    
        private static Logger logger = LoggerFactory.getLogger(App.class);
    
        @Autowired
        private MyCustomService myCustomService;
    
        public static void main(String[] args) {
            SpringApplication.run(App.class, args);
        }
        public void run(String... args){
            myCustomService.anyMethod();
        }     
    }
    
  2. ==============================

    2.문제는 이전에 해결되었습니다. 아래 링크를 참조하십시오.

    문제는 이전에 해결되었습니다. 아래 링크를 참조하십시오.

    왜 우리는 봄에 정적 필드를 autowire 수 없습니다

  3. from https://stackoverflow.com/questions/55078382/springbootapplication-does-not-autowire-my-services by cc-by-sa and MIT license