В этом посте приведен полный пример использования весенней загрузки для разработки слабо связанной службы REST. Используя весеннюю загрузку, мы можем разработать готовое к работе Java-приложение, которое будет работать независимо, как отдельное приложение с минимальными зависимостями и меньшей связью с другими приложениями. Большую часть времени приложение весенней загрузки будет предоставлять связную услугу, и границы службы будут четко определены. Давайте углубимся в наш пример.
Для этого урока я собираюсь использовать Spring Boot 2.0.3.RELEASE, который требует java 8 или 9 и Maven 3.2+, Eclipse в качестве IDE.
Создание Maven Jar модуля
Поскольку мы собираемся связать наше приложение в виде файла .jar , мы можем использовать поддержку Eclipse IDE для создания jar-модуля maven после интеграции maven с Eclipse IDE. Последняя версия Eclipse поставляется с интегрированным плагином Maven. Так что вам не нужно явно добавлять плагин Maven в Eclipse. Я не собираюсь объяснять, как создать модуль jav maven с затмением в этом посте. Если вы хотите узнать это, вы можете прочитать мой другой пост здесь, который ясно объясняет, как создавать модули maven с помощью eclipse.
Если вы создадите проект maven с помощью артефакта quickstart
, вы получите структуру проекта, подобную следующей.
Я создал модуль maven под названием «customer» с «com.semika» в качестве groupId и «customer» в качестве идентификатора артефакта. Вы можете выбрать то, что когда-либо структура пакета, вы хотите. Ваша внутренняя структура пакета будет меняться в зависимости от этого.
Файлы App.java и AppTest.java будут удалены в ближайшее время. Взгляните на файл pom.xml
который содержит информацию о проекте и сведения о конфигурации, используемые Maven для создания проекта. Вы можете удалить зависимость Junit на данный момент, так как это руководство не охватывает функции модульного тестирования.
Я хочу выделить один важный элемент здесь.
<упаковка> банка </ упаковка>
Здесь мы говорим maven, что нужно связать наше приложение как файл .jar для развертывания.
Добавление функций весенней загрузки
Теперь то, что мы имеем, это типичный мавенский кувшин. Как мы собираемся преобразовать это в весеннее загрузочное приложение?
Все весенние загрузочные зависимости определены в id группы org.springframework.boot
в репозитории maven. spring-boot-starter-parent
— это проект, который имеет некоторые настройки по умолчанию и основные необходимые конфигурации, которые мы можем использовать, чтобы быстро начать использовать Spring Boot.
Мы можем унаследовать эти настройки по умолчанию, добавив следующий элемент в наш файл pom.xml
.
1
2
3
4
5
6
|
<!-- Inherit defaults from Spring Boot --> < parent > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-parent</ artifactId > < version >2.0.3.RELEASE</ version > </ parent > |
Подключение к базе данных
Теперь давайте посмотрим, как мы можем связать наше приложение весенней загрузки с базой данных или как мы интегрируем источник данных в наше приложение весенней загрузки. Spring Framework предоставляет отличную поддержку для доступа к базе данных от прямого доступа JDBC к технологиям ORM, таким как Hibernate.
Интерфейс javax.sql.DataSource
предоставляет стандартные методы для работы с базой данных путем создания источника данных с пулом соединений. Существует несколько реализаций, таких как BoneCP, Apache common DBCP2 и Spring по умолчанию HikariCP. Если мы используем «стартеры» spring-boot-starter-jdbc
или spring-boot-starter-data-jpa
, мы автоматически получаем зависимость от HikariCP. Мы собираемся использовать spring-boot-starter-data-jpa
для доступа к данным позже в этом руководстве.
Теперь пришло время добавить файл application.properties
в наш проект. В весеннем загрузочном приложении этот файл содержит все свойства конфигурации, и этот файл должен быть доступен в classpath. Я собираюсь удалить App.java
и AppTest.java
и создать новую папку в качестве resources
внутри «главной» папки, параллельно папке «Java». При сборке модулей с использованием maven файлы в папке ‘resources’ становятся доступными для classpath. Нам не нужно ничего извлекать.
Давайте создадим файл как application.properties
внутри папки ресурсов. Я собираюсь подключить мое весеннее загрузочное приложение к базе данных MySql.
Минимальные свойства, необходимые для создания источника данных для приложения весенней загрузки, заключаются в следующем.
1
2
3
4
5
6
7
|
spring.datasource.url=jdbc:mysql: //localhost/springboot?useSSL=false spring.datasource.username=root spring.datasource.password=abc123 spring.datasource.driver- class -name=com.mysql.jdbc.Driver spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect spring.jpa.show-sql= false |
Здесь соглашение об имени свойства не было выбрано случайно. Свойства конфигурации источника данных Spring должны иметь префикс с spring.datasource.*
. Если вы хотите настроить конкретную реализацию источника данных, имена свойств должны быть указаны с соответствующим префиксом как spring.datasource.hikari.*
, spring.datasource.tomcat.*
, spring.datasource.dbcp2.*
.
Поскольку мы собираемся подключиться к базе данных MySql, в наш файл pom.xml
необходимо добавить зависимость maven mysql-java connector
следующим образом.
1
2
3
4
|
< dependency > < groupId >mysql</ groupId > < artifactId >mysql-connector-java</ artifactId > </ dependency > |
Добавление основного класса приложения
Каждое весеннее загрузочное приложение должно иметь основной класс с определенным методом main()
. Обычно этот класс называется Application.java
и должен располагаться в корневом пакете над другими классами. Этот класс обычно аннотируется несколькими аннотациями.
- @EnableAutoConfiguration — эта аннотация включает автоконфигурацию для нашего приложения весенней загрузки, которое пытается автоматически настроить наше приложение Spring на основе добавленных нами зависимостей jar.
- @ComponentScan — это позволяет использовать функцию вставки зависимостей bean-компонента Spring с помощью аннотации @Autowired Все компоненты нашего приложения, которые были аннотированы с помощью @Component, @Service , @Repository или @Controller , автоматически регистрируются как Spring Beans. Эти бобы могут быть введены с помощью аннотации @Autowired .
- @Configuration — это позволяет использовать конфигурации на основе Java для приложения весенней загрузки. Обычно класс, который определяет метод main, является хорошим кандидатом для аннотирования этой аннотацией.
Я собираюсь создать новый класс Application.java
внутри пакета com.semika
, который является корнем для моего весеннего загрузочного приложения.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
package com.semika; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @EnableAutoConfiguration @ComponentScan @Configuration public class Application { public static void main(String[] args) { SpringApplication app = new SpringApplication(Application. class ); app.run(args); } } |
Вместо использования всех трех аннотаций мы можем использовать только аннотацию @SpringBootApplication, которая эквивалентна использованию @Configuration , @EnableAutoConfiguration и @ComponentScan с их атрибутами по умолчанию, как показано в следующем примере.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
package com.semika; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication app = new SpringApplication(Application. class ); app.run(args); } } |
Добавление функций доступа к данным с помощью spring-data-JPA
Теперь давайте посмотрим, как мы можем интегрировать функции доступа к данным в наши весенние загрузочные приложения. Классы доступа к данным называются Repositories
в весеннем загрузочном приложении. JPA ( Java Persistence API ) — это стандартная технология, которая позволяет нам «сопоставлять» объекты с реляционными базами данных.
spring-boot-starter-data-jpa
проект spring-boot-starter-data-jpa
предоставляет быстрый способ начать работу с доступом к данным для приложения весенней загрузки. Он предоставляет следующие ключевые зависимости:
- Использование Hibernate для сопоставления объектов с таблицами базы данных.
- Spring Data JPA, который можно использовать для написания репозиториев на основе JPA.
- Основная поддержка ORM от Spring Framework.
Чтобы добавить функции доступа к данным в наше приложение весенней загрузки, мы должны добавить следующую зависимость maven в наш файл pom.xml
.
После добавления приведенной ниже зависимости мы можем использовать обычные аннотации JPA для сопоставления объектов с таблицей реляционной базы данных.
1
2
3
4
|
< dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-data-jpa</ artifactId > </ dependency > |
Давайте создадим новый пакет в качестве customer
в корневой папке com.semika
в которой сейчас находится класс Application.java
. Внутри папки клиента новый класс сущности записан как Customer.java
.
На данный момент моя таблица базы данных клиентов имеет три атрибута следующим образом.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
package com.semika.customer; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table (name= "customer" ) public class Customer { @Id @GeneratedValue (strategy = GenerationType.AUTO) private Long id; @Column (name= "first_name" ) private String firstName; @Column (name= "last_name" ) private String lastName; @Column (name= "address" ) private String address; public Customer() { super (); } // getters and setters } |
Репозитории JPA данных Spring — это интерфейсы, которые могут быть определены для доступа к данным. Запросы JPA создаются автоматически из имен методов. Например, findAll()
в классе CustomerRepository.java
выбирает всех клиентов. Метод findByFirstName
(String firstName) findByFirstName
всех клиентов с заданным именем.
Центральным интерфейсом в абстракции репозитория Spring Data является интерфейс Repository
. Он управляет классом домена, а также идентификатором типа домена в качестве аргументов CrudRepository
Интерфейс CrudRepository
предоставляет сложные функции CRUD для управляемого класса сущностей. Наши интерфейсы репозитория должны расширяться от интерфейса CrudRepository
.
Наш интерфейс CustomerRepository.java
будет выглядеть следующим образом:
1
2
3
4
5
6
7
|
package com.semika.customer; import org.springframework.data.repository.CrudRepository; public interface CustomerRepository extends CrudRepository<Customer Long> { } |
Вы можете найти для реализации класса? Spring data JPA обеспечивает реализацию для большинства сценариев доступа к данным. Нам не нужно явно реализовывать эти методы. Если вы хотите узнать больше о данных пружины JPA, вы можете прочитать справочную документацию здесь .
Далее, я собираюсь добавить интерфейс CustomerService.java
и его реализацию класса CustomerServiceImpl.java
, чтобы сохранить нашу бизнес-логику на отдельном уровне.
1
2
3
4
5
|
package com.semika.customer; public interface CustomerService { public Iterable<Customer> findAll(); } |
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
package com.semika.customer; package com.semika.customer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class CustomerServiceImpl implements CustomerService { @Autowired private CustomerRepository customerRepository; public Iterable<Customer> findAll() { return customerRepository.findAll(); } } |
Вы можете видеть, что CustomerRepository внедряется в класс CustomerServiceImpl
с помощью аннотации @Autowired . Мы включили это, добавив аннотацию @ComponentScan через @SpringBootApplication в наш класс Application.java
начале этого урока.
Добавление веб-функций
Теперь пришло время построить и протестировать наше приложение. Предположим, клиент делает HTTP-запросы для получения всех данных клиентов. Поэтому наше весеннее загрузочное приложение должно отвечать на HTTP-запросы. Spring MVC предоставляет Controllers
которые принимают HTTP-запросы и ответы на них. Здесь мы собираемся добавить некоторые функции Spring MVC в наше приложение весенней загрузки. Используя проект spring-boot-starter-web
, мы можем интегрировать некоторые базовые функции MVC в наше приложение весенней загрузки, чтобы мы могли написать простой класс Controller, который отвечает на HTTP-запросы клиента.
Мы должны добавить следующую maven-зависимость в наш проект.
1
2
3
4
|
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> |
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
package com.semika.customer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; @RestController public class CustomerController { @Autowired private CustomerService customerService; @RequestMapping ( "/customers" ) @ResponseBody public Iterable<Customer> findAll() { Iterable<Customer> customers = customerService.findAll(); return customers; } } |
@RestController — это аннотация стереотипа в Spring MVC, которая предоставляет подсказки для людей, читающих код, и для Spring, что класс играет особую роль. То есть он содержит ворота для входа в приложение. В этом случае наш класс — это web @Controller , поэтому Spring учитывает его при обработке входящих веб-запросов.
Аннотация @RestController сообщает Spring, чтобы визуализировать полученную строку непосредственно обратно в вызывающую программу.
Аннотация @RequestMapping предоставляет информацию о «маршрутизации». Он сообщает Spring, что любой HTTP-запрос с путем /customers
должен быть сопоставлен с методом findAll()
.
Эти две аннотации являются весенними аннотациями MVC. Они не характерны для весенних сапог. Этой весной мы добавили веб-функции MVC, чтобы протестировать наше приложение, сделав несколько веб-запросов. С добавлением spring-boot-starter-web
в приложение весенней загрузки, при запуске его приложение весенней загрузки запускает собственный веб-контейнер и запускается в нем.
Итак, теперь наша структура проекта должна быть следующей.
Строительное приложение
Весенний загрузочный jar-файл называется автономным исполняемым jar-файлом, который мы можем запустить непосредственно в производственной среде. Исполняемые файлы jar — это архивы, содержащие ваши скомпилированные классы вместе со всеми зависимостями jar, которые должен запускать ваш код. В нашем примере, поскольку мы использовали pring-boot-starter-web
, при запуске файла jar он запускает внутренний веб-контейнер для запуска приложения.
Чтобы создать исполняемый файл jar, нам нужно добавить spring-boot-maven-plugin
в наш pom.xml
. Для этого вставьте следующие строки чуть ниже раздела плагинов.
1
2
3
4
5
6
|
< plugins > < plugin > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-maven-plugin</ artifactId > </ plugin > </ plugins > |
Вы можете заметить, что некоторые конфигурации для указанного выше плагина здесь отсутствуют. Поскольку мы используем spring-boot-starter-parent
, нам не нужно беспокоиться об этом, потому что они уже включены в родительский проект. Например, POM родительского проекта включает конфигурацию <executetions> для привязки цели переупаковки.
Давайте посмотрим на наш последний файл pom.xml
:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
< project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" < modelVersion >4.0.0</ modelVersion > < groupId >com.semika.user</ groupId > < artifactId >customer</ artifactId > < version >0.0.1-SNAPSHOT</ version > < packaging >jar</ packaging > <!-- Inherit defaults from Spring Boot --> < parent > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-parent</ artifactId > < version >2.0.3.RELEASE</ version > </ parent > < name >customer</ name > < properties > < project.build.sourceEncoding >UTF-8</ project.build.sourceEncoding > </ properties > <!-- Building an executable jar file --> < build > < plugins > < plugin > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-maven-plugin</ artifactId > </ plugin > </ plugins > </ build > < dependencies > <!-- Adding spring data jpa features --> < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-data-jpa</ artifactId > </ dependency > <!-- Java MySQL connector --> < dependency > < groupId >mysql</ groupId > < artifactId >mysql-connector-java</ artifactId > </ dependency > <!-- Integrating spring MVC features --> < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-web</ artifactId > </ dependency > </ dependencies > </ project > |
Давайте создадим приложение. Перейдите в корневую папку проекта, где pom.xml
файл pom.xml
и выполните следующую команду.
1
|
mvn package |
Внутри целевой папки вы можете увидеть наш исполняемый файл jar, созданный как customer-0.0.1-SNAPSHOT.jar
.
Запуск приложения
Из этой же папки выполните следующую команду, чтобы запустить файл jar.
1
|
java -jar target/customer- 0.0 . 1 -SNAPSHOT.jar |
Если вы проанализируете журналы при запуске приложения, вы можете обнаружить много важных вещей.
Вывод консоли при запуске сервера выглядит следующим образом:
Если вы видите журналы внизу, он запускает сервер Tomcat на порт 8080. Если вы обращаетесь к http://localhost:8080/customers
Customers из браузера, вы получите ответ JSON от клиентов в качестве ответа.
Если вы хотите запустить приложение на другом порту, отличном от порта по умолчанию, вы можете указать порт, --server.port
параметр --server.port
следующим образом.
1
|
java --server.port=9000 -jar target /customer-0 .0.1-SNAPSHOT.jar |
Если вы хотите запустить приложение с включенной отладкой, вы можете использовать следующую команду:
1
|
java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar target /customer-0 .0.1-SNAPSHOT.jar |
Чтобы запустить приложение с включенным журналом отладки, вы можете использовать следующую команду:
1
|
java -jar target /customer-0 .0.1-SNAPSHOT.jar --debug |
Если вы хотите указать работающий порт сервера в файле application.properties , вы можете включить в файл следующее свойство.
1
|
server.port=${port:9000} |
С помощью указанной выше записи в файле application.properties
вместо использования параметра --server.port
вы можете просто указать пользовательский параметр java -jar
командой java -jar
, чтобы указать порт.
В большинстве случаев ваши параметры конфигурации отличаются от среды к среде. Для таких сред, как разработка, производство и тестирование, вам может потребоваться сохранить другой набор свойств конфигурации. Вы можете сделать это, сохранив различные профили конфигурации для каждой среды.
Вы должны создать файл свойств конфигурации в следующем формате, чтобы добиться этого.
1
|
application-${profile}.properties |
Допустим, вам нужно отдельно хранить два профиля конфигурации для среды «разработки» и «производства». В этом случае вы должны создать два файла свойств как application-development.properties
и application-production.properties
.
При запуске приложения с помощью команды java -jar
вы должны указать профиль с параметром -D
следующим образом:
1
|
java -jar -Dspring.profiles.active=production customer-0.0.1-SNAPSHOT.jar |
Я надеюсь, что этот пост будет полезен специально для начинающих, которые пытаются узнать о приложении весенней загрузки и услугах Micro.
Справочные материалы: Spring Boot Reference Guide
Опубликовано на Java Code Geeks с разрешения Семики Калуге, партнера нашей программы JCG. Смотрите оригинальную статью здесь: Spring Boot Complete Example
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |