簡體   English   中英

無法在 Spring Boot 應用程序的 Main 方法中使用 @Autowired JPA Repository

[英]Can't use @Autowired JPA Repository in Main method of Spring Boot application

我已經自動裝配了一個 JPA 存儲庫,它在應用程序啟動之前在我的 H2 數據庫中添加了虛擬數據。 但是,為什么我不能在 main () 方法中使用它,但可以在 runner() 方法中使用它,有什么原因嗎?

@SpringBootApplication
public class FullstackApplication {
    
    @Autowired
    private CarRepository carRepository;
    
    private static final Logger logger = LoggerFactory.getLogger(FullstackApplication.class); 

    public static void main(String[] args) {
        carRepository. // Here I get a compilation error: Cannot make a static reference to a non-static field
        SpringApplication.run(FullstackApplication.class, args);

    }
    
    @Bean
    CommandLineRunner runner(){
        return args -> {
            // Save demo data to database
            carRepository.save(new Car("Ford", "Mustang", "Red",
            "ADF-1121", 2017, 59000));
            carRepository.save(new Car("Nissan", "Leaf", "White",
            "SSJ-3002", 2014, 29000));
            carRepository.save(new Car("Toyota", "Prius", "Silver",
            "KKO-0212", 2018, 39000));
        };
    }
}

您正在直接從 java 中不允許的靜態方法訪問非靜態字段

你也不能制作靜態字段@Autowired

所以如果你這樣做

@Autowired
  private static CarRepository carRepository;

它不會拋出任何錯誤,但會被忽略。

Main 方法被標記為靜態,這意味着,在那里使用的所有方法也應該是靜態的,或者手動實例化。

您沒有在 main 方法的靜態主體中手動實例化 CarRepository,您依賴 Spring 在啟動階段的某個地方實例化它,這將在“carRepository. //....”這一行之后發生。

這就是為什么你不能在這個確切的地方使用 carRepository,因為它本身不是靜態的,並且沒有手動實例化。

但是在CommandRunner中,在調用return的時候,CarRepository的實例已經被Spring創建並自動綁定到field,因為Spring啟動已經完成,可以很方便的使用。

好吧,主要方法被標記為靜態,您不能從靜態方法訪問非靜態成員。

為了解決這個問題,您必須將 carRepository 標記為靜態。 但是由於靜態字段不能自動裝配,它會忽略它並且你不會得到對象。

它將在命令運行器中工作,因為那時 sprint 啟動已經完成並且 bean 已經被實例化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM