代码之家  ›  专栏  ›  技术社区  ›  Genaut

SpringBootApplication不会自动连接我的服务

  •  0
  • Genaut  · 技术社区  · 6 年前

    我的Spring Boot初始化有问题。我在一个简单的Spring Boot项目中使用了这种结构。

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

    scanBasePackages 属性,但不起作用。不管怎样,我有一个 @Bean 注释,我看到Spring Boot在应用程序中正确地注入了它,因为我可以在这样运行应用程序时看到日志:

    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'
    

    my 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 回复  |  直到 6 年前
        1
  •  2
  •   Genaut    6 年前

    春天不能 @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
  •  1
  •   Minh Do    6 年前

    此问题以前已解决,请参阅下面的链接

    why can't we autowire static fields in spring