Содержимое статьи помогает понять уровни Java Spring Boot Framework.

Вместо того, чтобы идти к большому срыву, я решил устраивать небольшой срыв каждый вторник вечером». – Грэм Парк.

Лучший способ изучить любое программное обеспечение — разделить его на слои, а затем снова объединить эти слои вместе. Давайте поступим так же и здесь.

Прежде чем погрузиться в Java Spring Boot, давайте рассмотрим хорошо известный пример модель OSI в компьютерной сети.Хотя сеть в целом кажется сложной, мы часто делим его на слои, чтобы организовать протоколы. Мы также заявляем, что каждый уровень зависит от услуг, предлагаемых нижестоящим уровнем. В Spring boot применяется тот же принцип.

Слои загрузки Spring:

В основном мы можем разделить Spring boot на 4 слоя,

  1. Слой контроллера

Первая часть системы, которая взаимодействует с запросом клиента, — это контроллеры. Они определяют конечные точки API, можно представить конечные точки как действительные маршруты и метод запроса (GET, POST, PUT). Основная цель контроллера — предлагать услуги клиенту, то есть предоставлять ответ, статус и многое другое. Контроллер использует услуги, предоставляемые сервисным уровнем, для обслуживания клиента.

Пример конечных точек:

/login (POST)
/register (POST)
/products (GET)

2. Сервисный уровень

Слои сервисов предназначены для реализации бизнес-логики. Основная цель сервисного уровня — предлагать услуги на уровне контроллера. На этом уровне выполняются все виды вычислений с данными, поэтому для уровня обслуживания требуются данные. Поэтому они полагаются на услуги, предлагаемые уровнем DAO/Repository.

3. Репозиторий/уровень DAO

DAO означает объект доступа к данным. Основной целью этого уровня является эффективный доступ (запрос) к данным из базы данных и предоставление услуг на уровне обслуживания.

В весенней загрузке существуют интерфейсы, которые предоставляют нам операции CRUD (CREATE, RETRIEVE, UPDATE, DELETE). Таким образом, уровень репозитория может реализовать один из них. Стоит взглянуть на различную функциональность, предоставляемую там репозиториями здесь.

4. Модель:

Модель представляет объекты реального мира. Таким образом, эти объекты называются моделями. JPA (Java Persistence API) предоставляет справку или подробную информацию об ORM (отображение отношений объектов), что означает, что класс Java может быть связан с таблицей базы данных. Существует множество реализаций JPA ORM, одна из них — Hibernate. Поэтому вам потребуется класс Java объектов реального мира, а затем сопоставьте его с отношением (таблицей).

Шаблон для реализации вышеуказанных слоев:

Примечание. Что касается реализации, давайте рассмотрим управление проектами в качестве темы.

Уровень контроллера:

ProjectController.Java

package com.example.Controller;
//import statements goes here
@RestController
public class UserController {
   
    //List all the available projects
    @GetMapping(path = "/projects", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<List<Project>> getProjects() {
     
    // perform validation checks
    // return the services provided by service layer
    }
    //Apply for the project
    @PostMapping(path = "/apply-project", consumes = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<HttpStatus> applyProject(@RequestBody Map<String,String> json) {
    // perform validation checks
    // return the services provided by service layer
    }
    
    //Upload resume
    @PostMapping(path = "/upload-resume/{usn}")
    public ResponseEntity<List<Object>> uploadToDB(@RequestParam("file") MultipartFile[] file,@PathVariable String usn) {
    
    // perform validation checks
    // return the services provided by service layer
    }
    //Download resume
    @GetMapping("/files/download/{fileName:.+}")
    public ResponseEntity downloadFromDB(@PathVariable String fileName) {
    // perform validation checks
    // return the services provided by service layer
    }
}

В приведенном выше примере используются аннотации @. Они используются для информирования Spring о том, является ли он RestController, PostMapping и т. д.

Сервисный уровень:

ProjectService.Java

package com.example.Service;

// import statements

public interface ProjectService {

    ResponseEntity<List<Project>> getProjects();

    HttpStatus applyProject(String USN,int project_id);

    ResponseEntity<List<Object>> uploadProjectDocument(MultipartFile[] files,int project_id);

}

ProjectServiceImpl.Java

package com.example.Service;

//import statements
@Service
public class ProjectServiceImpl implements ProjectService {
//dependency injection of DAO to be gone here (Autowire)
  
    @Override
    public ResponseEntity<List<Project>> getProjects() {
        try {
           //Business logic implementation using DAO services
        } catch (Exception e) {
            return new ResponseEntity<>(null,HttpStatus.INTERNAL_SERVER_ERROR) ;
        }
    }
   
    @Override
    public HttpStatus applyProject(String USN, int project_id) {
   
    //Business logic implementation using DAO services
    }
  
   //helper functions
    public ResponseEntity uploadToLocalFileSystem(MultipartFile file,int project_id) {
     
    }
    @Override
    public ResponseEntity<List<Object>> uploadProjectDocument(MultipartFile[] files,int project_id) {
       //Business logic implementation using DAO services
    }

}

Репозиторий/уровень DAO:

ProjectDAO.java

package com.example.Dao;

//import statements

public interface ProjectDao extends JpaRepository<Project,Integer> {

//You can also include native queries on top of CRUD operations provided by JPA
// Add queries here using @Query annotations and corresponding functions

    @Query(value = "Your SQL query ",nativeQuery = true)
    public List<Project> getProjects();

}

}

Модель:

Проект.java

package com.example.Entity;

//import statements

@Entity
@Table(name = "project")
public class Project {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int project_id;
    @Column(nullable = false, name = "company_name")
    private String company_name;

