常见问题与解决方案
使用setLazyInitialization懒加载时导致某些@Bean或@Autowired等无法加载
示范
@SpringBootApplication
public class XxxxApplication {
public static void main(String[] args) {
SpringApplication xxx = new SpringApplication(XxxxApplication.class);
xxx.setLazyInitialization(true);
application.run(args);
System.out.println("启动成功");
}
}
解决方案:
方法1:去掉xxx.setLazyInitialization(true);
方法2:在 @Component 注解中显式设置 @Lazy(false),强制 Spring 在启动时立即加载该 Bean。
遇到使用@Qualifier(value=“taskExecutor”)无法注入的情况下解决方案
方案1、中显式转换
@Autowired
public TaskService(@Qualifier(value="taskExecutor") Executor executor) {
if (executor instanceof ThreadPoolTaskExecutor) {
this.taskExecutor = (ThreadPoolTaskExecutor) executor;
} else {
throw new IllegalArgumentException("Injected executor is not of type ThreadPoolTaskExecutor");
}
}
方案2、使用 ObjectProvider 动态获取 Bean
@Autowired
public TaskService(ObjectProvider<Executor> executorProvider) {
this.taskExecutor = (ThreadPoolTaskExecutor) executorProvider.getIfAvailable();
if (this.taskExecutor == null) {
throw new IllegalStateException("No ThreadPoolTaskExecutor bean found");
}
}
排查Spring 的 Bean 定义注入情况
@PostConstruct
public void printAllBeans() {
System.out.println("Registered Beans:");
for (String beanName : applicationContext.getBeanDefinitionNames()) {
Object bean = applicationContext.getBean(beanName);
System.out.println(beanName + " : " + bean.getClass().getName());
}
}