Spring Boot提供了一种新的编程范式,能在最小的阻力下开发Spring应用程序。有了它,
你可以更加敏捷地开发Spring应用程序,专注于应用程序的功能,不用在Spring的配置上多花功
夫,甚至完全不用配置。实际上, Spring Boot的一项重要工作就是让Spring不再成为你成功路上
的绊脚石。
Spring Boot将很多魔法带入了Spring应用程序的开发之中,其中最重要的是以下四个核心。
- 自动配置:针对很多Spring应用程序常见的应用功能, Spring Boot能自动提供相关配置。
- 起步依赖:告诉Spring Boot需要什么功能,它就能引入需要的库。
- 命令行界面:这是Spring Boot的可选特性,借此你只需写代码就能完成完整的应用程序,
无需传统项目构建。 - Actuator:让你能够深入运行中的Spring Boot应用程序,一探究竟。
使用Idea的spring 初始化器,勾选右边的选项
项目结构如下
启动类:
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@SpringBootApplication开启了Spring的组件扫描和Spring Boot的自动配置功能。实际上, @SpringBootApplication将三个有用的注解组合在了一起。
- Spring的@Configuration:标明该类使用Spring基于Java的配置。
- Spring的@ComponentScan:启用组件扫描,这样你写的Web控制器类和其他组件才能被自动发现并注册为Spring应用程序上下文里的Bean。
- Spring Boot 的 @EnableAutoConfiguration : 这 个 不 起 眼 的 小 注 解 也 可 以 称 为@Abracadabra,就是这一行配置开启了Spring Boot自动配置的魔力,让你不用再写成篇的配置了。
application.properties用于写spring boot项目的配置。
server.port=8000 //tomcat的端口
dao
继承JpaRepository就可以,不需要自己实现实现类,jpa会帮助实现。
public interface ReadingListRepository extends JpaRepository<Book,Long> {
List<Book> findByReader(String reader);
}
实体类
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String reader;
private String isbn;
private String title;
private String author;
private String description;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getReader() {
return reader;
}
public void setReader(String reader) {
this.reader = reader;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
controller
@Controller
@RequestMapping("/read")
public class ReadingListController {
private ReadingListRepository readingListRepository;
@Autowired
ReadingListController(ReadingListRepository readingListRepository){
this.readingListRepository=readingListRepository;
}
@RequestMapping(value="/{reader}", method=RequestMethod.GET)
public String readersBooks(
@PathVariable("reader") String reader,
Model model) {
List<Book> readingList =
readingListRepository.findByReader(reader);
if (readingList != null) {
model.addAttribute("books", readingList);
}
return "readingList";
}
@RequestMapping(value="/{reader}", method= RequestMethod.POST)
public String addToReadingList(
@PathVariable("reader") String reader, Book book) {
book.setReader(reader);
readingListRepository.save(book);
return "redirect:/read/{reader}";
}
}
启动类
@SpringBootApplication(scanBasePackages = "com.example")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
页面:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" th:href="@{/style.css}"></link>
</head>
<body>
<h2>你的书籍列表</h2>
<div th:unless="${#lists.isEmpty(books)}">
<dl th:each="book : ${books}">
<dt class="bookHeadline">
<span th:text="${book.title}">Title</span>
<span th:text="${book.author}">Author</span>
(ISBN: <span th:text="${book.isbn}">ISBN</span>)
</dt>
<dd class="bookDescription">
<span th:if="${book.description}" th:text="${book.description}">Description</span>
<span th:if="${book.description eq null}">No description available</span>
</dd>
</dl>
</div>
<div th:if="${#lists.isEmpty(books)}">
<p>You have no books in your book list</p>
</div>
<h3>Add a book</h3>
<form method="POST">
<label for="title">Title:</label>
<input id="title" type="text" name="title" size="50"></input><br/>
<label for="author">Author:</label>
<input id="author" type="text" name="author" size="50"></input><br/>
<label for="isbn">ISBN:</label>
<input id="isbn" type="text" name="isbn" size="15"></input><br/>
<label for="description">Description:</label><br/>
<textarea id="description" name="description" cols="80" rows="5">
</textarea><br/>
<input type="submit"></input>
</form>
</body>
</html>
效果: