Spring Boot SpringBootApplication Annotation

Die Spring Boot SpringBootApplication-Annotation wird verwendet, um eine Konfigurationsklasse zu markieren, die eine oder mehrere @Bean-Methoden deklariert und außerdem die Auto-Konfiguration und das Komponentenscanning auslöst. Es entspricht dem Deklarieren einer Klasse mit den Annotationen @Configuration, @EnableAutoConfiguration und @ComponentScan.

Spring Boot SpringApplication-Klasse

Die Spring Boot SpringApplication-Klasse wird verwendet, um eine Spring-Anwendung von einer Java-Main-Methode aus zu starten und zu booten. Diese Klasse erstellt automatisch den ApplicationContext aus dem Classpath, scannt die Konfigurationsklassen und startet die Anwendung. Diese Klasse ist sehr hilfreich beim Starten einer Spring MVC- oder Spring REST-Anwendung mit Spring Boot.

SpringBootApplication und SpringApplication Beispiel

Im letzten Tutorial über Spring RestController haben wir einen Spring RESTful-Webdienst erstellt und auf Tomcat bereitgestellt. Wir mussten web.xml und die Spring-Kontextdatei erstellen. Außerdem mussten wir Spring MVC-Abhängigkeiten manuell hinzufügen und deren Versionen verwalten. Hier werden wir das Projekt ändern, um es als Spring Boot-Anwendung auszuführen und uns von Konfigurationsdateien zu befreien. Dies wird beim schnellen Testen unserer Anwendungslogik helfen, da wir das Projekt nicht manuell bauen und auf dem externen Tomcat-Server bereitstellen müssen.

Sie sollten das bestehende Projekt aus unserem GitHub-Repository auschecken, in den folgenden Abschnitten werden wir die notwendigen Änderungen an den Projektdateien vornehmen.

Das folgende Bild zeigt unsere endgültige Projektstruktur.

Hinzufügen von Spring Boot Maven-Abhängigkeiten

Der erste Schritt ist, die pom.xml-Datei aufzuräumen und für Spring Boot zu konfigurieren. Da es sich um einen REST-Webdienst handelt, benötigen wir nur die Abhängigkeit spring-boot-starter-web. Allerdings müssen wir die JAXB-Abhängigkeiten beibehalten, da wir auf Java 10 laufen und auch XML-Anfragen und -Antworten unterstützen wollen. Wir müssen auch das spring-boot-maven-plugin-Plugin hinzufügen, dieses Plugin ermöglicht es uns, unsere einfache Java-Anwendung als Spring Boot-Anwendung auszuführen. Hier ist unsere aktualisierte pom.xml-Datei.

<project xmlns="https://maven.apache.org/POM/4.0.0"
    xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>Spring-RestController</groupId>
    <artifactId>Spring-RestController</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.2.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>10</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- JAXB für XML-Antwort muss ab Java 9 explizit definiert werden -->

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.0</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>javax.activation-api</artifactId>
            <version>1.2.0</version>
        </dependency>
    </dependencies>

    <build>
        <!-- hinzugefügt, um die Version aus der WAR-Datei zu entfernen -->
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

Wir können das Verzeichnis WebContent löschen oder so belassen, es wird von unserer Spring Boot-Anwendung nicht verwendet.

Spring Boot Application-Klasse

Jetzt müssen wir eine Java-Klasse mit einer Main-Methode erstellen, sie mit der @SpringBootApplication-Annotation markieren und die SpringApplication.run()-Methode aufrufen.

package com.journaldev.spring;

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

