Spring Boot @ SpringBootApplication,SpringApplication类
Spring Boot @SpringBootApplication注释
Spring Boot的@SpringBootApplication注释用于标记一个配置类,该配置类声明一个或者多个@Bean方法,并触发"自动配置"和组件扫描。
与使用@ Configuration,@ EnableAutoConfiguration和@ComponentScan批注声明一个类相同。
Spring Boot SpringApplication类
Spring Boot的SpringApplication类用于从Java main方法引导和启动Spring应用程序。
此类从类路径自动创建ApplicationContext
,扫描配置类并启动应用程序。
此类对于使用Spring Boot启动Spring MVC或者Spring REST应用程序非常有帮助。
SpringBootApplication和SpringApplication示例
在有关Spring RestController的上一教程中,我们创建了一个Spring RESTful Web服务并将其部署在Tomcat上。
我们必须创建web.xml
和spring上下文文件。
我们还必须手动添加Spring MVC依赖关系并管理其版本。
其中我们将更改项目以使其作为Spring Boot Application运行并摆脱配置文件。
这将有助于快速测试应用程序逻辑,因为我们无需手动构建项目并将其部署到外部Tomcat服务器。
您应该从GitHub存储库中检出现有项目,在以下各节中,我们将对项目文件进行必要的更改。
下图显示了我们的最终项目结构。
添加Spring Boot Maven依赖项
第一步是清理pom.xml
文件并为Spring Boot配置它。
由于它是REST网络服务,因此我们只需要spring-boot-starter-web
依赖项。
但是,我们必须保留JAXB依赖关系,因为我们在Java 10上运行,并且我们也希望支持XML请求和响应。
我们还必须添加spring-boot-maven-plugin
插件,该插件使我们可以将简单的Java应用程序作为spring boot应用程序运行。
这是我们更新的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>
我们可以删除WebContent目录或者将其保留不变,我们的Spring Boot应用程序将不会使用它。
Spring Boot应用程序类
现在,我们必须使用main方法创建一个Java类,并使用@SpringBootApplication注解对其进行标记,并调用SpringApplication.run()方法。
package com.theitroad.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); } }
只需将类作为Java应用程序运行,它将产生以下输出。
我删除了一些我们不在乎的记录器。
该应用程序将不会退出并等待客户端请求。
2016-06-18 14:33:51.276 INFO 3830 --- [ main] c.j.spring.SpringBootRestApplication : Starting SpringBootRestApplication on hyman with PID 3830 (/Users/hyman/Documents/eclipse-jee-workspace/Spring-RestController/target/classes started by hyman in /Users/hyman/Documents/eclipse-jee-workspace/Spring-RestController) 2016-06-18 14:33:51.280 INFO 3830 --- [ main] c.j.spring.SpringBootRestApplication : No active profile set, falling back to default profiles: default 2016-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 2016]; root of context hierarchy 2016-06-18 14:33:52.311 INFO 3830 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2016-06-18 14:33:52.344 INFO 3830 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2016-06-18 14:33:52.344 INFO 3830 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.31 2016-06-18 14:33:52.453 INFO 3830 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2016-06-18 14:33:52.453 INFO 3830 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1127 ms 2016-06-18 14:33:52.564 INFO 3830 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Servlet dispatcherServlet mapped to [/] 2016-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.theitroad.spring.model.Employee com.theitroad.spring.controller.EmployeeRestController.getEmployeeByID(int) 2016-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.theitroad.spring.model.Employee> com.theitroad.spring.controller.EmployeeRestController.getAllEmployees() 2016-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.theitroad.spring.model.Employee com.theitroad.spring.controller.EmployeeRestController.createEmployee(com.theitroad.spring.model.Employee) 2016-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.theitroad.spring.model.Employee com.theitroad.spring.controller.EmployeeRestController.getEmployeeByName(java.lang.String) 2016-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.theitroad.spring.model.Employee com.theitroad.spring.controller.EmployeeRestController.deleteEmployeeByID(int) 2016-06-18 14:33:53.079 INFO 3830 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup 2016-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 '' 2016-06-18 14:33:53.124 INFO 3830 --- [ main] c.j.spring.SpringBootRestApplication : Started SpringBootRestApplication in 2.204 seconds (JVM running for 2.633)
我们可以从日志中得出一些重要的观点:
Spring Boot应用程序进程ID是3830。
Spring Boot Application正在端口8080上启动Tomcat。
我们的应用程序上下文路径为""。
这意味着在调用我们的API时,我们不需要提供servlet上下文。记录器将打印所有已配置的API,请参见消息"映射的{{/rest/employee/get/{id}],methods = [GET]}"等。
下图显示了我们的Spring Boot应用程序公开的API的示例调用。
SpringBootApplication scanBasePackages
默认情况下,SpringApplication会扫描配置类包及其所有子功能。
因此,如果我们的SpringBootRestApplication类位于com.theitroad.spring.main包中,则不会扫描com.theitroad.spring.controller包。
我们可以使用SpringBootApplication scanBasePackages属性来解决这种情况。
@SpringBootApplication(scanBasePackages="com.theitroad.spring") public class SpringBootRestApplication { }
Spring Boot自动配置的Bean
由于Spring Boot提供了自动配置,因此有很多Bean被它配置。
我们可以使用下面的代码片段获取这些bean的列表。
ApplicationContext ctx = SpringApplication.run(SpringBootRestApplication.class, args); String[] beans = ctx.getBeanDefinitionNames(); for(String s : beans) System.out.println(s);
以下是我们的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.Hymanson.HymansonAutoConfiguration$Hymanson2ObjectMapperBuilderCustomizerConfiguration standardHymansonObjectMapperBuilderCustomizer spring.Hymanson-org.springframework.boot.autoconfigure.Hymanson.HymansonProperties org.springframework.boot.autoconfigure.Hymanson.HymansonAutoConfiguration$HymansonObjectMapperBuilderConfiguration HymansonObjectMapperBuilder org.springframework.boot.autoconfigure.Hymanson.HymansonAutoConfiguration$ParameterNamesModuleConfiguration parameterNamesModule org.springframework.boot.autoconfigure.Hymanson.HymansonAutoConfiguration$HymansonObjectMapperConfiguration HymansonObjectMapper org.springframework.boot.autoconfigure.Hymanson.HymansonAutoConfiguration jsonComponentModule org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration$StringHttpMessageConverterConfiguration stringHttpMessageConverter spring.http.encoding-org.springframework.boot.autoconfigure.http.HttpEncodingProperties org.springframework.boot.autoconfigure.http.HymansonHttpMessageConvertersConfiguration$MappingHymanson2HttpMessageConverterConfiguration mappingHymanson2HttpMessageConverter org.springframework.boot.autoconfigure.http.HymansonHttpMessageConvertersConfiguration org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration messageConverters org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration$HymansonCodecConfiguration HymansonCodecCustomizer 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
那是一个巨大的列表,有许多我们没有使用的自动配置的Bean。
我们可以通过使用@ SpringBootApplicationexclude
或者excludeName
属性禁用它们来优化我们的Spring Boot应用程序。
下面的代码段将禁用JMX和Multipart自动配置。
@SpringBootApplication(scanBasePackages = "com.theitroad.spring", exclude = { org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration.class, org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration.class }) public class SpringBootRestApplication { }
请注意,如果我们尝试排除任何非自动配置类,则会收到错误消息,并且我们的应用程序将无法启动。
@SpringBootApplication(scanBasePackages = "com.theitroad.spring", exclude = {com.theitroad.spring.controller.EmployeeRestController.class }) public class SpringBootRestApplication { }
上面的代码片段将引发以下错误:
2016-06-18 15:10:43.602 ERROR 3899 --- [main] o.s.boot.SpringApplication: Application run failed java.lang.IllegalStateException: The following classes could not be excluded because they are not auto-configuration classes: - com.theitroad.spring.controller.EmployeeRestController