Migration von Spring nach Spring Boot

Migration von Spring zu Spring Boot

1. Überblick

In diesem Artikel werden wir uns ansehen, wie wir eine vorhandene Spring Framework-Anwendung auf eineSpring Boot-Anwendung migrieren können.

Spring Boot is not intended to replace Spring, but to make working with it faster and easier. Daher hängen die meisten Änderungen, die für die Migration einer Anwendung erforderlich sind, mit der Konfiguration zusammen. In den meisten Fällen bleiben unsere kundenspezifischen Steuerungen und andere Komponenten unverändert.

Das Entwickeln mitSpring Boot bringt mehrere Vorteile:

  • Einfacheres Abhängigkeitsmanagement

  • Standard-Autokonfiguration

  • eingebetteter Webserver

  • Anwendungsmetriken und Integritätsprüfungen

  • erweiterte externalisierte Konfiguration

2. Spring Boot Starter

Zunächst benötigen wir neue Abhängigkeiten. Spring Boot provides convenient starter dependencies, which are dependency descriptors, die die für bestimmte Funktionen erforderliche Technologie einbringen können.

Diese haben den Vorteil, dass Sie nicht mehr für jede Abhängigkeit eine Version angeben müssen, sondern den Starter Abhängigkeiten für Sie verwalten lassen.

Der schnellste Weg, um loszulegen, ist das Hinzufügen vonspring-boot-starter-parentpom.xml:


    org.springframework.boot
    spring-boot-starter-parent
    1.5.6.RELEASE

Dies übernimmt das Abhängigkeitsmanagement.

In den nächsten Abschnitten werden wir einige weitere Starter durchgehen, je nachdem, welche Funktionen wir migrieren werden. Als Referenz finden Sie die vollständige Liste der Starterhere.

Als allgemeinere Anmerkung möchten wir alle explizit definierten Abhängigkeitsversionen entfernen, die auch vonSpring Boot verwaltet werden. Wenn nicht, können Inkompatibilitäten zwischen unseren definierten und den von Boot verwendeten Versionen auftreten.

3. Einstiegspunkt für Anwendungen

Jede mitSpring Boot erstellte Anwendung muss den Haupteinstiegspunkt definieren. Dies ist normalerweise eine Java-Klasse mit der Methodemain, die mit@SpringBootApplication kommentiert ist:

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

Die Annotation@SpringBootApplication fügt die folgenden Annotationen hinzu:

  • @Configuration - markiert die Klasse als Quelle für Bean-Definitionen

  • @EnableAutoConfiguration - Weist das Framework an, Beans basierend auf den Abhängigkeiten vom Klassenpfad automatisch hinzuzufügen

  • @ComponentScan - sucht nach anderen Konfigurationen und Beans im selben Paket wie die KlasseApplication oder darunter

By default, the @SpringBootApplication annotation scans all classes in the same package or below. Daher könnte eine praktische Paketstruktur folgendermaßen aussehen:

image

Wenn Ihre Anwendung eine Nicht-Webanwendung ist, dieApplicationContext erstellt, kann dieser Code entfernt und durch die oben genannte Klasse@SpringBootApplication ersetzt werden.

Ein Problem, auf das wir stoßen können, hat mehrere Konfigurationsklassen, die in Konflikt stehen. Um dies zu vermeiden, haben wir die Möglichkeit, die durchsuchten Klassen zu filtern:

@SpringBootAppliaction
@ComponentScan(excludeFilters = {
  @ComponentScan.Filter(type = FilterType.REGEX,
  pattern = "com.example.config.*")})
public class Application {
    //...
}

4. Konfiguration und Komponenten importieren

Spring Boot stützt sich bei der Konfiguration stark auf Anmerkungen. Sie können Ihre vorhandene Konfiguration jedoch weiterhin sowohl im Anmerkungs- als auch im XML-Format importieren.

Für die Erfassung Ihrer vorhandenen@Configuration oder Komponentenklassen haben Sie zwei Möglichkeiten:

  • Verschieben Sie die vorhandenen Klassen in ein Paket, das mit dem HauptklassenpaketApplicationidentisch oder darunter liegt

  • Importieren Sie die Klassen explizit

To import the classes explicitly, you can use the @ComponentScan or @Import annotations in der Hauptklasse:

@SpringBootApplication
@ComponentScan(basePackages="com.example.config")
@Import(UserRepository.class)
public class Application {
    //...
}

In der offiziellen Dokumentation wird empfohlen, Anmerkungen über die XML-Konfiguration zu verwenden. Wenn Sie jedoch bereits XML-Dateien haben, die Sie nicht in die Java-Konfiguration konvertieren möchten, können Sie diese dennoch mit@ImportResource importieren:

@SpringBootApplication
@ImportResource("applicationContext.xml")
public class Application {
    //...
}

5. Anwendungsressourcen migrieren

Standardmäßig suchtSpring Boot an einem der folgenden Speicherorte nach Ressourcendateien:

  • /Ressourcen

  • /Öffentlichkeit

  • /statisch

  • /META-INF/resources

Zum Migrieren können wir alle unsere Ressourcendateien an einen dieser Speicherorte verschieben oder die Ressourcenspeicherorte anpassen, indem wir die Eigenschaftspring.resources.static-locationsfestlegen:

spring.resources.static-locations=classpath:/images/,classpath:/jsp/

6. Anwendungseigenschaften migrieren

Das Framework lädt automatisch alle Eigenschaften, die in Dateien definiert sind, die alsapplication.properties oderapplication.yml bezeichnet werden und an einem dieser Speicherorte abgelegt sind:

  • a/config Unterverzeichnis des aktuellen Verzeichnisses

  • das aktuelle Verzeichnis

  • a/config Verzeichnis im Klassenpfad

  • die Klassenpfadwurzel

Um das explizite Laden von Eigenschaften zu vermeiden, können Sie diese in eine Datei mit diesem Namen an einem dieser Speicherorte verschieben. Zum Beispiel in den Ordner/resources, der im Klassenpfad vorhanden sein soll.

Wir können auch automatisch profilspezifische Eigenschaften aus Dateien mit dem Namenapplication-{profile}.properties laden.

Außerdem steht eine große Anzahl vonpredefined property names zum Konfigurieren verschiedener Anwendungsverhalten zur Verfügung.

Jedes Spring Framework-Modul, das Sie in Ihrer Anwendung verwenden, erfordert geringfügige Änderungen, hauptsächlich in Bezug auf die Konfiguration. Werfen wir einen Blick auf einige der am häufigsten verwendeten Funktionen.

7. Migrieren Sie eine Spring-Webanwendung

7.1. Webstarter

Spring Boot bietet einen Starter für Webanwendungen, der alle erforderlichen Abhängigkeiten einbringt. Dies bedeutet, dass wir alle webspezifischen Abhängigkeiten aus dem Spring-Framework entfernen und durchspring-boot-starter-web ersetzen können:


    org.springframework.boot
    spring-boot-starter-web

DaSpring Boot versucht, eine Anwendung basierend auf dem Klassenpfad nach Möglichkeit automatisch zu konfigurieren, führt das Hinzufügen dieser Abhängigkeit dazu, dass die Annotation@EnableWebMvc zur HauptklasseApplication hinzugefügt und eingerichtet wird aDispatcherServlet Bohne.

Wenn Sie eineWebApplicationInitializer-Klasse hatten, dieDispatcherServlet einrichtet, ist dies nicht mehr erforderlich, ebenso wenig wie die Annotation@EnableWebMvc.

Wir können natürlich unsere Beans definieren, wenn wir ein benutzerdefiniertes Verhalten wünschen, und in diesem Fall werden unsere Beans verwendet.

Wenn wir die Annotation@EnableWebMvcexplizit für eine Klasse@Configurationverwenden, wird die automatische MVC-Konfiguration nicht mehr aktiviert.

Das Hinzufügen des Webstarters bestimmt auch die automatische Konfiguration der folgenden Beans:

  • Unterstützung für das Bereitstellen von statischem Inhalt aus einem Verzeichnis mit den Namen/static,/public,/resources oder/META-INF/resources im Klassenpfad

  • HttpMessageConverter Beans für gängige Anwendungsfälle wie JSON und XML

  • a/error Zuordnung, die alle Fehler behandelt

