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

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

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

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

2. 业务层:基于用户命令和从用户(AKA表单)捕获的数据,它需要一个特定领域的决定,比如如何处理数据,查看哪个表,如何操作来自的数据来自数据库,因此可以在 UI 中呈现。

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

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

通过分层架构,我们像所有代码一样创建每一层的逻辑封装,关于 UI 留在 UI 层,所有与业务逻辑有关的代码都留在业务层等。

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

因此,如果您的应用程序具有三层 UI、业务、DAO,UI 与业务通信,业务与 UI 通信,DAO 和 DAO 与业务通信。通过这种方式,我们可以减少耦合,使层可重用并欢迎架构的未来变化。每一层都有自己的模式以适应未来的变化并使层可重用。

我们都知道 Spring 为每一层提供了不同的组件,比如 UI 可以使用 Thymleaf 或 Spring 模板或任何其他 UI 框架,如 JSF,对于业务层,你可以使用 Controller 和服务,也可以注入不同的框架,如 Struts它。对于 Persistence 层,您可以使用 Spring 数据 JPA、Hibernate、JDBC 模板等等。但问题是您需要在 pom.xml 中添加所有插件/罐子。在类路径中找到正确版本的依赖项。如果版本不匹配,它将无法正常工作。此外,您需要在 Spring XML 文件中添加许多 Spring 特定的注释或 XML 条目,以在分层架构中使用这些组件/插件,这是一种繁琐的方法。此外,您需要将它们打包并将它们部署在应用程序服务器中,因此需要大量手动干预。弹簧靴

“ Spring-boot 按约定优于配置” - 这意味着您不必考虑配置条目,只需注意您的业务逻辑,无论您想使用什么组件,如果您的类路径中提到了这些组件 Spring boot 非常聪明,它会理解您想要使用相同并为您配置完整的工作组件。假设您想在项目中使用 JPA。如果您导入 Spring Boot 启动器 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 不同,它将以 JSON 格式显示数据,而不是将响应转发到 View 中。

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

第2步:将该项目作为maven项目导入eclipse。

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

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;"><?xml 版本="1.0" 编码="UTF-8"?></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<modelVersion>4.0.0</modelVersion></font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<groupId>com.example</groupId></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<artifactId>layerdArchitechture</artifactId></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<version>0.0.1-SNAPSHOT</version></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<包装>罐子</包装></font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<name>layerdArchitechture</name></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<description>Spring Boot 的演示项目</description></font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<父></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<groupId>org.springframework.boot</groupId></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<artifactId>spring-boot-starter-parent</artifactId></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<version>2.0.4.RELEASE</version></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<relativePath/> <!-- 从存储库中查找父级 --></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
</父></font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<属性></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<java.version>1.8</java.version></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
</属性></font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<依赖项></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<依赖></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<groupId>org.springframework.boot</groupId></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<artifactId>spring-boot-starter-data-jpa</artifactId></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
</依赖></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<依赖></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<groupId>org.springframework.boot</groupId></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<artifactId>spring-boot-starter-web</artifactId></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
</依赖></font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<依赖></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<groupId>org.springframework.boot</groupId></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<artifactId>spring-boot-devtools</artifactId></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<scope>运行时</scope></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
</依赖></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<依赖></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<groupId>com.h2database</groupId></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<artifactId>h2</artifactId></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<scope>运行时</scope></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
</依赖></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<依赖></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<groupId>org.springframework.boot</groupId></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<artifactId>spring-boot-starter-test</artifactId></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<scope>测试</scope></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
</依赖></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
</依赖></font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<构建></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<插件></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<插件></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<groupId>org.springframework.boot</groupId></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
<artifactId>spring-boot-maven-plugin</artifactId></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
</插件></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
</插件></font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
</build></font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
</项目></font></font>

第四步:进入 src/main/resources 下的 application.properties 文件,将 h2 控制台设为 true,这样我们就可以看到插入到 h2 数据库中的数据了。

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">spring.h2.console.enabled=true</font></font>

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

<font style="vertical-align: inherit;"><font style="vertical-align: inherit;">包 com.example.layerdArchitechture.entity;</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
导入 javax.persistence.Entity;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
导入 javax.persistence.GeneratedValue;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
导入 javax.persistence.Id;</font></font><font></font>
<font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
@实体</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共类员工{</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
@ID</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
    @GeneratedValue</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
私人长ID;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
私有字符串名称;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
私有字符串地址;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
私人字符串性别;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共长 getId() {</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
返回标识;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共无效setId(长ID){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
这个.id = id;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共字符串 getName() {</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
返回名称;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共无效集合名称(字符串名称){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
this.name = 名称;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共字符串 getAddress() {</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
退货地址;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共无效setAddress(字符串地址){</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
this.address = 地址;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
公共字符串 getSex() {</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
返回性别;</font></font><font></font><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">
}</font></font><font></font>
public void setSex(String sex) {<font></font>
this.sex = sex;<font></font>
}<font></font>
@Override<font></font>
public String toString() {<font></font>
return "Employee [id=" + id + ", name=" + name + ", address=" + address + ", sex=" + sex + "]";<font></font>
}<font></font>
<font></font>
}

第 6 步:现在创建一个 EmployeeRepositiry 接口,它将扩展 CrudRepository 接口,Spring-boot 动态创建一个实现并创建所有实用程序(crud)方法,我们无需做任何事情,只需声明接口即可。

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

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

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

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

@SpringBoot 和 @EnableJpaRepositories,位于 Spring Boot 主类之上。请注意,在 @EnableJpaRepositories 注释中,我提到了根包,它从那里开始查找存储库和实体

package com.example.layerdArchitechture;<font></font>
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;<font></font>
@SpringBootApplication<font></font>
@EnableJpaRepositories("com.example.layerdArchitechture")<font></font>
public class LayerdArchitechtureApplication {<font></font>
<font></font>
public static void main(String[] args) {<font></font>
SpringApplication.run(LayerdArchitechtureApplication.class, args);<font></font>
}<font></font>
<font></font>
@Bean<font></font>
public CommandLineRunner loadData(InitDataLoader loader) {<font></font>
return args->loader.loadData();<font></font>
}<font></font>
}

注意 loadData 方法,这是我调用 InitLoader 的加载数据方法的 Java 风格的 bean 配置。应用程序启动时将调用 CommandLiner bean,并将 InitDataLoader 作为 Spring bean(IOC) 注入,因此我可以期望在启动我的 Spring 启动应用程序时,我会将所有数据插入数据库。

Step10 : 启动应用程序,我们可以看到员工被插入到数据库中进行验证,进入以下 url
http://localhost:8080/h2-console我们可以看到以下内容

结论:我们已经使用 Spring boot 成功插入数据。这里要注意的一件事:要将数据插入数据库,我们不必编写一行 CRUD 代码和 JPA 模板配置代码。Spring Boot 代表我们做同样的事情。在第二部分中,我将向您展示如何将软管数据公开为 JSON 格式,以便任何 UI 框架(Angular5)以 JSON 形式使用数据或将这种分层架构用作微服务(只需进行少量更改即可使其成为微服务组件),敬请期待.

学习更多JAVA知识与技巧,关注与私信博主(学习)免费学习领取JAVA 课件,源码,安装包,还有最新大厂面试资料等等等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值