Spring Boot系列——Spring Boot如何启动

 

Spring Boot启动过程

​上篇《Spring Boot系列——5分钟构建一个应用》介绍了如何快速创建一个Spring Boot项目并运行。虽然步骤少流程简单,为开发者省去了很多重复性的配置工作,但是其底层实现并没有这么简单。

这篇,我们就通过入口类TutorialApplication看看Spring Boot是如何启动的。

注解

写过Spring Boot都知道需要有一个入口类,就是本例子中的TutorialApplication,而这个类上面必不可上的需要有一个@SpringBootApplication注解。

点击进入该注解,我们可以发现其是一个复合注解,包括@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan。

 /**  * Indicates a {@link Configuration configuration} class that declares one or more  * {@link Bean @Bean} methods and also triggers {@link EnableAutoConfiguration  * auto-configuration} and {@link ComponentScan component scanning}. This is a convenience  * annotation that is equivalent to declaring {@code @Configuration},  * {@code @EnableAutoConfiguration} and {@code @ComponentScan}.  *  * @author Phillip Webb  * @author Stephane Nicoll  * @since 1.2.0  */ @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 {     /**     * Exclude specific auto-configuration classes such that they will never be applied.     * @return the classes to exclude     */    @AliasFor(annotation = EnableAutoConfiguration.class)    Class<?>[] exclude() default {};     /**     * Exclude specific auto-configuration class names such that they will never be     * applied.     * @return the class names to exclude     * @since 1.3.0     */    @AliasFor(annotation = EnableAutoConfiguration.class)    String[] excludeName() default {};     /**     * Base packages to scan for annotated components. Use {@link #scanBasePackageClasses}     * for a type-safe alternative to String-based package names.     * @return base packages to scan     * @since 1.3.0     */    @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")    String[] scanBasePackages() default {};     /**     * Type-safe alternative to {@link #scanBasePackages} for specifying the packages to     * scan for annotated components. The package of each class specified will be scanned.     * <p>     * Consider creating a special no-op marker class or interface in each package that     * serves no purpose other than being referenced by this attribute.     * @return base packages to scan     * @since 1.3.0     */    @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")    Class<?>[] scanBasePackageClasses() default {};  }

@SpringBootConfiguration

该注解底层其实就是@Configuration注解。熟悉Spring的发展里程碑就知道这是Java Config的配置形式。

通过该注解修饰,表示该类是一个配置类。

@EnableAutoConfiguration

该注解其实也是一个复合注解。

 /**  * Enable auto-configuration of the Spring Application Context, attempting to guess and  * configure beans that you are likely to need. Auto-configuration classes are usually  * applied based on your classpath and what beans you have defined. For example, if you  * have {@code tomcat-embedded.jar} on your classpath you are likely to want a  * {@link TomcatServletWebServerFactory} (unless you have defined your own  * {@link ServletWebServerFactory} bean).  * <p>  * When using {@link SpringBootApplication}, the auto-configuration of the context is  * automatically enabled and adding this annotation has therefore no additional effect.  * <p>  * Auto-configuration tries to be as intelligent as possible and will back-away as you  * define more of your own configuration. You can always manually {@link #exclude()} any  * configuration that you never want to apply (use {@link #excludeName()} if you don't  * have access to them). You can also exclude them via the  * {@code spring.autoconfigure.exclude} property. Auto-configuration is always applied  * after user-defined beans have been registered.  * <p>  * The package of the class that is annotated with {@code @EnableAutoConfiguration},  * usually via {@code @SpringBootApplication}, has specific significance and is often used  * as a 'default'. For example, it will be used when scanning for {@code @Entity} classes.  * It is generally recommended that you place {@code @EnableAutoConfiguration} (if you're  * not using {@code @SpringBootApplication}) in a root package so that all sub-packages  * and classes can be searched.  * <p>  * Auto-configuration classes are regular Spring {@link Configuration} beans. They are  * located using the {@link SpringFactoriesLoader} mechanism (keyed against this class).  * Generally auto-configuration beans are {@link Conditional @Conditional} beans (most  * often using {@link ConditionalOnClass @ConditionalOnClass} and  * {@link ConditionalOnMissingBean @ConditionalOnMissingBean} annotations).  *  * @author Phillip Webb  * @author Stephane Nicoll  * @see ConditionalOnBean  * @see ConditionalOnMissingBean  * @see ConditionalOnClass  * @see AutoConfigureAfter  * @see SpringBootApplication  */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration {     String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";     /**     * Exclude specific auto-configuration classes such that they will never be applied.     * @return the classes to exclude     */    Class<?>[] exclude() default {};     /**     * Exclude specific auto-configuration class names such that they will never be     * applied.     * @return the class names to exclude     * @since 1.3.0     */    String[] excludeName() default {};  }

其实现也是通过类似@Import的方式注入AutoConfigurationImportSelector类,并借助该类将所有符合条件的Configuration注解修饰的配置类加载到Spring Boot容器中。从classpath中搜索所有的META-INF/spring.factories配置文件,将其中org.springframework

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信