Spring服务bean为空

时间:2018-09-10 23:10:44

标签: java spring spring-boot autowired

我有一个简单的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类中。

我该如何解决?

1 个答案:

答案 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);         
    }
}