如何使用@SpringBootApplication批注从类中运行代码。我想运行我的代码而不调用控制器,并从终端而不是Web浏览器获取信息。我试图在@SpringBootApplication中调用weatherService,但是我的应用程序以描述开头失败

The dependencies of some of the beans in the application context form a cycle:

┌─────┐
|  weatherClientApplication
↑     ↓
|  weatherService defined in file [C:\Users\xxx\IdeaProjects\weatherclient\target\classes\com\xxx\restapiclient\service\WeatherService.class]
└─────┘


@SpringBootApplication
public class WeatherClientApplication {

    private WeatherService weatherService;

    public WeatherClientApplication(WeatherService weatherService) {
        this.weatherService = weatherService;
    }

    private static final Logger log = LoggerFactory.getLogger(WeatherClientApplication.class);

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

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        return builder.build();
    }


    @Bean
    public CommandLineRunner run(RestTemplate restTemplate) throws Exception {
        return args -> {
            log.info(weatherService.getTemperatureByCityName("Krakow"));
        };
    }

}


@Service
public class WeatherService {

    private RestTemplate restTemplate;

    public WeatherService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    public String getTemperatureByCityName(String cityName) {
        String url = "http://api.openweathermap.org/data/2.5/weather?q=" + cityName + "&APPID=" + API_KEY + "&units=metric";
        Quote quote = restTemplate.getForObject(url, Quote.class);
        return String.valueOf(quote.getMain().getTemp());
    }
}

最佳答案

您可以使用main方法和ApplicationContext来执行此操作,在这种方法中,您不需要任何CommandLineRunner

public static void main(String[] args) {
    ApplicationContext context = SpringApplication.run(WeatherClientApplication.class, args);
 WeatherService service = (WeatherService)context.getBean("weatherService");
  service. getTemperatureByCityName("cityname");
}

07-26 02:19