7.2. Technologien anzeigen

In Bezug auf das Erstellen von Webseiten wird in der offiziellen Dokumentation empfohlen, keine JSP-Dateien und stattdessen eine Vorlagen-Engine zu verwenden. Die automatische Konfiguration ist für die folgenden Template-Engines enthalten:Thymeleaf,Groovy,FreeMarker,Mustache. Alles was wir tun müssen, um einen von ihnen zu benutzen, ist den spezifischen Starter hinzuzufügen:


    org.springframework.boot
    spring-boot-starter-thymeleaf

Die Vorlagendateien sollten im Ordner/resources/templatesabgelegt werden.

Wenn Sie weiterhin JSP-Dateien verwenden möchten, müssen Sie die Anwendung so konfigurieren, dass sie JSPs auflösen kann. Wenn sich unsere Dateien beispielsweise in/webapp/WEB-INF/views befinden, müssen Sie die folgenden Eigenschaften festlegen:

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

7.3. Eingebetteter Webserver

Wir können unsere Anwendung auch über einen eingebetteten Tomcat-Server ausführen, der auf Port 8080 automatisch konfiguriert wird, indem die Abhängigkeit vonspring-boot-starter-tomcathinzugefügt wird:


    org.springframework.boot
    spring-boot-starter-tomcat

Andere Webserver, für dieSpring Boot die automatische Konfiguration bereitstellt, sindJetty undUndertow.

8. Migrieren Sie eine Spring Security-Anwendung

Der Starter zum Aktivieren von Spring Security istspring-boot-starter-security:


    org.springframework.boot
    spring-boot-starter-security

Standardmäßig wird ein Benutzer namens "Benutzer" mit einem zufällig generierten Kennwort erstellt, das beim Start protokolliert wird, und alle Endpunkte werden mit der Basisauthentifizierung gesichert. Normalerweise möchten wir jedoch unsere Sicherheitskonfiguration hinzufügen, die sich von der Standardkonfiguration unterscheidet.

Aus diesem Grund behalten wir unsere vorhandene Klasse mit@EnableWebSecurity bei, wodurchWebSecurityConfigurerAdapter erweitert und eine benutzerdefinierte Konfiguration definiert wird:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    // ...
}

9. Migrieren Sie eine Spring Data-Anwendung

Abhängig davon, welcheSpring Data-Implementierung wir verwenden, müssen wir den entsprechenden Starter hinzufügen. Für JPA können wir beispielsweise die Abhängigkeit vonspring-boot-starter-data-jpahinzufügen:


    org.springframework.boot
    spring-boot-starter-data-jpa

Wenn Sie eine In-Memory-Datenbank verwenden möchten, fügen Sie die entsprechende abhängigkeitsaktivierte Autokonfiguration für Datenbanken vom TypH2,Derby undHSQLDB hinzu.

Um beispielsweise mit einer In-Memory-Datenbank vonH2zu arbeiten, benötigen wir lediglich die Abhängigkeit vonh2:


    com.h2database
    h2

Wenn wir mit einem anderen Datenbanktyp und einer anderen Konfiguration arbeiten möchten, z. B. einerMySQL-Datenbank, benötigen wir die Abhängigkeit sowie eine Definition.

Dazu können wir entweder unsereDataSource-Bohnendefinition beibehalten oder vordefinierte Eigenschaften verwenden:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/myDb?createDatabaseIfNotExist=true
spring.datasource.username=user
spring.datasource.password=pass

Spring Boot konfiguriertHibernate automatisch als Standard-JPA-Anbieter sowie alstransactionManager-Bean.

10. Fazit

In diesem Artikel haben wir einige häufige Szenarien gezeigt, die bei der Migration einer vorhandenen Spring-Anwendung auf das neuereSpring Boot-Framework auftreten.

Insgesamt hängt Ihre Erfahrung bei der Migration natürlich stark von der von Ihnen erstellten Anwendung ab.