只需5分钟即可启动并运行分层架构:: Spring Boot第1部分

这是一个分为两部分的系列,其中我将展示如何使用Spring Boot创建分层架构。

什么是分层体系结构:简而言之,当我们构建企业应用程序时,我们维护不同的层以封装特定于层的逻辑,这样就不会溢出到另一层。 当我们考虑企业应用程序时,我们可以想象该架构的三个重要层。

分层架构

1. 用户界面 :与最终用户进行交互,向他们显示数据,接受用户输入,接受他们的命令等。

2. 业务层 :基于用户命令和从用户那里捕获的数据(AKA表单),它会做出特定于域的决策,例如如何处理数据,查找哪个表,如何处理数据。从数据库中获取,因此可以在UI中显示。

3. 持久层 :该层捕获数据并对其进行持久化,同样也捕获数据状态的任何更新,删除和更改,因此您可以将此层视为维护特定于应用程序数据的状态。

无论您的应用程序处于运行状态还是关闭状态,它都会存储提交后的数据状态。

通过分层体系结构,我们像所有代码一样创建每一层的逻辑封装,有关UI的信息留在UI层中,有关业务逻辑的所有代码均留在业务层中,等等。

每一层都与其相邻的层通信,但是从不与不相邻的另一层通信。

因此,如果您的应用程序具有三层UI,即Business,DAO,UI与Business进行通信,Business与UI进行通信以及DAO和DAO与Business进行通信。 通过这种方式,我们可以减少耦合,使层可重复使用,并欢迎体系结构的未来变化。 每个层都有其自己的模式,以适应将来的更改并使该层可重用。

我们都知道Spring为每个层提供了不同的组件,例如,对于UI,您可以使用Thymleaf或Spring模板或任何其他UI框架(如JSF);对于Business层,可以使用Controller和service;还可以在其中注入不同的框架(如Struts)它。 对于持久层,您可以使用Spring数据JPA,Hibernate,JDBC模板。 但是问题是您需要在pom.xml中添加所有插件/ Jars。 在类路径中找到依赖项的正确版本。 如果版本不匹配,它将无法正常工作。 另外,您还需要在Spring XML文件中添加许多Spring特定的批注或XML条目,以在分层体系结构中使用那些组件/插件,这是一种繁琐的方法。 另外,您需要打包它们并将它们部署在应用程序服务器中,因此需要许多手动干预。 Spring解决了这个问题,并提出了一个称为Spring Boot的解决方案。

Spring-boot按照约定优于配置进行工作 ”-这意味着您不必考虑配置条目,仅需注意业务逻辑,只要您在类路径中提到了那些要使用的组件即可,Spring Boot是如此。聪明,它将了解您想要使用相同的配置,并为您配置功能完备的组件。 假设您要在项目中使用JPA。 如果导入Spring boot starter JPA模块,它将了解您要使用它,并会即时为您创建Spring模板的存储库和实用程序CRUD方法。 如果没有Spring-boot,则需要配置JPA模板,从模板启动会话工厂,获取会话等,这些在这里不是必需的,Spring boot如此强大,可以为您完成此操作,当然,如果您想要自己控制配置,您可以覆盖它们并使用自己的配置。

在本教程中,我将向您展示如何使用Spring-boot逐步创建MVC分层体系结构,您会感到惊讶。 在五分钟之内,您可以创建并运行MVC架构,该架构以前需要花费大量时间,并且在版本不匹配的情况下会产生很多麻烦。

由于这是一个分为两部分的系列,因此在第一部分中,我们将建立数据库,并使用JPA存储库将Employee数据插入数据库中。

在本教程中,我们将使用以下组件

1. H2数据库 :这是一个内存数据库,它将持久存储数据,直到应用程序关闭。

2. Spring Data JPA :我们将使用Spring data JPA组件在数据库中进行CRUD操作。

3. Rest Controller :与传统的MVC不同, Rest Controller将以JSON格式显示数据,而不是将响应转发到View。

步骤1 :转到start.spring.io并通过选择Web,JPA,H2 Module下载模板项目。

分层架构

步骤2:将该项目作为Maven项目导入eclipse。

步骤3:检查pom.xml,spring-starter-web,spring-starter-data-jpa,h2模块条目将在那里。 这些是Spring引导软件包,其中包含jpa和web的所有必需依赖项,并维护依赖jar的正确版本,这样就不会出现版本不匹配的问题。

<?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>com.example</groupId>
<artifactId>layerdArchitechture</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging><name>layerdArchitechture</name>
<description>Demo project for Spring Boot</description><parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.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-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies><build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build></project>

步骤4:转到src / main / resources下的application.properties文件,并将h2控制台启用为true,这样我们就可以看到在h2数据库中插入的数据。

spring.h2.console.enabled=true

步骤5:让我们创建一个Employee实体。

package com.example.layerdArchitechture.entity;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;@Entity
public class Employee {
@Id@GeneratedValue
private Long id;
private String name;
private String address;
private String sex;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + ", address=" + address + ", sex=" + sex + "]";
}}

步骤6:现在创建一个EmployeeRepositiry接口,它将扩展CrudRepository接口,即时运行Spring-boot创建一个实现并创建所有的Utility(crud)方法,我们只需要声明该接口就不需要做任何事情。

package com.example.layerdArchitechture.repository;import org.springframework.data.repository.CrudRepository;import org.springframework.stereotype.Repository;
import com.example.layerdArchitechture.entity.Employee;@Repositorypublic interface EmployeeRepositiry extends CrudRepository<Employee, Long> {}

步骤7.现在创建一个Data Loader类,它将使用上述创建的存储库将少量员工插入H2数据库。 为此,我必须自动连接EmployeeRepository接口。 请在这里注意loadData方法。 我创建了一个员工列表,然后迭代该列表,并使用Java8中的lambda表达式将这些数据保存在H2数据库中。

package com.example.layerdArchitechture;import java.util.ArrayList;
import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import com.example.layerdArchitechture.entity.Employee;
import com.example.layerdArchitechture.repository.EmployeeRepositiry;@Component
public class InitDataLoader {
@Autowired
private EmployeeRepositiry rep;public void loadData() {
createData().forEach(
emp->{
rep.save(emp);
System.out.println("Successfully saved ::" + emp);
});}private List<Employee> createData() {List<Employee> employees = new ArrayList<Employee>();Employee emp = new Employee();
emp.setName("Shamik Mitra");
emp.setSex("M");
emp.setAddress("BagBazar");
Employee emp1 = new Employee();
emp1.setName("Samir Mitra");
emp1.setSex("M");
emp1.setAddress("BagBazar");
Employee emp2 = new Employee();
emp2.setName("Swastika Basu");
emp2.setSex("F");
emp2.setAddress("Baranagar");employees.add(emp);
employees.add(emp1);
employees.add(emp2);
return employees;
}}

步骤9:我们需要告诉我们的应用程序扫描所有Spring Bean,并找到JPA存储库和实体文件并将它们注册为Spring Bean,因此我们将使用两个特殊的注释

在Spring启动主类的顶部,@SpringBoot和@EnableJpaRepositories。 请注意,在@EnableJpaRepositories批注中,我提到了从其开始查找存储库和实体的根包。

package com.example.layerdArchitechture;
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.CommandLineRunner;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@SpringBootApplication
@EnableJpaRepositories("com.example.layerdArchitechture")
public class LayerdArchitechtureApplication {public static void main(String[] args) {
SpringApplication.run(LayerdArchitechtureApplication.class, args);
}@Bean
public CommandLineRunner loadData(InitDataLoader loader) {
return args->loader.loadData();
}
}

注意loadData方法,这是Java样式Bean配置,在这里我称为InitLoader的load data方法。 当应用程序启动时,将调用CommandLiner bean并将InitDataLoader作为Spring bean(IOC)注入,因此我可以期望在启动Spring Boot应用程序时将所有数据插入数据库中。

步骤10:启动应用程序,我们可以看到员工已插入数据库中,以验证是否转到以下网址
http:// localhost:8080 / h2-console我们可以看到以下内容

分层架构

结论 :我们已经使用Spring Boot成功插入了数据。 这里要观察的一件事:将数据插入数据库中,我们不必编写一行CRUD代码和JPA模板配置代码。 Spring Boot代表我们同样的身份。 在第二部分中,我将向您展示如何将软管数据公开为JSON格式,以便任何UI框架(Angular5)都将数据作为JSON使用或将这种分层体系结构用作微服务(请稍作更改以使其成为微服务组件),敬请期待。

翻译自: https://www.javacodegeeks.com/2018/10/layered-architecture-running-just-5-minutes-spring-boot-part-1.html

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

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

相关文章

linux设置默认的首页文件,Linux 设置Firefox主页

Linux 设置Firefox主页在Linux系统中&#xff0c;当用户启动Firefox主页时&#xff0c;会自动打开Firefox默认设置的主页。当然&#xff0c;用户也可以通过Firefox的首选项&#xff0c;手动将Firefox主页设置为自己喜欢的或经常访问的网页。在本单元练习中&#xff0c;将Firefo…

向量范数与矩阵范数

一、向量的范数 1.1 定义 1.2 举例 首先定义一个向量为&#xff1a;a[-5&#xff0c;6&#xff0c;8, -10] 1.2.1 向量的1范数 向量的1范数即&#xff1a;向量的各个元素的绝对值之和&#xff0c;上述向量a的1范数结果就是&#xff1a;29&#xff0c;MATLAB代码实现为&…

苹果linux桌面文件夹,Ubuntu 10.04下一键安装Mac OS X主题桌面

不久前的《Ubuntu 10.04下Mac OS X风格桌面美化安装》遭到网友的砖头&#xff0c;认为和Mac OS X风格桌面美化安装根本没有关系。本来是要跟这篇一起发布的&#xff0c;一等就等了这么长&#xff0c;下面我们来看下在Ubuntu 10.04下一键安装Mac OS X主题桌面的工具Epidermis th…

示性函数、共轭函数、对偶范数、共轭

示性函数(Indicator function) 共轭函数 对偶范数 几个常用公式 共轭&#xff08;conjugate&#xff09; 所谓“轭”&#xff0c;指的是古代牛车上放在并行的牛脖颈上的曲木。共轭关系&#xff0c;通俗来说一般用以描述两件事物以一定规律相互配对或孪生&#xff08;一般共轭对…

Redis-实践知识

转自极客时间Redis 亚风 原文视频&#xff1a;https://u.geekbang.org/lesson/535?article681062 Redis最佳实践 普通KEY Redis 的key虽然可以自定义&#xff0c;但是最好遵循下面几个实践的约定&#xff1a; 格式&#xff1a;[业务名称]:[数据名]:[id] 长度不超过44字节 不…

MicroProfile OpenAPI上的Swagger UI

MicroProfile OpenApi为我们提供了一种使用OpenApi 3描述我们JAX-RS API的标准化方法。如果您以前使用过swagger-jaxrs和swagger-annotations &#xff0c;由于OpenApi是基于Swagger构建的&#xff0c;因此您会感到非常熟悉。 2015年11月5日&#xff0c;SmartBear与3Scale&…

linux 跟踪内存,用strace跟踪malloc内存分配

strace介绍strace是一个非常有用的命令&#xff0c;它用于记录和跟踪程序运行期间收到的信号和调用的系统调用。strace的简单使用ubuntu64:~$ strace cat /dev/nullexecve("/bin/cat", ["cat", "/dev/null"], [/* 32 vars */]) 0brk(NULL) 0x1…

归一化、标准化和正则化

归一化 Normalization 归一化一般是将数据映射到指定的范围&#xff0c;用于去除不同维度数据的量纲以及量纲单位。 常见的映射范围有 [0, 1] 和 [-1, 1] &#xff0c;最常见的归一化方法就是 Min-Max 归一化&#xff1a; 举个例子&#xff0c;我们判断一个人的身体状况是否健…

slf4j绑定器_用于ADFLogger的SLF4J绑定–缺少的部分

slf4j绑定器由于最好的原因&#xff0c;在我的日常工作中&#xff0c;我希望为ADF Logger Oracle ADF提供一个SLF4J适配器。 毫不奇怪&#xff0c;slf4j没有用于ADFLogger的适配器&#xff0c;但是由于ADFLogger只是Java Util Logging的轻巧包装&#xff0c;因此花了一个多小时…

核心网

在我们正式讲解之前&#xff0c;我想通过这张网络简图帮助大家认识一下全网的网络架构&#xff0c;通过对全网架构的了解&#xff0c;将方便您对后面每一块网络细节的理解。 这张图分为左右两部分&#xff0c;右边为无线侧网络架构&#xff0c;左边为固定侧网络架构。 无线侧…

