java - SpringBootApplication 不会自动装配我的服务
问题描述
我的 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
在 SpringBootApplication Annotation 中设置属性但不起作用。无论如何,我有一个@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'
我的 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;
}
我想我遗漏了一些东西,但我正在阅读一些指南,但没有找到任何关于此的内容。
解决方案
Spring不能@Autowire
静态字段,用于ApplicationContext
获取bean
@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();
}
}
推荐阅读
- mongodb - 带有 ReferenceField() 的 MongoEngine 条件过滤器
- python-3.x - 我想像 spyder IDE 一样将 IPython 控制台嵌入到 tkinter 窗口中
- mysql - 显示左连接中的所有月份,但仅显示当前年份
- c++ - AES CBC 128 位加密-OpenSSL
- python - 根据小时返回出现次数 - Pandas
- sql - 在 SQL Query 中进行表的水平表示
- java - 如何重置计时器?
- python - 如何删除标题,转置数据并将两个 csv 合并到一个文件中?
- git - 如果删除了远程分支,如何删除远程提交?
- c# - 在 Startup.cs 的 Configure 中获取域名或主机名和端口