spring boot分层
这是一个分为两部分的系列,其中我将展示如何使用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按照约定优于配置进行工作 ”-这意味着您不必考虑配置条目,只需要注意业务逻辑,就可以在类路径中提到要使用的组件而无需考虑使用任何组件。聪明,它会理解您想要使用它并为您配置一个完全正常工作的组件。 假设您要在项目中使用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的正确版本,因此不会出现版本不匹配的问题。
4.0.0
com.example
layerdArchitechture
0.0.1-SNAPSHOT
jar
layerdArchitechture
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
2.0.4.RELEASE
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter-data-jpa
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
runtime
com.h2database
h2
runtime
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
步骤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;
@Repository
public interface EmployeeRepositiry extends CrudRepository {
}
步骤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 createData() {
List employees = new ArrayList();
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
spring boot分层