@SpringBootApplication
public class SpringBootRestApplication {

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

Spring Boot Application-Klasse

Nun müssen wir eine Java-Klasse mit einer Main-Methode erstellen, sie mit der @SpringBootApplication-Annotation kennzeichnen und die SpringApplication.run()-Methode aufrufen.

package com.journaldev.spring;

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

@SpringBootApplication
public class SpringBootRestApplication {

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

Führen Sie einfach die Klasse als Java-Anwendung aus und sie wird folgende Ausgabe produzieren. Ich habe einige Logger entfernt, die hier nicht relevant sind. Die Anwendung wird nicht beendet und wartet auf Clientanfragen.

2018-06-18 14:33:51.276  INFO 3830 --- [           main] c.j.spring.SpringBootRestApplication     : SpringBootRestApplication auf pankaj mit PID 3830 gestartet (/Users/pankaj/Documents/eclipse-jee-workspace/Spring-RestController/target/classes von pankaj in /Users/pankaj/Documents/eclipse-jee-workspace/Spring-RestController)
2018-06-18 14:33:51.280  INFO 3830 --- [           main] c.j.spring.SpringBootRestApplication     : Kein aktives Profil gesetzt, Rückfall auf Standardprofile: default
2018-06-18 14:33:51.332  INFO 3830 --- [           main] ConfigServletWebServerApplicationContext : Aktualisierung des org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@38467116: Startdatum [Mon Jun 18 14:33:51 IST 2018]; Wurzel der Kontexthierarchie
2018-06-18 14:33:52.311  INFO 3830 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat mit Port(s): 8080 (http) initialisiert
2018-06-18 14:33:52.344  INFO 3830 --- [           main] o.apache.catalina.core.StandardService   : Service [Tomcat] gestartet
2018-06-18 14:33:52.344  INFO 3830 --- [           main] org.apache.catalina.core.StandardEngine  : Servlet Engine: Apache Tomcat/8.5.31 gestartet
2018-06-18 14:33:52.453  INFO 3830 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initialisierung des Spring eingebetteten WebApplicationContext
2018-06-18 14:33:52.453  INFO 3830 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: Initialisierung in 1127 ms abgeschlossen
2018-06-18 14:33:52.564  INFO 3830 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Servlet dispatcherServlet zu [/] zugeordnet
2018-06-18 14:33:52.927  INFO 3830 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : "{[/rest/employee/get/{id}],methods=[GET]}" auf public com.journaldev.spring.model.Employee com.journaldev.spring.controller.EmployeeRestController.getEmployeeByID(int) zugeordnet
2018-06-18 14:33:52.928  INFO 3830 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : "{[/rest/employee/getAll],methods=[GET]}" auf public java.util.List com.journaldev.spring.controller.EmployeeRestController.getAllEmployees() zugeordnet
2018-06-18 14:33:52.929  INFO 3830 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : "{[/rest/employee/create],methods=[POST]}" auf public com.journaldev.spring.model.Employee com.journaldev.spring.controller.EmployeeRestController.createEmployee(com.journaldev.spring.model.Employee) zugeordnet
2018-06-18 14:33:52.929  INFO 3830 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : "{[/rest/employee/search/{name}],methods=[GET]}" auf public com.journaldev.spring.model.Employee com.journaldev.spring.controller.EmployeeRestController.getEmployeeByName(java.lang.String) zugeordnet
2018-06-18 14:33:52.929  INFO 3830 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : "{[/rest/employee/delete/{id}],methods=[DELETE]}" auf public com.journaldev.spring.model.Employee com.journaldev.spring.controller.EmployeeRestController.deleteEmployeeByID(int) zugeordnet
2018-06-18 14:33:53.079  INFO 3830 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Beans für JMX-Exposition beim Start registriert
2018-06-18 14:33:53.118  INFO 3830 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat auf Port(s): 8080 (http) mit Kontextpfad '' gestartet
2018-06-18 14:33:53.124  INFO 3830 --- [           main] c.j.spring.SpringBootRestApplication     : SpringBootRestApplication in 2.204 Sekunden gestartet (JVM läuft seit 2.633)

Einige wichtige Punkte, die wir aus den Logs ableiten können:

