Spring boot,Spring Boot @ SpringBootApplication,SpringApplication類

 2023-11-19 阅读 69 评论 0

摘要:Spring Boot @SpringBootApplication注釋 (Spring Boot @SpringBootApplication Annotation) Spring Boot @SpringBootApplication annotation is used to mark a configuration class that declares one or more @Bean methods and also triggers auto-conf

Spring Boot @SpringBootApplication注釋 (Spring Boot @SpringBootApplication Annotation)

Spring Boot @SpringBootApplication annotation is used to mark a configuration class that declares one or more @Bean methods and also triggers auto-configuration and component scanning. It’s same as declaring a class with @Configuration, @EnableAutoConfiguration and @ComponentScan annotations.

Spring Boot @SpringBootApplication批注用于標記一個配置類,該配置類聲明一個或多個@Bean方法,并觸發auto-configuration和組件掃描。 等同于使用@ Configuration,@ EnableAutoConfiguration和@ComponentScan批注聲明類。

Spring Boot SpringApplication類 (Spring Boot SpringApplication Class)

Spring boot、Spring Boot SpringApplication class is used to bootstrap and launch a Spring application from a Java main method. This class automatically creates the ApplicationContext from the classpath, scan the configuration classes and launch the application. This class is very helpful in launching Spring MVC or Spring REST application using Spring Boot.

Spring Boot SpringApplication類用于從Java main方法引導和啟動Spring應用程序。 此類從類路徑自動創建ApplicationContext ,掃描配置類并啟動應用程序。 此類對于使用Spring Boot啟動Spring MVC或Spring REST應用程序非常有幫助。

SpringBootApplication和SpringApplication示例 (SpringBootApplication and SpringApplication Example)

In the last tutorial on Spring RestController, we created a Spring RESTful web service and deployed it on Tomcat. We had to create web.xml and spring context file. We also had to manually add Spring MVC dependencies and manage their versions.

Spring Framework, 在有關Spring RestController的上一教程中,我們創建了一個Spring RESTful Web服務并將其部署在Tomcat上。 我們必須創建web.xml和spring上下文文件。 我們還必須手動添加Spring MVC依賴關系并管理其版本。

Here we will change the project to run as a Spring Boot Application and get rid of configuration files. This will help in the quick testing of our application logic because we won’t have to manually build and deploy the project to the external Tomcat server.

在這里,我們將更改項目以使其作為Spring Boot Application運行并擺脫配置文件。 這將有助于快速測試應用程序邏輯,因為我們不必手動構建項目并將其部署到外部Tomcat服務器。

GitHub Repository, in following sections we will make necessary changes to the project files.GitHub Repository中檢出現有項目,在以下各節中,我們將對項目文件進行必要的更改。

SpringBoot項目。Below image shows our final project structure.

下圖顯示了我們的最終項目結構。

添加Spring Boot Maven依賴項 (Adding Spring Boot Maven Dependencies)

The first step is to clean up pom.xml file and configure it for Spring Boot. Since it’s a REST web service, we only need spring-boot-starter-web dependency. However, we will have to keep JAXB dependencies because we are running on Java 10 and we want to support XML request and responses too.

第一步是清理pom.xml文件并為Spring Boot配置它。 由于它是REST Web服務,因此我們只需要spring-boot-starter-web依賴項。 但是,由于我們在Java 10上運行,并且我們也要支持XML請求和響應,因此我們必須保留JAXB依賴性。

We will also have to add spring-boot-maven-plugin plugin, this plugin lets us run our simple java application as spring boot application.

我們還必須添加spring-boot-maven-plugin插件,該插件使我們可以將簡單的Java應用程序作為spring boot應用程序運行。

Here is our updated pom.xml file.

這是我們更新的pom.xml文件。

<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 for XML Response needed to explicitly define from Java 9 onwards --><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><!-- added to remove Version from WAR file --><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

We can delete WebContent directory or leave it as is, it won’t be used by our Spring Boot application.

我們可以刪除WebContent目錄或將其保留不變,我們的Spring Boot應用程序將不會使用它。

Spring Boot應用程序類 (Spring Boot Application Class)

Now we have to create a java class with main method, mark it with @SpringBootApplication annotation and invoke SpringApplication.run() method.

現在,我們必須使用main方法創建一個Java類,使用@SpringBootApplication批注對其進行標記,然后調用SpringApplication.run()方法。

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);}
}

Just run the class as Java application and it will produce following output. I have removed some loggers that we don’t care about here. The application will not quit and wait for client requests.

只需將類作為Java應用程序運行,它將產生以下輸出。 我刪除了一些我們不在乎的記錄器。 該應用程序將不會退出并等待客戶端請求。

2018-06-18 14:33:51.276  INFO 3830 --- [           main] c.j.spring.SpringBootRestApplication     : Starting SpringBootRestApplication on pankaj with PID 3830 (/Users/pankaj/Documents/eclipse-jee-workspace/Spring-RestController/target/classes started by pankaj in /Users/pankaj/Documents/eclipse-jee-workspace/Spring-RestController)
2018-06-18 14:33:51.280  INFO 3830 --- [           main] c.j.spring.SpringBootRestApplication     : No active profile set, falling back to default profiles: default
2018-06-18 14:33:51.332  INFO 3830 --- [           main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@38467116: startup date [Mon Jun 18 14:33:51 IST 2018]; root of context hierarchy
2018-06-18 14:33:52.311  INFO 3830 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2018-06-18 14:33:52.344  INFO 3830 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2018-06-18 14:33:52.344  INFO 3830 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.31
2018-06-18 14:33:52.453  INFO 3830 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2018-06-18 14:33:52.453  INFO 3830 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1127 ms
2018-06-18 14:33:52.564  INFO 3830 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Servlet dispatcherServlet mapped to [/]
2018-06-18 14:33:52.927  INFO 3830 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/rest/employee/get/{id}],methods=[GET]}" onto public com.journaldev.spring.model.Employee com.journaldev.spring.controller.EmployeeRestController.getEmployeeByID(int)
2018-06-18 14:33:52.928  INFO 3830 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/rest/employee/getAll],methods=[GET]}" onto public java.util.List<com.journaldev.spring.model.Employee> com.journaldev.spring.controller.EmployeeRestController.getAllEmployees()
2018-06-18 14:33:52.929  INFO 3830 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/rest/employee/create],methods=[POST]}" onto public com.journaldev.spring.model.Employee com.journaldev.spring.controller.EmployeeRestController.createEmployee(com.journaldev.spring.model.Employee)
2018-06-18 14:33:52.929  INFO 3830 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/rest/employee/search/{name}],methods=[GET]}" onto public com.journaldev.spring.model.Employee com.journaldev.spring.controller.EmployeeRestController.getEmployeeByName(java.lang.String)
2018-06-18 14:33:52.929  INFO 3830 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/rest/employee/delete/{id}],methods=[DELETE]}" onto public com.journaldev.spring.model.Employee com.journaldev.spring.controller.EmployeeRestController.deleteEmployeeByID(int)
2018-06-18 14:33:53.079  INFO 3830 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2018-06-18 14:33:53.118  INFO 3830 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2018-06-18 14:33:53.124  INFO 3830 --- [           main] c.j.spring.SpringBootRestApplication     : Started SpringBootRestApplication in 2.204 seconds (JVM running for 2.633)

Some important points we can deduce from logs:

我們可以從日志中得出一些重要的觀點:

  1. Spring Boot Application Process ID is 3830.

    Spring Boot應用程序進程ID是3830。
  2. Spring Boot Application is launching Tomcat on port 8080.

    Spring Boot Application正在端口8080上啟動Tomcat。
  3. Our application context path is “”. It means when invoking our APIs we don’t need to provide servlet context.

    我們的應用程序上下文路徑為“”。 這意味著在調用我們的API時,我們不需要提供servlet上下文。
  4. The logger prints all the APIs that are configured, see messages Mapped "{[/rest/employee/get/{id}],methods=[GET]}" etc.

    記錄器將打印所有已配置的API,請參閱消息Mapped "{[/rest/employee/get/{id}],methods=[GET]}"

Below image shows an example invocation of the APIs exposed by our Spring Boot Application.

下圖顯示了我們的Spring Boot應用程序公開的API的示例調用。

SpringBootApplication scanBasePackages (SpringBootApplication scanBasePackages)

By default SpringApplication scans the configuration class package and all it’s sub-pacakges. So if our SpringBootRestApplication class is in com.journaldev.spring.main package, then it won’t scan com.journaldev.spring.controller package. We can fix this situation using SpringBootApplication scanBasePackages property.

默認情況下,SpringApplication會掃描配置類包及其所有子功能。 因此,如果我們的SpringBootRestApplication類位于com.journaldev.spring.main包中,則它將不會掃描com.journaldev.spring.controller包。 我們可以使用SpringBootApplication scanBasePackages屬性來解決這種情況。

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

Spring Boot自動配置的Bean (Spring Boot Auto-Configured Beans)

Since Spring Boot provides auto-configuration, there are a lot of beans getting configured by it. We can get a list of these beans using below code snippet.

由于Spring Boot提供了自動配置,因此有很多Bean被它配置。 我們可以使用下面的代碼片段獲得這些bean的列表。

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

Below is the list of beans configured by our spring boot application.

以下是我們的Spring Boot應用程序配置的bean列表。

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

That’s a huge list, there are many auto-configured beans that we are not using. We can optimize our spring boot application by disabling these using @SpringBootApplication exclude or excludeName property.

那是一個巨大的清單,有許多我們沒有使用的自動配置的Bean。 我們可以通過使用@SpringBootApplication excludeexcludeName屬性禁用它們來優化我們的Spring Boot應用程序。

Below code snippet will disable JMX and Multipart autoconfiguration.

下面的代碼段將禁用JMX和Multipart自動配置。

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

Note that if we try to exclude any non-auto-configuration classes, we will get an error and our application won’t start.

請注意,如果我們嘗試排除任何非自動配置類,則會出現錯誤,并且應用程序將無法啟動。

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

Above code snippet will throw the following error:

上面的代碼片段將引發以下錯誤:

2018-06-18 15:10:43.602 ERROR 3899 --- [main] o.s.boot.SpringApplication: Application run failedjava.lang.IllegalStateException: The following classes could not be excluded because they are not auto-configuration classes:- com.journaldev.spring.controller.EmployeeRestController

That’s all for SpringBootApplication annotation and SpringApplication example.

這就是SpringBootApplication注釋和SpringApplication示例的全部SpringApplication

GitHub Repository.GitHub Repository下載最終項目。

翻譯自: https://www.journaldev.com/21556/springbootapplication-springapplication

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/183140.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息