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.javaAppTest.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-jdbcspring-boot-starter-data-jpa “启动器”,我们将自动获得对HikariCP的依赖。 在本教程的后面,我们将使用spring-boot-starter-data-jpa进行数据访问。

现在,该将application.properties文件添加到我们的项目了。 在Spring Boot应用程序中,此文件包含所有配置属性,并且该文件应在classpath上可用。 我将删除App.javaAppTest.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应用程序中称为RepositoriesJPAJava持久性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.propertiesapplication-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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/345898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021年春季学期期末统一考试 国际公法 试题

试卷代号&#xff1a; 1018 2021年7月 一、单项选择题&#xff08;每题1分&#xff0c;共10分&#xff0c;每题只有一项答案正确&#xff0c;请将正确答案的序号填在括号内&#xff09; 1.关于国际法的效力依据问题&#xff0c;认为国际法的效力源于人类良知、理性和法律意识的…

html文字粒子效果简陋,5个很棒的CSS3文本粒子动画特效

CSS语言&#xff1a;CSSSCSS确定body {padding: 40px 0;font-family: bebas, sans-serif;}body .textcontainer {padding: 40px 0;text-align: center;}body .particletext {text-align: center;font-size: 48px;position: relative;}body .particletext.bubbles > .particl…

最小生成树、最短路径树

一、最小生成树与最短路径树的区别 最小生成树能够保证整个拓扑图的所有路径之和最小&#xff0c;但不能保证任意两点之间是最短路径。 应用如网络部线&#xff0c;把所有的电脑(服务器&#xff1f;&#xff09;都连起来用的网线(光纤&#xff1f;&#xff09;最少&#xff0c…

2021年春季学期期末统一考试 西方经济学(本) 试题

试卷代号&#xff1a; 1026 这里是引用 2021年7月 一、单项选择题&#xff08;在下列各题的备选答案中选择一个正确的&#xff0c;并将其序号字母填入题后的括号里。每题2分&#xff0c;共30分&#xff09; 1.其他因素保持不变&#xff0c;只是某种商品的价格下降&#xff0c;则…

国开文学英语赏析 2021春(2021年7月)

试卷代号&#xff1a; 1062 2021年7月 注意事项 一、将你的学号、姓名及分校&#xff08;工作站&#xff09;名称填写在答题纸的规定栏内。考试结束后&#xff0c;把试卷和答题纸放在桌上。试卷和答题纸均不得带出考场。监考人收完考卷和答题纸后才可离开考场。 二、仔细读懂题…

mpvue v-html解决方案,mpvue开发小程序所遇问题及h5转化方案

wx这个对象我们可以结合router和vux封装一下其中的navigateTo&#xff0c;redirectTo等路由及模态框和toast&#xff0c;并在webpack.base.conf配置wx指向该文件,这样我们就能直接使用wx这个对象面的方法不用修改/*webpack.base.conf*/resolve: {extensions: [.js, .vue, .json…

无线发射功率与增益

1. 无线发射功率与增益 无线电发射机输出的射频信号&#xff0c;通过馈线&#xff08;电缆&#xff09;输送到天线&#xff0c;由天线以电磁波形式辐射出去。电磁波到达接收地点后&#xff0c;由天线接收下来&#xff08;仅仅接收很小很小一部分功率&#xff09;&#xff0c;并…

web 项目集成福昕_项目学生:Web服务集成

web 项目集成福昕这是Project Student的一部分。 其他帖子包括带有Jersey的 Web服务 客户端&#xff0c;带有Jersey的 Web服务服务器 &#xff0c; 业务层 &#xff0c; 具有Spring数据的持久性和分片集成测试数据 。 早先&#xff0c;我们成功地针对持久性/业务层&#xff08…

151205 财务管理原理作业(笔试题型)

《财务管理原理&#xff08;专升本&#xff09;》作业 一、单项选择题 1、融资租赁又称财务租赁&#xff0c;有时也称资本租赁。下列&#xff08; &#xff09;情形不属于融资租赁范围。 A、根据协议&#xff0c;企业将某项资产卖给出租人&#xff0c;再将其租回使用 B…

