@Autowired 没有连接我的存储库 - 空指针异常

@Autowired not wiring my repository - null pointer exception

    @SpringBootApplication
    public class ImportCSV {
                
        @Autowired
        private static PersonRepository personRepository; //does not seem to work
        
        public static void main(String args[]) throws IOException {
            SpringApplication.run(ImportCSV.class, args);
            Person person = new Person();
            // Add a bunch of setters for person
                personRepository.save(person); //personRepository is null
        }
   }

public interface PersonRepository extends JpaRepository<Person, Long>{

}

@Data
@Entity
@Table(name = "Persons")
@NoArgsConstructor
public class Person {
    /*Declare relevant fields here*/
}

请看上面的代码。 'personRepository' 为空。我该如何解决?我做错了什么 -- Autowire 是如何工作的?

Spring 不会注入静态字段。因此,您必须从 personRepository 字段中删除 static 关键字。然后编译器会抱怨,你不能从静态方法访问非静态字段。为了解决这个问题,实现 ApplicationRunner 接口,它定义了一个 run 方法。在该方法中,您可以 运行 所有代码,在 Spring 启动应用程序启动后应该是 运行,例如用于初始化数据库中的任何数据等
这将是应用程序启动后执行代码的正确 Spring 引导方式。
为了获得更简洁的代码,您可以创建一个单独的 class,实现 ApplicationRunner 接口并将代码移到那里。

示例:

@SpringBootApplication
public class ImportCSV implements ApplicationRunner {
            
    @Autowired
    private PersonRepository personRepository; //does not seem to work
    
    public static void main(String args[]) throws IOException {
        SpringApplication.run(ImportCSV.class, args);
    }

    @Override

    public void run(ApplicationArguments args) throws Exception {


         Person person = new Person();

         personRepository.save(person); 
    }
}