Spring Boot是如何工作的?
通过示例,我们基本已经了解如何运行一个简单的Spring Boot应用,那么本文我们将会简单介绍一下Spring Boot内部是如何工作的,如何让我们开发人员从令人头痛的J2EE web应用中解放出来的。如果读者是一个Spring或者J2EE开发者,你可能已经发现在Spring Boot应用中,你不需要使用web.xml文件,不需要使用@Configuration注解去注解配置类,也不需要任何Spring Beans的定义文件。
可能你会认为是Spring Boot生成了代码,有些类自动生成了运行应用所有必须的文件,但是并不是这样,Spring Boot从来不会生成代码也从来不会输出任何源代码。需要记住Spring Boot是一种opinionated技术,意味着它是一种通过付出最小的资源构建强大的应用的一种最佳实践。
我们来看一下运行Spring Boot应用时到底发生了什么?我们知道在Spring应用启动的类中(main方法所在的类)我们使用了一个@SpringBootApplication注解,注解源代码如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@AliasFor(
annotation = EnableAutoConfiguration.class,
attribute = "exclude"
)
Class<?>[] exclude() default {};
@AliasFor(
annotation = EnableAutoConfiguration.class,
attribute = "excludeName"
)
String[] excludeName() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackages"
)
String[] scanBasePackages() default {};
@AliasFor(
annotation = ComponentScan.class,
attribute = "basePackageClasses"
)
Class<?>[] scanBasePackageClasses() default {};
}
在注解源代码中我们可以看到,该注解组合了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan注解,我们再看看@SpringBootConfiguration注解的源代码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
在@SpringBootConfiguration注解的源代码中,我们看到该注解组合中有一个非常重要的@Configuration注解,从这我们就可以知道,@SpringBootApplication注解已经组合了@Configuration,@EnableAutoConfiguration,@ComponentScan注解。Spring Boot早期的版本(如1.0版本),如果要构建一个Spring Boot应用,是需要使用这三个注解的,但是到1.2.0版本之后,创建Spring Boot应用只需要使用@SpringBootApplication注解即可。记住,Spring Boot要做的就是尽量不需要任何配置文件,尽量简化所有操作。
Spring Boot起作用的重要关键点在于@EnableAutoConfiguration注解,因为它包含了自动配置的特性,所有的启动都发生在这里。Spring Boot基于应用的classpath、annotations以及configuration使用自动配置功能添加正确技术和创建合适的应用。也就是说所有的这些注解都在帮助Spring Boot如何更好的配置你的应用。
Spring Boot使用@SpringBootApplication注解和自动配置(基于@EnableAutoConfiguration注解)去确定所有的组件。首先,它会检查classpath,因为依赖了spring-boot-starter-web(假设我们开发的是Web应用),所以它会尝试去配置所开发的应用为一个web应用;其次,它会确定被@Controller所注解的类和包含@RequestMapping注解类为web控制器;最后,因为spring-boot-starter-web有Tomcat服务依赖,所以当运行应用时Spring Boot将会使用Tomcats。
注意:默认情况下,使用Spring Boot创建web应用会嵌入Tomcat服务,但是你可以排除Tomcat并使用其他类似Jetty的服务器。