分享百度文库提交成功的八大因素

我做百度文库已经有两个多月了&#xff0c;今天也是第二次以博文的形式跟大家分享经验&#xff0c;应该比第一次会更成熟一些&#xff0c;但是个人的能力毕竟是有限的&#xff0c;另外我的SEO优化经验也不多&#xff0c;可能提出的观点也不是很全面&#xff0c;还希望大家多包涵…

html表单自动提交表单提交表单数据类型,表单

表单在网页中主要负责数据采集功能。一个表单有三个基本组成部分&#xff1a; 表单标签&#xff1a;这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法。 表单域&#xff1a;包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上…

实施白色标签

有时&#xff08;根据我的经验&#xff0c;很多时候&#xff09;您需要为应用程序添加白色标签。 您通常可以以SaaS方式运行它&#xff0c;但是一些重要的或高知名度的客户端可能想要专用的部署或本地部署&#xff0c;或者只是在云部署中“自己的一角”。 白色标签通常包括不同…

卫星链路

卫星通信系统中&#xff0c;信息传输中&#xff0c;一条传输链路包括发端地球站、上行链路、卫星转发器、下行链路、收端地球站。按照空间分布可以分为星地链路和星间链路。影响其通信性能的因素主要有&#xff1a;发射端的发射功率与天线增益、传输过程中的损耗、传输过程中所…

国家开放大学人文英语4

客观题 交际用语&#xff08;共5题&#xff0c;共10分&#xff09; 1. — Do you think cosmetic surgery is more popular with women? — ________________ . A Yes, women are more popular than men B Yes, absolutely. Because women pay more attention to beauty…

微型计算机主机的主要组成部件是,微型计算机主机的主要组成部分有

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。微型计算机的主机由CPU和内存储器组成&#xff0c; CPU相当于微型计算机的大脑&#xff0c;包括控制器和运算器&#xff0c;内存储器分为RAM和ROM。分别对应微型计算机的运行空间和存…

定义Definition、公理、定理、推论、命题和引理的区别

WHAT IS THE DIFFERENCE BETWEEN A THEOREM(定理), LEMMA&#xff08;引理&#xff09;,AND A COROLLARY&#xff08;推论&#xff09;? PROF. DAVE RICHESON (1) Definition&#xff08;定义&#xff09; 对某个数学概念\术语&#xff08;符号、表达&#xff09;的解释。 A…

[渝粤题库]陕西师范大学《金融机构管理》作业

《金融机构管理》作业 一 、选择题 1&#xff0e;在我国的金融机构中&#xff0c;下列哪一项是政策性银行&#xff1f;&#xff08; &#xff09; A.交通银行 B.中国银行 C.中国农业发展银行 D.中国农业银行 2&#xff0e;商业银行最主要的资金来源是&…

计算机网络组成包括哪些内容,计算机网络系统的组成

互联网时代已经到来了&#xff0c;小编为你科普一下网络相关基础知识《计算机网络系统的组成》&#xff0c;让你更快融入互联网时代。计算机网络系统是通信子网和资源子网组成的。而网络软件系统和网络硬件系统是网络系统赖以存在的基础。在网络系统中&#xff0c;硬件对网络的…

正定和半正定

在众多的机器学习模型中&#xff0c;线性代数的身影无处不在&#xff0c;当然&#xff0c;我们也会时常碰到线性代数中的正定矩阵和半正定矩阵。例如&#xff0c;多元正态分布的协方差矩阵要求是半正定的。 ------------------------------------------ 1. 基本的定义 正定和…

[渝粤题库]陕西师范大学《幼儿园社会教育》作业

《幼儿园社会教育》作业 一、单选题 1.谁创立了发生认识论并提出了儿童认知发展阶段论&#xff08;&#xff09; &#xff21;&#xff0e;班杜拉  &#xff22;&#xff0e;弗洛伊德 &#xff23;&#xff0e;皮亚杰&#xff24;&#xff0e;柯尔伯格 2.下列不属于…