【问题标题】:Spring service bean is nullSpring 服务 bean 为空
【发布时间】:2018-09-10 23:10:44
【问题描述】:

我有一个初始化 CLI 游戏的简单 Spring Boot 应用程序。

导入 com.rpg.game.rpggame.client.RpgGameClient;

@SpringBootApplication
public class RpgGameApplication {

    public static void main(String[] args) {
        SpringApplication.run(RpgGameApplication.class, args);
        RpgGameClient.runGame(); 
    }
}

runGame() 使用了我的一些服务(spring bean)。

public class RpgGameClient {

     @Autowired
     private static GameService gameService;

     public static void runGame() {
        gameService.createNewGame();
     }

  }

但是在使用我的服务时我有一个NullPointerException,因为 Spring 无法成功地将它注入我的RpgGameClient 类。

我该如何解决?

【问题讨论】:

  • 你在哪里创建一个 bean?

标签: java spring spring-boot autowired


【解决方案1】:

1) RpgGameClient 未声明为候选 bean。所以 Spring 忽略了它。
例如,您可以通过使用 @Component 注释类(最简单的方法)或声明返回类实例的 @Bean 方法来实现。

2) 即使这样,它仍然无法工作,因为@Autowired 不适用于static 字段。 Spring 将依赖项注入到 bean 中,而 bean 是类的 instance
我认为runGame() 也应该不是static。为 bean spring 设置所有静态是没有意义的。 Spring boot 应用程序类也是如此。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多