Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法在Spring Boot应用程序的主方法中使用@Autowired JPA Repository_Java_Spring_Spring Boot - Fatal编程技术网

Java 无法在Spring Boot应用程序的主方法中使用@Autowired JPA Repository

Java 无法在Spring Boot应用程序的主方法中使用@Autowired JPA Repository,java,spring,spring-boot,Java,Spring,Spring Boot,我已经自动连接了一个JPA存储库,在应用程序启动之前在我的H2数据库中添加虚拟数据。 但是为什么我不能在主方法中使用它,而能够在runner方法中使用它,这有什么原因吗 @SpringBootApplication public class FullstackApplication { @Autowired private CarRepository carRepository; private static final Logger logger =

我已经自动连接了一个JPA存储库,在应用程序启动之前在我的H2数据库中添加虚拟数据。 但是为什么我不能在主方法中使用它,而能够在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;
它不会抛出任何错误,但会被忽略

您直接从静态方法访问非静态字段 这在java中是不允许的

此外,您不能将静态字段设置为@Autowired

所以如果你这么做

@Autowired
  private static CarRepository carRepository;

它不会抛出任何错误,但会被忽略。

Main方法被标记为static,这意味着在那里使用的所有内容都应该是静态的,或者手动实例化

您并没有在main方法的静态主体中手动实例化CarRepository,而是依靠Spring在其启动阶段的某个地方对其进行实例化,这将在CarRepository之后发生。。。。这条线

这就是为什么不能在这个确切的位置使用carRepository,因为它本身不是静态的,而且在中也不是手动实例化的


但在CommandRunner中,在调用return时,CarRepository的实例已经由Spring创建并自动连接到字段,因为Spring启动已经完成,并且可以很容易地使用。

Main方法被标记为static,这意味着在那里使用的所有内容都应该是static,或者可以手动实例化

您并没有在main方法的静态主体中手动实例化CarRepository,而是依靠Spring在其启动阶段的某个地方对其进行实例化,这将在CarRepository之后发生。。。。这条线

这就是为什么不能在这个确切的位置使用carRepository,因为它本身不是静态的,而且在中也不是手动实例化的


但在CommandRunner中,在调用return时,CarRepository的实例已经由Spring创建并自动连接到字段,因为Spring启动已经完成,并且它可以很容易地使用。

那么main方法被标记为static,您无法从static方法访问非静态成员

为了解决这个问题,你必须标记携带静电。但由于静态字段不能自动连接,它将忽略它,您将无法获取对象


它将在command runner中工作,因为此时sprint启动已经完成,bean已经实例化。

那么main方法被标记为static,您无法从静态方法访问非静态成员

为了解决这个问题,你必须标记携带静电。但由于静态字段不能自动连接,它将忽略它,您将无法获取对象


它将在command runner中工作,因为此时sprint启动已经完成,bean已经实例化。

autowired和所有其他spring bean将在run方法执行时实例化。要知道获取spring实例的合适方法,请在main方法中获取服务、存储库等,看看autowired,所有其他Springbean都会在run方法执行时实例化