  • Die Prozess-ID der Spring Boot-Anwendung ist 3830.
  • Die Spring Boot-Anwendung startet Tomcat auf Port 8080.
  • Unser Anwendungskontextpfad ist „“. Das bedeutet, dass wir bei der Aufrufung unserer APIs keinen Servlet-Kontext angeben müssen.
  • Der Logger druckt alle konfigurierten APIs aus, siehe Meldungen Mapped „{[/rest/employee/get/{id}],methods=[GET]}“ usw.

Das folgende Bild zeigt ein Beispiel für den Aufruf der APIs, die von unserer Spring Boot-Anwendung bereitgestellt werden.

SpringBootApplication scanBasePackages

Standardmäßig scannt SpringApplication das Paket der Konfigurationsklasse und alle ihre Unterpakete. Wenn also unsere SpringBootRestApplication-Klasse im Paket com.journaldev.spring.main liegt, wird sie das Paket com.journaldev.spring.controller nicht scannen. Wir können diese Situation mit der Eigenschaft scanBasePackages der SpringBootApplication beheben.

@SpringBootApplication(scanBasePackages="com.journaldev.spring")
public class SpringBootRestApplication {
}

Spring Boot Auto-Konfigurierte Beans

Da Spring Boot Auto-Konfiguration bietet, gibt es viele Beans, die dadurch konfiguriert werden. Wir können eine Liste dieser Beans mit dem folgenden Code-Snippet erhalten.

ApplicationContext ctx = SpringApplication.run(SpringBootRestApplication.class, args);
String[] beans = ctx.getBeanDefinitionNames();
for(String s : beans) System.out.println(s);

Unten ist die Liste der Beans, die von unserer Spring Boot-Anwendung konfiguriert wurden.

org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
springBootRestApplication
org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory
employeeRestController
employeeRepository
org.springframework.boot.autoconfigure.AutoConfigurationPackages
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration
org.springframework.boot.autoconfigure.condition.BeanTypeRegistry
propertySourcesPlaceholderConfigurer
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration$TomcatWebSocketConfiguration
websocketContainerCustomizer
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration$EmbeddedTomcat
tomcatServletWebServerFactory
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
servletWebServerFactoryCustomizer
tomcatServletWebServerFactoryCustomizer
server-org.springframework.boot.autoconfigure.web.ServerProperties
org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor
org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata
webServerFactoryCustomizerBeanPostProcessor
errorPageRegistrarBeanPostProcessor
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration$DispatcherServletConfiguration
dispatcherServlet
mainDispatcherServletPathProvider
spring.mvc-org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration$DispatcherServletRegistrationConfiguration
dispatcherServletRegistration
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration
defaultValidator
methodValidationPostProcessor
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration
error
beanNameViewResolver
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration$DefaultErrorViewResolverConfiguration
conventionErrorViewResolver
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
errorAttributes
basicErrorController
errorPageCustomizer
preserveErrorControllerTargetClassPostProcessor
spring.resources-org.springframework.boot.autoconfigure.web.ResourceProperties
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter$FaviconConfiguration
faviconHandlerMapping
faviconRequestHandler
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration
requestMappingHandlerAdapter
requestMappingHandlerMapping
mvcConversionService
mvcValidator
mvcContentNegotiationManager
mvcPathMatcher
mvcUrlPathHelper
viewControllerHandlerMapping
beanNameHandlerMapping
resourceHandlerMapping
mvcResourceUrlProvider
defaultServletHandlerMapping
mvcUriComponentsContributor
httpRequestHandlerAdapter
simpleControllerHandlerAdapter
handlerExceptionResolver
mvcViewResolver
mvcHandlerMappingIntrospector
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter
defaultViewResolver
viewResolver
welcomePageHandlerMapping
requestContextFilter
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
hiddenHttpMethodFilter
httpPutFormContentFilter
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration
mbeanExporter
objectNamingStrategy
mbeanServer
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$Jackson2ObjectMapperBuilderCustomizerConfiguration
standardJacksonObjectMapperBuilderCustomizer
spring.jackson-org.springframework.boot.autoconfigure.jackson.JacksonProperties
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration
jacksonObjectMapperBuilder
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$ParameterNamesModuleConfiguration
parameterNamesModule
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperConfiguration
jacksonObjectMapper
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration
jsonComponentModule
org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration$StringHttpMessageConverterConfiguration
stringHttpMessageConverter
spring.http.encoding-org.springframework.boot.autoconfigure.http.HttpEncodingProperties
org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration
mappingJackson2HttpMessageConverter
org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration
org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration
messageConverters
org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration$JacksonCodecConfiguration
jacksonCodecCustomizer
org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration
org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration
spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties
org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration
spring.security-org.springframework.boot.autoconfigure.security.SecurityProperties
org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration
restTemplateBuilder
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration$TomcatWebServerFactoryCustomizerConfiguration
tomcatWebServerFactoryCustomizer
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration
characterEncodingFilter
localeCharsetMappingsCustomizer
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
multipartConfigElement
multipartResolver
spring.servlet.multipart-org.springframework.boot.autoconfigure.web.servlet.MultipartProperties


Das ist eine riesige Liste, es gibt viele automatisch konfigurierte Beans, die wir nicht verwenden. Wir können unsere Spring Boot-Anwendung optimieren, indem wir diese mit den Eigenschaften exclude oder excludeName der @SpringBootApplication-Annotation deaktivieren. Der folgende Code-Snippet wird die JMX- und Multipart-Auto-Konfiguration deaktivieren.

@SpringBootApplication(scanBasePackages = "com.journaldev.spring", exclude = {
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration.class, org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration.class })
public class SpringBootRestApplication {
}

Beachten Sie, dass wenn wir versuchen, irgendwelche nicht-Auto-Konfigurationsklassen auszuschließen, wir einen Fehler erhalten und unsere Anwendung nicht starten wird.

@SpringBootApplication(scanBasePackages = "com.journaldev.spring", exclude = {com.journaldev.spring.controller.EmployeeRestController.class })
public class SpringBootRestApplication {
}

Der obige Code-Snippet wird den folgenden Fehler auswerfen:

2018-06-18 15:10:43.602 ERROR 3899 --- [main] o.s.boot.SpringApplication: Anwendungsstart fehlgeschlagen

java.lang.IllegalStateException: Die folgenden Klassen konnten nicht ausgeschlossen werden, da sie keine Auto-Konfigurationsklassen sind:
    - com.journaldev.spring.controller.EmployeeRestController

Das ist alles zur SpringBootApplication-Annotation und zum SpringApplication-Beispiel – eine Anleitung.

Kostenlosen Account erstellen

Registrieren Sie sich jetzt und erhalten Sie Zugang zu unseren Cloud Produkten.

Das könnte Sie auch interessieren: