Suche…


Einführung

Spring Boot erleichtert die Erstellung von Spring-betriebenen Anwendungen und Services in Produktionsqualität mit minimalem Aufwand. Es bevorzugt Konvention gegenüber Konfiguration.

Spring Data JPA , Teil der größeren Spring Data- Familie, vereinfacht die Implementierung von JPA-basierten Repositories. Es erleichtert das Erstellen von Apps, die Datenzugriffstechnologien verwenden.

Bemerkungen

Anmerkungen

@Repository : Gibt an, dass eine kommentierte Klasse ein "Repository" ist, ein Mechanismus zum Einkapseln von Speicher-, Abruf- und Suchverhalten, mit dem eine Sammlung von Objekten emuliert wird. Teams, die traditionelle J2EE-Muster wie "Data Access Object" implementieren, können diesen Stereotyp auch auf DAO-Klassen anwenden. Bevor Sie dies tun, sollten Sie jedoch den Unterschied zwischen Data Access Object- und DDD-Repositorys verstehen. Diese Anmerkung ist ein allgemeines Stereotyp, und einzelne Teams können ihre Semantik einschränken und entsprechend verwenden.

@RestController : Eine bequeme Anmerkung , die sich mit Anmerkungen versehen ist @Controller und @ResponseBody.Types , die diese Anmerkung tragen , werden als Controller behandelt , wo @RequestMapping Methoden übernehmen @ResponseBody Semantik standardmäßig.

@Service : Gibt an, dass eine kommentierte Klasse ein "Service" ist (z. B. eine Business-Service-Fassade). Diese Annotation dient als Spezialisierung von @Component , sodass Implementierungsklassen durch Klassenpfad-Scanning automatisch erkannt werden können.

@SpringBootApplication : Viele Spring Boot-Entwickler haben ihre Hauptklasse immer mit @Configuration , @EnableAutoConfiguration und @ComponentScan . Da diese Anmerkungen so häufig verwendet werden (insbesondere wenn Sie die oben genannten bewährten Methoden befolgen), bietet Spring Boot eine praktische @SpringBootApplication Alternative.

@Entity : Gibt an, dass die Klasse eine Entität ist. Diese Anmerkung wird auf die Entitätsklasse angewendet.

Offizielle Dokumentation

Pivotal Software hat eine ziemlich ausführliche Dokumentation zu Spring Framework zur Verfügung gestellt

Beispiel für die Integration von Spring Boot und Spring Data JPA

Wir werden eine Anwendung erstellen, die POJOs in einer Datenbank speichert. Die Anwendung verwendet Spring Data JPA zum Speichern und Abrufen von Daten in einer relationalen Datenbank. Die überzeugendste Funktion ist die Möglichkeit, Repository-Implementierungen automatisch zur Laufzeit über eine Repository-Schnittstelle zu erstellen.

Hauptklasse

package org.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

Die main() -Methode verwendet die SpringApplication.run() -Methode von Spring Boot, um eine Anwendung zu starten. Bitte beachten Sie, dass es keine einzige XML-Zeile gibt. Auch keine web.xml-Datei. Diese Webanwendung besteht zu 100% aus reinem Java und Sie müssen sich nicht mit der Konfiguration von Rohrleitungen oder Infrastrukturen beschäftigen.

Entity-Klasse

package org.springboot.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Greeting {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String text;

    public Greeting() {
        super();
    }

    public Greeting(String text) {
        super();
        this.text = text;
    }

    /* In this example, the typical getters and setters have been left out for brevity. */
}

Hier haben Sie eine Greeting mit zwei Attributen, der id und dem text . Sie haben auch zwei Konstruktoren. Der Standardkonstruktor existiert nur aus Gründen der JPA. Sie werden es nicht direkt verwenden, daher kann es als protected . Der andere Konstruktor ist derjenige, mit dem Sie Greeting erstellen, die in der Datenbank gespeichert werden.

