####ПредисловиеSpring Boot
используется для упрощенияSpring
Новый фреймворк для первоначальной настройки и разработки приложений, считающийсяSpringMVC
Преемник тесно связан с микросервисами.Демонстрация простого примера Spring Boot
####Преимущества и недостатки SpringMVC
-
преимущество:
-
Spring Boot
Подходит для быстрой разработки и построения микросервисных систем. Инкапсулирует часто используемые компоненты, такие какMyBatis
,Hibernate
,MongoDB
Ждать. - чистый
Java
настройка проста и удобна. - После настройки инструментов сборки, таких как Maven,
java -jar
Развертывание относительно простое. -
Spring Boot
Он очень удобен для настройки и может быть настроен вapplication.yml
илиConfig
своего рода,Spring Boot
Общая идея заключается в том, что если есть настройка, настройка имеет приоритет, в противном случае используется конфигурация по умолчанию. -
Spring Boot
Упрощает кодирование, настройку, развертывание и мониторинг.
-
-
недостаток:
- Настолько удобно, что неопытные новички вообще не знают
Spring Boot
Что сделал нижний? Интеграция высока, и понять нижний слой во время использования непросто. - Есть несколько соответствующих учебных документов и много ям.
- Настолько удобно, что неопытные новички вообще не знают
####Первое приложение Spring Boot
- Сначала создайте
New Project
, выбиратьSpring Initializr,
потомChoose Initializr Service URL
должен выбратьCustom
, правильная ссылка должна бытьhttp://start.spring.io/
, вместоhttps://start.spring.io/
.https
Это приведет к провалу нашего визита!
2. Связанная конфигурация,Type
Мы выбираемMaven Project
3. ВыберитеWeb
Вот и все. Кроме тогоSpring Boot
Версия 1.5.8
4.Finished
. Готово!
5. Так как по умолчаниюsetting.xml
Конфигурация, для нас слишком медленная загрузка jar с пульта, поэтому мы должны изменить.m2
следующееsetting.xml
файл, покаsetting.xml
изначально указывал наC:\Users\Administrator\.m2\repository
Адрес склада можно изменить на следующий из нашего пользовательского диска.
Мой файл settings.xml выглядит так, если вы все еще не понимаете, пожалуйста, переместитеКонфигурация, связанная с Setting.xml
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors
6. Мы это видимDemoApplication
класс, это всеSpring Boot
Вход приложения, есть@SpringBootApplication
Это замечание очевидно.
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
7. Далее мы создаемHelloController.java
, @RestController
Роль этой аннотации: объявить, что этоController
класс, возвращаетсяjson
. На самом деле это@ResponseBody
и@Controller
комбинация.
@RestController
public class HelloController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String say() {
return "Hello, Spring Boot!";
}
}
8. Есть 3 способа начать.
(1) непосредственно вItellij IDEA
запускать.
mvn spring-boot:run
(3) В корневом каталоге проекта откройте командное окно и введитеmvn install
, пусть проект сгенерируетjar
Сумка.
target
Еще один под сумкойjar
Сумка.
введите командуjava -jar target/demo-0.0.1-SNAPSHOT.jar
Spring Boot
применяемый.
###Конфигурация свойств проекта
1. Мы можемresources文件夹
Сборка 3 нижеproperties
,application-dev.properties
Является файлом конфигурации в среде разработки.application-prod.properties
Это файл конфигурации в среде приложения.Spring Boot
Файл конфигурации, читаемый по умолчанию,application.properties
, нам нужно толькоapplication.properties
Вы можете указать файл конфигурации, в котором будет использоваться среда. Например:spring.profiles.active=dev
2. Мыapplication-dev.properties
, настройте некоторую информацию, чтобы позволить нашемуController
класс для чтения информации о конфигурации.
server.port=8081
server.context-path=/girl
cupSize=A
height=160
content="cupSize: ${cupSize}, age: ${height}"
girl.cupSize=A
girl.height=160
3. Класс Controller считывает информацию о конфигурации и запускает Spring Boot для вывода результатов.
public class HelloController {
@Value("${cupSize}")
private String cupSize;
@Value("${height}")
private String height;
@Value("${content}")
private String content;
@RequestMapping(value = "/display", method = RequestMethod.GET)
public String display() {
return "cupSize=" + cupSize + ", height=" + height;
}
@RequestMapping(value = "/content", method = RequestMethod.GET)
public String displayContent() {
return content;
}
}
4.Controller
Класс читает строку с префиксом информации о конфигурации, например, мы хотим прочитатьgirl.cupSize=A girl.height=160
Что нам делать с этой конфигурационной информацией с девушками. Нам нужно определитьGirlProperties.java
.@ConfigurationProperties
Представляет информацию о конфигурации, с каким префиксом мы хотим прочитать,@Component
Указывает, что этот класс был зарегистрирован в файле конфигурации Spring.
@ConfigurationProperties(prefix = "girl")
@Component
public class GirlProperties {
private String cupSize;
private String height;
public String getCupSize() {
return cupSize;
}
public void setCupSize(String cupSize) {
this.cupSize = cupSize;
}
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}
}
5.Controller
класс читатьGirlProperties
, мы будем использовать@Autowired
инъекцияGirlProperties
Экземпляр этого класса, который внедряется через тип компонента. Запустите приложение Spring Boot и выведите результаты.
@RestController
public class HelloController {
@Autowired
private GirlProperties girlProperties;
@RequestMapping(value = "/properties", method = RequestMethod.GET)
public String displayProperties() {
return girlProperties.getCupSize() + girlProperties.getHeight();
}
}
###Использование контроллера
1. Используйте как можно больше@GetMapping
и@PostMapping
заменять@RequestMapping(value = "/xxxxx", method = RequestMethod.GET)
2. При необходимости вSpring Boot
использовать@Controller
, должен вернуть логическое представление. Например
@Controller
public class DemoController {
@RequestMapping(value = "/saylove", method = RequestMethod.GET)
public String sayLove() {
return "index";
}
}
index.html
вtemplates
под папкой
3.pom.xml
Конфигурация выглядит следующим образом
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>girl</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>1.5.8.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
###Операции с базой данных
1. Вapplication-dev.properties
Настройка конфигурации подключения к данным
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/spring_boot
spring.datasource.username=root
spring.datasource.password=xiaoma96
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto
Есть 4 свойства:create
: Независимо от того, была ли эта таблица изначально в базе данных, при каждом запуске приложения таблица будет удаляться, а затем будет создаваться новая таблица.update
: Если в базе есть эта таблица и есть данные, то я сохраню эту таблицу и не буду ее удалять.create-drop
: Когда приложение остановится, эта таблица в базе данных будет удалена.none
: не производит никаких действий.
2. Что такоеJPA
?JPA
Полное английское названиеJava Persistence API
Определен ряд стандартов для сохраняемости объектов. В настоящее время продукты, реализующие эту спецификацию, включаютHibernate
.
3. Как использоватьJPA
?использовался раньшеLiferay
Технологии,Liferay
пройти черезServiceBuilder
генерироватьService.xml
,на этоService.xml
Настройте таблицы базы данных, которые необходимо создатьentity
информацию, а затем определить некоторые поля метода. Затем постройте его. создаст соответствующийCRUD
метод очень хитрый. И при следующем запуске приложения будет сгенерирована соответствующая таблица базы данных. Если вам нужно настроить оператор sql, вам нужно толькоfinderImpl
иServiceImpl
Добавьте свой собственный метод внутри, затемbuild
Теперь регенерируйте интерфейс. такой жеJPA
,простоCRUD
Нам не нужно писать операторы sql, нам просто нужно определитьGirlRepository
интерфейс, унаследованныйJpaRepository<Girl, Integer>
Вот и все. нужно настроитьCRUD
, мы добавляем соответствующий метод в строку.
public interface GirlRepository extends JpaRepository<Girl, Integer> {
public List<Girl> findByAge(Integer age);
public List<Girl> findByCupSize(String cupSize);
public List<Girl> findByName(String name);
}
4. ОпределениеRESTfulAPI
,открытьCRUD
интерфейс. увеличить, использоватьPOST
, запрос с использованиемGET
, обновить с помощьюPUT
, удалить с помощьюDELETE
.
@RestController
public class GirlController {
@Autowired
private GirlRepository girlRepository;
/**
* Queries all girls.
* @return girls List queryed
*/
@GetMapping(value = "/girls")
public List<Girl> girlList() {
return girlRepository.findAll();
}
/**
* Adds girl
* @param name
* @param cupSize
* @param age
* @return girl added
*/
@PostMapping(value = "/girls")
public Girl girlAdd(@RequestParam("name") String name, @RequestParam("cupsize") String cupSize
, @RequestParam("age") Integer age) {
Girl girl = new Girl();
girl.setAge(age);
girl.setName(name);
girl.setCupSize(cupSize);
return girlRepository.save(girl);
}
/**
* Finds girl by id
* @param id
* @return girl finded
*/
@GetMapping(value = "/girls/{id}")
public Girl girlFindOne(@PathVariable("id") Integer id) {
return girlRepository.findOne(id);
}
/**
* Updates girl
* @param id
* @param name
* @param cupSize
* @param age
* @return girl updated
*/
@PutMapping(value = "/girls/{id}")
public Girl girlUpdateOne(@PathVariable("id") Integer id, @RequestParam("name") String name, @RequestParam("cupsize") String cupSize
, @RequestParam("age") Integer age) {
Girl girl = new Girl();
girl.setCupSize(cupSize);
girl.setName(name);
girl.setAge(age);
girl.setId(id);
return girlRepository.save(girl);
}
/**
* Deletes girl by id
* @param id
*/
@DeleteMapping(value = "/girls/{id}")
public void girlDeleteOne(@PathVariable("id") Integer id) {
girlRepository.delete(id);
}
/**
* Queries girls by name
* @param name
* @return girl list queryed
*/
@GetMapping(value = "/girls/name/{name}")
public List<Girl> girlFindByName(@PathVariable("name") String name) {
return girlRepository.findByName(name);
}
/**
* Queries girls by age
* @param age
* @return girl list queryed
*/
@GetMapping(value = "/girls/age/{age}")
public List<Girl> girlFindByAge(@PathVariable("age") Integer age) {
return girlRepository.findByAge(age);
}
/**
* Queries girls by cupsize
* @param cupSize
* @return girl list queryed
*/
@GetMapping(value = "/girls/cupsize/{cupsize}")
public List<Girl> girlFindByCupSize(@PathVariable("cupsize") String cupSize) {
return girlRepository.findByCupSize(cupSize);
}
}
5. ИспользуйтеPostman
тест программного обеспеченияAPI
. Здесь я просто тестирую запросapi
, показывать.
###Управление транзакциями 1. Что такое транзакция Транзакция представляет собой серию операций, выполняемых как логическая единица. Он имеет 4 свойства
- Атомарность: транзакция — это атомарная операция, состоящая из последовательности действий. Атомарность транзакций гарантирует, что действия либо завершатся, либо завершатся неудачно.
- Непротиворечивость: после завершения транзакции, будь она успешной или неудачной, система должна гарантировать, что бизнес, который она моделирует, находится в согласованном состоянии, не полностью завершен или частично не выполнен, а фактические данные не должны быть повреждены.
- Изоляция: может быть много транзакций, работающих с одними и теми же данными одновременно, поэтому каждая транзакция должна быть изолирована от других транзакций, чтобы предотвратить повреждение данных.
- Долговечность: после завершения транзакции, независимо от того, что произойдет, системная ошибка, ее результаты не должны быть затронуты, чтобы она могла восстановиться после любого системного сбоя, обычно недостатки транзакции записываются в постоянное хранилище.
2. Несколько транзакций, которые мы обычно используем:
-
PROPAGATION_REQUIRED
: если есть транзакция, текущая транзакция поддерживается, если нет, то она включена. -
PROPAGATION_SUPPORTS
: Если есть транзакция, поддерживается текущая транзакция, если нет транзакции, она выполняется как не-транзакция. -
PROPAGATION_REQUIRES_NEW
: Начать новую транзакцию, независимую от текущей транзакции, текущая транзакция приостанавливается.
3. Мы моделируем откат транзакции, чтобы отразить атомарность транзакции.save
эксплуатация без проблем, второйsave
Операция выдает исключение. Но не частично успешным, не частично неудачным. Эти две операции в конечном итоге будут отменены.
@Service
public class GirlService {
@Autowired
private GirlRepository girlRepository;
@Transactional
public void insertTwo() {
Girl girlA = new Girl("garrett-test", 18, "Z");
girlRepository.save(girlA);
Girl girlB = new Girl("mayday-test", 21, "BBBBBBBB");
girlRepository.save(girlB);
}
}
@RestController
public class GirlController {
@Autowired
private GirlService girlService;
/**
* Tests transaction
*/
@GetMapping(value = "/transaction")
public void transactionTest() {
girlService.insertTwo();
}
}
4. Запустите приложение, откройтеPostman
,контрольная работаAPI
. Очевидно, операция была отброшена, когда произошло исключение, и в базу данных не было вставлено никаких данных.
####Конец комментариев Учиться нет конца, давайте работать вместе.