Spring中的Init方法

时间:2016-04-07 15:42:31

标签: java spring rest

我基于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有一些初始化方法,但我找不到任何东西。

3 个答案:

答案 0 :(得分:3)

您可以使用前缀为@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();
    }
}

如果要共享实例

,可以使用静态列表

答案 1 :(得分:2)

在实例化控制器之后,您可以使用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();
    }

答案 2 :(得分:2)

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

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

@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的提供程序二级缓存支持来缓存实体。