我有一个简单的Spring引导应用程序,用于初始化CLI游戏。
导入com.rpg.game.rpggame.client.RpgGameClient;
@SpringBootApplication
public class RpgGameApplication {
public static void main(String[] args) {
SpringApplication.run(RpgGameApplication.class, args);
RpgGameClient.runGame();
}
}
runGame()
使用了我的某些服务(春季豆)。
public class RpgGameClient {
@Autowired
private static GameService gameService;
public static void runGame() {
gameService.createNewGame();
}
}
但是使用服务时我有一个NullPointerException
,因为Spring无法成功将其注入我的RpgGameClient
类中。
我该如何解决?
答案 0 :(得分:0)
1)RpgGameClient
未声明为Bean候选者。所以Spring会忽略它。
您可以通过例如用@Component
注释类(最简单的方式)或声明一个返回类实例的@Bean
方法来做到这一点。
2)即使那样,它仍然无法正常工作,因为@Autowired
对于static
字段无效。 Spring将依赖项注入到bean中,而bean是类的 instance 。
我认为runGame()
也应该不是static
。使所有弹簧变为静态是没有意义的。对于Spring引导应用程序类来说,这是相同的。
3)构造器注入应优先于现场注入。
所以应该更好:
@Component
public class RpgGameClient {
private GameService gameService;
public RpgGameClient(GameService gameService){
this.gameService = gameService;
}
public void runGame() {
gameService.createNewGame();
}
}
并更改Spring Boot应用程序类以使用注入依赖性,例如:
@SpringBootApplication
public class RpgGameApplication {
@Autowired
RpgGameClient rpgGameClient;
@PostConstruct
public void postConstruct(){
rpgGameClient.runGame();
}
public static void main(String[] args) {
SpringApplication.run(RpgGameApplication.class, args);
}
}