1 Como o SpringBoot é montado automaticamente e como iniciar o Tomcat integrado para execução.
1.1 Anotação e composição do SpringBootApplication
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
O código acima chama o método de execução estática de SpringApplication, executa uma instância SpringApplication com a configuração padrão e retorna um contexto Spring em execução. Dentre eles, a configuração padrão é carregada através da anotação @SpringBootApplication, o que significa que a montagem automática do SpringBoot é realizada através desta anotação.
@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 {
@SpringBootApplication é uma anotação composta, usada para configurar rapidamente a classe de inicialização. Existem 7 anotações nas anotações, das quais as 4 primeiras são metanotações, que são usadas para modificar as anotações atuais e não têm função real. Existem três notas importantes.
-
@ComponentScan: Diga ao Spring para varrer automaticamente as classes que usam @Service, @Component, @Repository e @Controller no pacote e registrá-los como beans.
-
@SpringBootConfiguration: Identificado por @Configuration, declara que a classe atual é uma classe de configuração, que equivale ao arquivo xml de configuração do Spring.
-
@EnableAutoConfiguration: A função é habilitar a montagem automática, para que o Spring Boot defina automaticamente o projeto atual de acordo com as dependências do pacote jar no classpath. Por exemplo, se a dependência Spring-boot-starter-web for adicionada, as dependências Tomcat e SpringMVC serão adicionadas automaticamente e ambas serão configuradas automaticamente na inicialização.
SpringBoot verifica apenas os pacotes e subpacotes de mesmo nível da classe onde a anotação @SpringBootApplication está localizada.
1.2 @EnableAutoConfiguration montagem automática
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration
@EnableAutoConfiguration importará a configuração padrão do seletor AutoConfigurationImportSelector
// AutoConfigurationImportSelector
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
// 核心加载语句
AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
}
AnnotationAttributes attributes = getAttributes(annotationMetadata);
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
....
}
// 返回自动配置的类名
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}
Por meio do rastreamento de código, podemos aprender que a anotação @EnableAutoConfiguration carrega principalmente as classes de configuração automática em ETA-INF / spring.factories. Em spring.factories, podemos encontrar classes relacionadas a Tomcat e SpringMVC.
// 内置servlet/Reactive服务器的相关配置
// 如果使用到Tomcat,则会加载内联Tomcat配置(Jetty/Netty同理)
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration
// 内部会加载Tomcat
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration