【问题标题】:Init methods in SpringSpring中的初始化方法
【发布时间】:2016-07-28 14:58:26
【问题描述】:

我基于 Spring BOOT 为书籍创建了简单的 REST 应用程序。 我创建了一个 /books/addBasicBooks 映射,它添加了 3 本书,只是为了在我的存储库中有一些东西来测试,因为我正在使用在启动应用程序后为空的内存存储库。

@RequestMapping(value = "/addBasicBooks")
public List<Book> addBasicBooks() {
    Book book = new Book.BookBuilder("W pustyni i w puszczy", "Henryk Sienkiewicz").pages(400).build();
    Book book1 = new Book.BookBuilder("Dziady IV", "Adam Mickiewicz").pages(300).build();
    Book book2 = new Book.BookBuilder("Krzyzacy", "Henryk Sienkiewicz").pages(900).build();

    bookRepository.save(book);
    bookRepository.save(book1);
    bookRepository.save(book2);

    return bookRepository.listAll();
}

我敢肯定,有更好的方法来做到这一点。在应用程序启动时添加这本书。听说 Spring 有一些 init 方法,但是我什么都找不到。

【问题讨论】:

  • 请分享您的数据库配置
  • @MatiasElorriaga 为了什么?我没有任何配置,它基于 Arraylist 并且运行良好。我只需要一些 Spring init 方法,它将在应用程序启动后触发。
  • 我认为您的 bookRepository 正在访问一些数据库,不是吗?如果是这样,您可以添加一个在应用程序启动时读取的 sql 文件。您没有配置任何数据库?

标签: java spring rest


【解决方案1】:

您可以使用以@PostConstruct 为前缀的方法

类似的东西:

@Controller
@RequestMapping("/hello-world")
public class HelloWorldController {

    private List<Book> books;

    @RequestMapping(method=RequestMethod.GET)
    public List<Book> addBasicBooks() {
        return books;
    }

    @PostConstruct
    private void onInit(){
        Book book = new Book.BookBuilder("W pustyni i w puszczy", "Henryk Sienkiewicz").pages(400).build();
        Book book1 = new Book.BookBuilder("Dziady IV", "Adam Mickiewicz").pages(300).build();
        Book book2 = new Book.BookBuilder("Krzyzacy", "Henryk Sienkiewicz").pages(900).build();

        bookRepository.save(book);
        bookRepository.save(book1);
        bookRepository.save(book2);

        books = bookRepository.listAll();
    }
}

如果你想共享实例,你可以使用静态列表

【讨论】:

    【解决方案2】:

    您正在使用 Spring Boot,我倾向于为演示应用程序添加一个 CommandLineRunner 类型的 bean。我不喜欢在@PostConstruct 方法中添加它,因为并不能真正保证您的事务已设置,它实际上是您的应用程序的一部分,而不是控制器。

    将以下内容添加到您的应用程序类中。

    @Bean
    public CommandLineRunner dataInitializer(BookRepository br) {
        return new CommandLineRunner() {
            public void run (String... args) throws Exception {
                // initialize bookRepository
                Book book = new Book.BookBuilder("W pustyni i w puszczy", "Henryk Sienkiewicz").pages(400).build();
                Book book1 = new Book.BookBuilder("Dziady IV", "Adam Mickiewicz").pages(300).build();
                Book book2 = new Book.BookBuilder("Krzyzacy", "Henryk Sienkiewicz").pages(900).build();
    
                bookRepository.save(book);
                bookRepository.save(book1);
                bookRepository.save(book2);
            }
        };
    }
    

    这可以让您的实际控制器和其他代码保持干净。

    @Controller
    @RequestMapping("/hello-world")
    public class HelloWorldController {
    
        @RequestMapping(method=RequestMethod.GET)
        public List<Book> addBasicBooks() {
            return bookRepository.listAll();
        }
    }
    

    我建议不要在控制器中缓存书籍,而是使用 Spring Cache 抽象或(使用 JPA 时)使用 ORM 提供者的二级缓存支持来缓存实体。

    【讨论】:

      【解决方案3】:

      您可以在控制器实例化后使用 Spring 的@PostConstruct 来构建您的内存数据库。有关更多信息,请参阅此link。参见“6.9.8”部分。 @PostConstruct 和@PreDestroy'。

      可能是这样的:

          @PostConstruct
          public void init(){
              // initialize bookRepository
              Book book = new Book.BookBuilder("W pustyni i w puszczy", "Henryk Sienkiewicz").pages(400).build();
              Book book1 = new Book.BookBuilder("Dziady IV", "Adam Mickiewicz").pages(300).build();
              Book book2 = new Book.BookBuilder("Krzyzacy", "Henryk Sienkiewicz").pages(900).build();
      
              bookRepository.save(book);
              bookRepository.save(book1);
              bookRepository.save(book2);
          }
      
          @RequestMapping(value = "/addBasicBooks")
          public List<Book> addBasicBooks() {
              return bookRepository.listAll();
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多