    @Column(nullable = false, name = "description")
    private String description;

    @Column(nullable = false, name = "requirements")
    private String requirements;

    @Column(nullable = false, name = "manager")
    private String manager;
    @Column(nullable = false, name = "start_date")
    private Date start_date = new Date();

    @Column( name = "end_date")
    private Date end_date = new Date();
    @Column(nullable = false,name = "opening")
    private int opening;
    @Column(name = "resources")
    private String resources;
    public Set<Staff> getStaff_incharge() {
        return staff_incharge;
    }
    public void setStaff_incharge(Set<Staff> staff_incharge) {
        this.staff_incharge = staff_incharge;
    }
    public Set<Student> getApplied_students() {
        return applied_students;
    }
    public Set<Document> getDocuments() {
        return documents;
    }
    public void setDocuments(Set<Document> documents) {
        this.documents = documents;
    }
    @JsonIgnore
    @ManyToMany(mappedBy="funded_projects")
    private Set<Fund> funds;
    public Set<Fund> getFunds() {
        return funds;
    }
    public void setFunds(Set<Fund> funds) {
        this.funds = funds;
    }
    public void setApplied_students(Set<Student> applied_students) {
        this.applied_students = applied_students;
    }
    public Set<Student> getWorking_students() {
        return working_students;
    }
    public void setWorking_students(Set<Student> working_students) {
        this.working_students = working_students;
    }
//constructors
    public Project() {
        super();
    }
    public Project(int project_id, String company_name, String description, String requirements, String manager, Date start_date, Date end_date, int opening, String resources) {
        super();
        this.project_id = project_id;
        this.company_name = company_name;
        this.description = description;
        this.requirements = requirements;
        this.manager = manager;
        this.start_date = start_date;
        this.end_date = end_date;
        this.opening = opening;
        this.resources = resources;
    }
    public int getProject_id() {
        return project_id;
    }
    public void setProject_id(int project_id) {
        this.project_id = project_id;
    }
    public String getCompany_name() {
        return company_name;
    }
    public void setCompany_name(String company_name) {
        this.company_name = company_name;
    }

    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public String getRequirements() {
        return requirements;
    }
    public void setRequirements(String requirements) {
        this.requirements = requirements;
    }
    public String getManager() {
        return manager;
    }
    public void setManager(String manager) {
        this.manager = manager;
    }
    public Date getStart_date() {
        return start_date;
    }
    public void setStart_date(Date start_date) {
        this.start_date = start_date;
    }
    public Date getEnd_date() {
        return end_date;
    }
    public void setEnd_date(Date end_date) {
        this.end_date = end_date;
    }
    public int getOpening() {
        return opening;
    }
    public void setOpening(int opening) {
        this.opening = opening;
    }
    public String getResources() {
        return resources;
    }
    public void setResources(String resources) {
        this.resources = resources;
    }
    @Override
    public String toString() {
        return "Project{" +
                "project_id=" + project_id +
                ", company_name='" + company_name + '\'' +
                ", description='" + description + '\'' +
                ", requirements='" + requirements + '\'' +
                ", manager='" + manager + '\'' +
                ", start_date=" + start_date +
                ", end_date=" + end_date +
                ", opening=" + opening +
                ", resources='" + resources + '\'' +
                '}';
    }
}

Существует широкое использование аннотаций, посмотрите на это здесь. В приведенном выше примере класс представляет таблицу, а его элементы данных представляют атрибуты таблицы. Мы также можем представить отношения между таблицами с помощью аннотаций OnetoOne, ManyToOne, ManyToMany. Узнайте больше об ORM здесь.

Узнайте больше о реализации на https://www.baeldung.com/spring-boot

Вышеупомянутая реализация была неполной, потому что цель статьи — понять рабочий процесс и уровни, которые не имеют ничего общего с реализацией. Spring boot огромен, и я рассмотрел лишь очень маленькую его часть. Мои искренние извинения за любые ошибки в статье, и я надеюсь, что это полезно, спасибо.