Die Greeting Klasse wird mit @Entity annotiert, um @Entity , dass es sich um eine JPA-Entität handelt. @Table keine @Table Annotation vorhanden ist, wird davon ausgegangen, dass diese Entität einer Tabelle mit dem Namen 'Greeting' zugeordnet wird.

Die id @Id Begrüßung wird mit @Id kommentiert, sodass JPA sie als ID des Objekts erkennt. Die id @GeneratedValue wird auch mit @GeneratedValue kommentiert, um @GeneratedValue , dass die ID automatisch generiert werden soll.

Die andere Eigenschaft, text wird nicht kommentiert. Es wird davon ausgegangen, dass es einer Spalte zugeordnet wird, die denselben Namen wie die Eigenschaft selbst hat.

Transiente Eigenschaften

In einer Entitätsklasse, die der obigen ähnelt, können wir Eigenschaften haben, die wir nicht in der Datenbank persistieren oder als Spalten in unserer Datenbank erstellen möchten, vielleicht weil wir sie nur zur Laufzeit setzen und in unserer Anwendung verwenden möchten. Daher können wir diese Eigenschaft mit der Annotation @Transient versehen.

package org.springboot.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Transient;

@Entity
public class Greeting {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String text;
    @Transient
    private String textInSomeLanguage;
    
    public Greeting() {
        super();
    }
 
    public Greeting(String text) {
        super();
        this.text = text;
        this.textInSomeLanguage = getTextTranslationInSpecifiedLanguage(text);
    }

    /* In this example, the typical getters and setters have been left out for brevity. */
}

Hier haben Sie die gleiche Greeting-Klasse, die jetzt eine vorübergehende Eigenschaft textInSomeLanguage , die zur Laufzeit initialisiert und verwendet werden kann und nicht in der Datenbank gespeichert bleibt.

DAO-Klasse

package org.springboot.repository;

import org.springboot.model.Greeting;
import org.springframework.data.repository.CrudRepository;

public interface GreetingRepository extends CrudRepository<Greeting, Long> {

    List<Greeting> findByText(String text);
}

GreetingRepository erweitert die CrudRepository Schnittstelle. Die Art der Entität und die ID, mit der sie arbeitet, Greeting und Long , werden in den allgemeinen Parametern in CrudRepository . Durch die Erweiterung von CrudRepository erbt GreetingRepository verschiedene Methoden für die Arbeit mit der Beständigkeit der Greeting , einschließlich Methoden zum Speichern, Löschen und Suchen von Greeting .
Sehen Sie sich diese Diskussion zum Vergleich von CrudRepository , PagingAndSortingRepository und JpaRepository .

Mit Spring Data JPA können Sie auch andere Abfragemethoden definieren, indem Sie deren Methodensignatur einfach deklarieren. Im Fall von GreetingRepository wird dies mit einer findByText() -Methode findByText() .

In einer typischen Java-Anwendung würden Sie erwarten, eine Klasse zu schreiben, die GreetingRepository implementiert. Aber genau das macht Spring Data JPA so leistungsfähig: Sie müssen keine Implementierung der Repository-Schnittstelle schreiben. Spring Data JPA erstellt eine Implementierung, wenn Sie die Anwendung ausführen.

Serviceklasse

package org.springboot.service;

import java.util.Collection
import org.springboot.model.Greeting;

public interface GreetingService {

    Collection<Greeting> findAll();
    Greeting findOne(Long id);
    Greeting create(Greeting greeting);
    Greeting update(Greeting greeting);
    void delete(Long id);

}

Service Bean

package org.springboot.service;

import java.util.Collection;
import org.springboot.model.Greeting;
import org.springboot.repository.GreetingRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class GreetingServiceBean implements GreetingService {

    @Autowired
    private GreetingRepository greetingRepository;

    @Override
    public Collection<Greeting> findAll() {
        Collection<Greeting> greetings = greetingRepository.findAll();
        return greetings;
    }

    @Override
    public Greeting findOne(Long id) {
        Greeting greeting = greetingRepository.findOne(id);
        return greeting;
    }

    @Override
    public Greeting create(Greeting greeting) {
        if (greeting.getId() != null) {
            //cannot create Greeting with specified Id value
            return null;
        }
        Greeting savedGreeting = greetingRepository.save(greeting);
        return savedGreeting;
    }

    @Override
    public Greeting update(Greeting greeting) {
        Greeting greetingPersisted = findOne(greeting.getId());
        if (greetingPersisted == null) {
            //cannot find Greeting with specified Id value
            return null;
        }
        Greeting updatedGreeting = greetingRepository.save(greeting);
        return updatedGreeting;
    }

    @Override
    public void delete(Long id) {
         greetingRepository.delete(id);
    }

}

Controller-Klasse

package org.springboot.web.api;

import java.util.Collection;
import org.springboot.model.Greeting;
import org.springboot.service.GreetingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/api")
public class GreetingController {

    @Autowired
    private GreetingService greetingService;

    // GET [method = RequestMethod.GET] is a default method for any request. 
    // So we do not need to mention explicitly

    @RequestMapping(value = "/greetings", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Collection<Greeting>> getGreetings() {
        Collection<Greeting> greetings = greetingService.findAll();        
        return new ResponseEntity<Collection<Greeting>>(greetings, HttpStatus.OK);
    }

    @RequestMapping(value = "/greetings/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Greeting> getGreeting(@PathVariable("id") Long id) {
        Greeting greeting = greetingService.findOne(id);
        if(greeting == null) {
            return new ResponseEntity<Greeting>(HttpStatus.NOT_FOUND);
        }
        return new ResponseEntity<Greeting>(greeting, HttpStatus.OK);
    }
    
    @RequestMapping(value = "/greetings", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Greeting> createGreeting(@RequestBody Greeting greeting) {
        Greeting savedGreeting = greetingService.create(greeting);
        return new ResponseEntity<Greeting>(savedGreeting, HttpStatus.CREATED);
    }

    @RequestMapping(value = "/greetings/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Greeting> updateGreeting(@PathVariable("id") Long id, @RequestBody Greeting greeting) {
        Greeting updatedGreeting = null;
        if (greeting != null && id == greeting.getId()) {
            updatedGreeting = greetingService.update(greeting); 
        }
        if(updatedGreeting == null) {
            return new ResponseEntity<Greeting>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
        return new ResponseEntity<Greeting>(updatedGreeting, HttpStatus.OK);
    }

    @RequestMapping(value = "/greetings/{id}", method = RequestMethod.DELETE)
    public ResponseEntity<Greeting> deleteGreeting(@PathVariable("id") Long id) {
        greetingService.delete(id);
        return new ResponseEntity<Greeting>(HttpStatus.NO_CONTENT);
    }

}

Anwendungseigenschaftendatei für MySQL-Datenbank

#mysql config
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=root
spring.datasource.password=Welcome@123
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
spring.jpa.hibernate.ddl-auto = update

spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.DefaultNamingStrategy

#initialization
spring.datasource.schema=classpath:/data/schema.sql

SQL-Datei

drop table if exists greeting;
create table greeting (
    id bigint not null auto_increment, 
    text varchar(100) not null, 
    primary key(id)
);

pom.xml-Datei

<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>org</groupId>
<artifactId>springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.2.1.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Erstellen eines ausführbaren JAR

Sie können die Anwendung über die Befehlszeile mit Maven ausführen. Sie können auch eine einzelne ausführbare JAR-Datei erstellen, die alle erforderlichen Abhängigkeiten, Klassen und Ressourcen enthält, und diese ausführen. Dies macht es einfach, den Service als Anwendung während des gesamten Entwicklungszyklus, in verschiedenen Umgebungen usw. zu liefern, zu implementieren und bereitzustellen.

Führen Sie die Anwendung mit ./mvnw spring-boot:run . Oder Sie können die JAR-Datei mit ./mvnw clean package . Dann können Sie die JAR-Datei ausführen:

java -jar target/springboot-0.0.1-SNAPSHOT.jar


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow