Служебный боб Spring равен нулю - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть простое загрузочное приложение Spring, которое инициализирует игру CLI.

import 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 Beans).

public class RpgGameClient {

     @Autowired
     private static GameService gameService;

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

  }

Но у меня есть NullPointerException при использовании моего сервиса, так как Spring не может успешно внедрить его в мой RpgGameClient класс.

Как я могу это решить?

1 Ответ

0 голосов
/ 11 сентября 2018

1) RpgGameClient не объявлен в качестве кандидата в бин.Поэтому Spring игнорирует это.
Вы можете сделать это, пометив класс, например, @Component (самый простой способ) или объявив метод @Bean, который возвращает экземпляр класса.

2) Даже при этом он не будет работать по-прежнему, так как @Autowired не работает для static полей.Spring внедряет зависимости в bean-компонент, а bean-компонент - это экземпляр класса.
Я думаю, что 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);         
    }
}
...