JDK 11:轻松取出单文件Java源代码程序

JDK 11 Early Access Builds包含与JEP 330相关的预览功能&#xff08;“启动单个文件源代码程序”&#xff09;。 我之前在“ Shebang即将来到Java&#xff1f; ”和“ 为JDK 11提议的JEP 329和JEP 330 ”&#xff0c;由于JDK 11 Early Access Builds&#xff0c;在这篇文章中…

瑞利、莱斯与Nakagami-m信道衰落模型

一、信道的定义与调制信道的数学模型 1.信道的定义与分类 信道&#xff08;Channel&#xff09;是指以传输媒质为基础的信号通道。根据新到的定义&#xff0c;如果信道仅是指信号的传输媒质&#xff0c;这种信道称为狭义信道&#xff1b;如果这种信道不仅是传输媒质&#xff…

linux用if语句编程序,Shell 脚本基础 - 使用 if 语句进行条件检测

Bourne Shell 的 if 语句和大部分编程语言一样 - 检测条件是否真实&#xff0c;如果条件为真&#xff0c;shell 会执行这个 if 语句指定的代码块&#xff0c;如果条件为假&#xff0c;shell 就会跳过 if 代码块&#xff0c;继续执行之后的代码。if 语句的语法&#xff1a;if[判…

卫星导航定位 -- 坐标系统与时间系统

原文https://blog.csdn.net/f2157120/article/details/81210843 1 协议天球坐标系 以地球质心为坐标原点&#xff0c;以地球自转的轴为z轴 2 协议地球坐标系 3 WGS-84坐标系 4 CGS2000坐标系统 5 直角坐标系与大地坐标系转换 6 大地坐标系转换 7 时间系统 8 GNSS时间系统 …

博弈论学科整体概览

一、博弈论的概念 博弈论又被称为对策论&#xff08;Game Theory&#xff09;既是现代数学的一个新分支&#xff0c;也是运筹学的一个重要学科。博弈论主要研究公式化了的激励结构间的相互作用。是研究具有斗争或竞争性质现象的数学理论和方法。博弈论考虑游戏中的个体的预测行…

linux 进程组id 错乱,【Linux】终端,进程组,作业,会话及作业控制

终端概念在UNIX系统中,用用户通过终端登录系统后得到一一个Shell进程,这个终端成为Shell进程的控制终端 (Controlling Terminal),控制终端是保存在PCB中的信息,而我们知道fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。默认情况 下(没有重定向)…

纳什均衡

纳什均衡&#xff08;或者纳什平衡&#xff09;&#xff0c;Nash equilibrium ,又称为非合作博弈均衡&#xff0c;是博弈论的一个重要策略组合&#xff0c;以约翰纳什命名。 定义 经济学定义 数学定义 纳什均衡的定义&#xff1a;在博弈G﹛S1,…,Sn&#xff1a;u1,…&#x…

奇异值分解(SVD)原理与在降维中的应用

奇异值分解 奇异值分解(Singular Value Decomposition&#xff0c;以下简称SVD)是在机器学习领域广泛应用的算法&#xff0c;它不光可以用于降维算法中的特征分解&#xff0c;还可以用于推荐系统&#xff0c;以及自然语言处理等领域。是很多机器学习算法的基石。本文就对SVD的…

自相关函数与互相关函数

1 概念 1 自相关函数 2 互相关函数 从定义式中可以看到&#xff0c;互相关函数和卷积运算类似&#xff0c;也是两个序列滑动相乘&#xff0c;但是区别在于&#xff1a;互相关的两个序列都不翻转&#xff0c;直接滑动相乘&#xff0c;求和&#xff1b;卷积的其中一个序列需要先…

Linux as4开启telnet,linux as4 虚拟机 上开启 telnet 和ssh 和 ftp 服务

1.telnet服务开启(1)输入[rootrehat ~]# chkconfig krb5-telnet --listkrb5-telnet on这是你的服务存在的状态&#xff0c;如果没有的话&#xff0c;可能是你的telnet名字和我的不一样&#xff0c;也可能是你的那个rpm包没有安装。我第一次的Linux中是没有安装的&#xff0…