Spring Boot完成示例
这篇文章提供了一个使用Spring Boot开发松耦合REST服务的完整示例。 使用spring boot,我们可以开发可独立运行的生产就绪Java应用程序,它是独立的应用程序,具有最小的依赖性,并且与其他应用程序的耦合较少。 大多数时候,Spring Boot应用程序将提供一个内聚的服务,并且服务的边界是明确定义的。 让我们深入研究我们的示例。
在本教程中,我将使用Spring Boot 2.0.3.RELEASE,它需要Java 8或9和Maven 3.2+(Eclipse)作为IDE。
创建Maven jar模块
由于我们将应用程序打包为.jar文件,因此在将maven与Eclipse IDE集成之后,我们可以使用eclipse IDE支持来生成maven jar模块。 Eclipse的最新版本带有集成的maven插件。 因此,您无需将Maven插件显式添加到Eclipse中。 我不会在这篇文章中解释如何使用Eclipse创建Maven jar模块。 如果您想知道它,可以在这里阅读我的另一篇文章,其中清楚地说明了如何使用Eclipse创建Maven模块。
如果使用quickstart
工件创建maven项目,则将获得类似于以下内容的项目结构。
我创建了一个名为“ customer”的maven模块,其中“ com.semika”为groupId,“ customer”为工件ID。 您可以选择所需的包装结构。 您的内部包装结构将因此而改变。
App.java和AppTest.java文件将很快删除。 看一下pom.xml
文件,其中包含有关项目的信息以及Maven用于构建项目的配置详细信息。 由于本教程不涉及单元测试功能,因此您现在可以删除Junit依赖项。
我想在这里强调一个重要因素。
<packaging> jar </ packaging>
在这里,我们告诉maven将应用程序捆绑为.jar文件进行部署。
添加Spring Boot功能
现在,我们有了典型的maven jar模块。 我们如何将其转换为Spring Boot应用程序?
所有Spring Boot依赖项都在Maven存储库中的org.springframework.boot
组ID下定义。 spring-boot-starter-parent
是一个项目,具有一些默认设置和基本必需的配置,我们可以使用它们来快速开始使用spring boot。
我们可以通过将以下元素添加到我们的pom.xml
文件中来继承这些默认设置。
<!-- 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 Boot应用程序与数据库连接,或者如何将数据源集成到Spring Boot应用程序中。 Spring框架为通过直接JDBC访问Hibernate等ORM技术访问数据库提供了强大的支持。
javax.sql.DataSource
接口提供标准方法,以便通过使用连接池创建数据源来与数据库一起使用。 有几种实现,例如BoneCP,Apache通用DBCP2和spring的默认HikariCP。如果我们使用spring-boot-starter-jdbc
或spring-boot-starter-data-jpa
“启动器”,我们将自动获得对HikariCP的依赖。 在本教程的后面,我们将使用spring-boot-starter-data-jpa
进行数据访问。
现在,该将application.properties
文件添加到我们的项目了。 在Spring Boot应用程序中,此文件包含所有配置属性,并且该文件应在classpath上可用。 我将删除App.java
和AppTest.java
文件,并在与main文件夹平行的main文件夹中创建一个新文件夹作为resources
。 使用maven构建模块时,“资源”文件夹中的文件可用于classpath。 我们不需要提取任何东西。
让我们在资源文件夹中创建一个文件作为application.properties
。 我将把我的spring boot应用程序连接到MySql数据库。
为Spring Boot应用程序创建数据存储所需的最小属性如下。
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.Driverspring.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数据库,因此应如下所示将mysql-java connector
maven依赖项添加到我们的pom.xml
文件中。
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId>
</dependency>
添加主应用程序类
每个spring boot应用程序都应该有一个定义了main()
方法的主类。 通常,此类被命名为Application.java
并且应位于其他类上方的根包中。 此类通常带有少量注释。
- @EnableAutoConfiguration –此批注为我们的Spring Boot应用程序启用自动配置,该应用程序尝试根据添加的jar依赖项自动配置我们的Spring应用程序。
- @ComponentScan –这通过使用@Autowired注释启用Spring bean依赖项注入功能。 我们所有的应用程序组件这是使用了@Component注解,@Service,@Repository或@Controller被自动注册为Spring Bean。 可以使用@Autowired批注来注入这些bean。
- @Configuration –这可以为Spring Boot应用程序启用基于Java的配置。 通常,定义main方法的类是使用此注释进行注释的很好的候选者。
我将在com.semika
包内创建一个新类Application.java
,这是我的Spring Boot应用程序的根。
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
@Configurationpublic class Application {public static void main(String[] args) {SpringApplication app = new SpringApplication(Application.class);app.run(args); }
}
代替使用所有三个注释,我们只能使用@SpringBootApplication注释,这等效于使用@ Configuration , @ EnableAutoConfiguration和@ComponentScan及其默认属性,如以下示例所示。
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添加数据访问功能
现在,让我们看看如何将数据访问功能集成到我们的Spring Boot应用程序中。 数据访问类在Spring Boot应用程序中称为Repositories
。 JPA ( Java持久性API )是一种标准技术,可让我们将对象“映射”到关系数据库。
spring-boot-starter-data-jpa
入门项目提供了一种快速启动Spring Boot应用程序数据访问的方法。 它提供以下关键依赖性:
- 使用Hibernate映射对象与数据库表。
- Spring Data JPA,可用于编写基于JPA的存储库。
- Spring框架对ORM的核心支持。
为了将数据访问功能添加到我们的Spring Boot应用程序中,我们应该将以下maven依赖项添加到我们的pom.xml
文件中。
添加波纹管依赖性之后,我们可以使用常规的JPA批注来映射具有关系数据库表的对象。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
让我们在com.semika
根文件夹中创建一个新的customer
包,该根文件夹是Application.java
类现在所处的位置。 在客户文件夹中,新的实体类创建为Customer.java
。
现在,我的客户数据库表具有以下三个属性。
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
}
Spring数据JPA存储库是可以定义为访问数据的接口。 JPA查询是根据方法名称自动创建的。 例如, CustomerRepository.java
类中的findAll()
方法获取所有客户。 findByFirstName
(String firstName)方法将获取给定名字的所有客户。
Spring Data存储库抽象中的中央接口是Repository
接口。 它使用要管理的域类以及域类的ID类型作为类型参数CrudRepository
接口为要管理的实体类提供复杂的CRUD功能。 我们的存储库接口应从CrudRepository
接口扩展。
我们的CustomerRepository.java
接口将如下所示:
package com.semika.customer;import org.springframework.data.repository.CrudRepository;public interface CustomerRepository extends CrudRepository<Customer Long> {}
您可能会找到实现类? Spring数据JPA为大多数数据访问方案提供了实现。 我们不需要显式实现那些方法。 如果您想了解有关Spring数据JPA的更多信息,可以在此处阅读参考文档。
此外,我将添加CustomerService.java
接口及其实现CustomerServiceImpl.java
类,以将业务逻辑保持在单独的层中。
package com.semika.customer;public interface CustomerService {public Iterable<Customer> findAll();
}
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 {@Autowiredprivate CustomerRepository customerRepository;public Iterable<Customer> findAll() {return customerRepository.findAll(); }
}
您可以看到,CustomerRepository使用@Autowired批注注入到CustomerServiceImpl
类。 我们确实通过在本教程的开头通过@SpringBootApplication将@ComponentScan批注添加到我们的Application.java
类中来实现了这一点。
添加网络功能
现在,是时候构建和测试我们的应用程序了。 假设客户端发出HTTP请求以获取所有客户数据。 因此,我们的spring boot应用程序应该响应HTTP请求。 Spring MVC提供了接受HTTP请求和响应的Controllers
。 在这里,我们将向我们的Spring Boot应用程序添加一些spring MVC功能。 通过使用spring-boot-starter-web
项目,我们可以将一些基本的MVC功能集成到我们的spring boot应用程序中,以便我们可以编写简单的Controller类来响应客户端的HTTP请求。
我们应该将以下Maven依赖项添加到我们的项目中。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId>
</dependency>
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 {@Autowiredprivate CustomerService customerService;@RequestMapping("/customers") @ResponseBodypublic Iterable<Customer> findAll() {Iterable<Customer> customers = customerService.findAll();return customers;}
}
@RestController是Spring MVC中的构造型注释,它为人们阅读代码提供了提示,并为Spring提供了类扮演特定角色的提示。 也就是说,它包含进入应用程序的门。 在这种情况下,我们的类是一个Web @Controller ,因此Spring在处理传入的Web请求时会考虑使用它。
@RestController注释告诉Spring将结果字符串直接呈现回调用方。
@RequestMapping批注提供“路由”信息。 它告诉Spring,任何带有/customers
路径的HTTP请求都应映射到findAll()
方法。
这两个注释是Spring MVC注释。 它们不特定于Spring Boot。 我们在今年Spring增加了MVC Web功能,以便通过发出一些Web请求来测试我们的应用程序。 通过将spring-boot-starter-web
到spring boot应用程序中,在运行它时,spring boot应用程序将启动它自己的Web容器并在其中运行。
所以现在,我们的项目结构应该如下。
建筑应用
Spring Boot jar文件被称为一个独立的可执行jar文件,我们可以在生产环境中直接运行它。 可执行的jar是包含您的已编译类以及代码需要运行的所有jar依赖项的归档文件。 在我们的示例中,由于我们使用了pring-boot-starter-web
,因此在运行jar文件时,它将启动内部Web容器以运行应用程序。
要创建可执行jar,我们需要将spring-boot-maven-plugin
到我们的pom.xml
。 为此,请在“插件”部分下方插入以下几行。
<plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin>
</plugins>
您可能会注意到此处缺少上述插件的某些配置。 由于我们使用的是spring-boot-starter-parent
,因此我们不必担心这些,因为这些已包含在父项目中。 例如,父项目POM包含<executions>配置以绑定重新打包目标。
现在让我们看一下最终的pom.xml
文件:
<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>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><url>http://maven.apache.org</url><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
文件所在的项目根文件夹,然后运行以下命令。
mvn package
在目标文件夹中,您可以看到我们的可执行jar文件创建为customer-0.0.1-SNAPSHOT.jar
。
运行应用程序
在同一文件夹中,运行以下命令以运行jar文件。
java -jar target/customer-0.0.1-SNAPSHOT.jar
如果在启动应用程序时分析日志,则会发现许多重要的事情。
服务器启动时的控制台输出如下:
如果在底部附近看到日志,它将在端口8080上启动Tomcat服务器。如果从浏览器访问http://localhost:8080/customers
URL,则将获得客户的JSON响应作为响应。
如果要在默认端口之外的其他端口上启动应用程序,则可以通过使用--server.port
选项指定端口,如下所示。
java --server.port=9000 -jar target/customer-0.0.1-SNAPSHOT.jar
如果要在启用调试的情况下启动应用程序,则可以使用以下命令:
java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar target/customer-0.0.1-SNAPSHOT.jar
要在启用调试日志的情况下启动应用程序,可以使用以下命令:
java -jar target/customer-0.0.1-SNAPSHOT.jar --debug
如果要在“ application.properties ”文件中指定服务器正在运行的端口,则可以在文件中包括以下属性。
server.port=${port:9000}
使用application.properties
文件中的上述条目,而不是使用--server.port
选项,只需使用java -jar
命令使用--port
选项即可指定端口。
大多数时候,您的配置属性因环境而异。 对于开发,生产和测试等环境,您可能需要保留不同的配置属性集。 您可以通过为每个环境保留不同的配置配置文件来做到这一点。
为了实现此目的,您应该以以下格式创建配置属性文件。
application-${profile}.properties
假设您需要分别为“开发”和“生产”环境保留两个配置文件。 在这种情况下,您应该创建两个属性文件,分别为application-development.properties
和application-production.properties
。
使用java -jar
命令启动应用程序时,应使用-D
参数指定概要文件,如下所示:
java -jar -Dspring.profiles.active=production customer-0.0.1-SNAPSHOT.jar
我希望这篇文章对尝试学习Spring Boot应用程序和Micro服务的初学者特别有用。
参考: Spring Boot参考指南
翻译自: https://www.javacodegeeks.com/2018/07/spring-boot-complete-example.html
Spring Boot完成示例相关推荐
- Spring Boot AJAX 示例
本文以spring boot框架.thymeleaf引擎为基础,利用jquery.ajax提交HTML表单请求到后台(spring rest api),后台返回一个JSON格式的数据为例进行说明. 开 ...
- Spring boot Rabbitmq 示例
Spring boot Rabbitmq 示例 简介 Spring boot RabbitMQ 简单程序示例 编写详情 RabbitMQ docker 避免麻烦,直接使用docker启 ...
- Spring Boot 综合示例-整合thymeleaf、mybatis、shiro、logging、cache开发一个文章发布管理系统...
一.概述 经过HelloWorld示例(Spring Boot 快速入门(上)HelloWorld示例)( Spring Boot 快速入门 详解 HelloWorld示例详解)两篇的学习和练习,相 ...
- Spring Boot DTO 示例 - 实体到 DTO 的转换
在本教程中,我们将学习如何在Spring Boot 应用程序中创建 DTO(数据传输对象)类,以及如何使用 ModelMapper 库将实体转换为 DTO,反之亦然. 数据传输对象设计模式是一种常用的 ...
- 【Spring Boot】Spring Boot Logging 示例 | 日志记录
文章目录 logging.level | 设置日志级别 logging.file | 指定输出日志文件的路径和名称 logging.path | 指定输出日志文件的路径 logging.pattern ...
- Spring Boot CLI设置和HelloWorld示例
Spring Boot CLI设置和HelloWorld示例 在我之前的文章"Spring Boot简介"和"Spring Boot组件和内部"中,我们讨论了S ...
- Spring Boot 缓存教程示例
在本Spring Boot 教程中,学习如何从 Spring 框架缓存支持中轻松管理应用程序缓存.Spring 在缓存方面有一些很好的特性,Spring 缓存 API 的抽象使用起来非常简单. 1.缓 ...
- 面试那点小事,你从未见过的spring boot面试集锦(附详细答案)
一, 什么是spring boot? 多年来,随着新功能的增加,spring变得越来越复杂.只需访问页面https://spring.io/projects,我们将看到所有在应用程序中使用的不同功能的 ...
- SpringBoot快速开发利器:Spring Boot CLI
今日推荐 推荐一个 Java 接口快速开发框架干掉Random:这个类已经成为获取随机数的王者Docker + Intellij IDEA,提升 10 倍生产力!笑出腹肌的注释,都是被代码耽误的诗人! ...
最新文章
- python和软件自动化_软件测试和自动化测试
- php和python和java-python与java区别
- 演进实录|不同阶段的企业如何搭建监控体系?
- 使用python实现大文件分割与合并
- 先读懂CapsNet架构然后用TensorFlow实现,这应该是最详细的教程了
- C#3.0扩展方法[转]
- python编码器下载_Python Code128编码器
- python操作mysql数据库(增、删、改、查)_python对 MySQL 数据库进行增删改查的脚本...
- java的smalltalk规则,Smalltalk相当于Java的静态是什么?
- Office2021中文零售版的离线安装包下载地址合集
- (翻译)Entity Framework技巧系列之一 - Tip 1 - 5
- 某学院软件工程复试回忆总结
- 写论文:证明非线性系统的稳定性
- Python安装pyqt4
- chrome突然无法复制粘贴了
- PS长投影文字制作教程
- hadoop更换硬盘
- 【无标题】【3D建模制作技巧分享】zbrush中如何卡硬边?
- 程序员如何更换证件照背景色
- 吃的很晚仍然能减肥不?
热门文章
- 博客文章列表(一)——JAVA
- MySQL weekday()函数
- 程序员如何面对 HR 面试的 40 个问题
- Java Socket编程总结
- laravel使用migrate操作数据库迁移
- sqlserver建库建表建约束,删库删表删约束的示例总结
- Redis非阻塞I/O多路复用机制
- html5页面转场,基于HTML5 SVG的页面过渡切换效果
- python开发stm32软件_ADB+Python+STM32 实现 微信跳一跳辅助
- redis创建集群报错can‘t connect to node 192.168.163.203