SpringBoot中 @SpringBootApplication注解详解
@SpringBootApplication是SpringBoot框架中的一个重要注解,它简化了Spring应用的配置过程。它是几个注解的组合,旨在减少开发者需要编写的配置量,使得创建独立的、生产级别的基于Spring的应用变得非常简单。
源码:
@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
注解的底层原理:
-
Spring Boot 应用启动:应用程序启动时,Spring Boot 会加载带有
@SpringBootApplication
注解的主配置类。 -
解析
@SpringBootApplication
注解:解析该注解,启用@Configuration
、@EnableAutoConfiguration
和@ComponentScan
。 -
解析
@Configuration
注解:创建并注册配置类实例到容器。 -
解析
@EnableAutoConfiguration
注解:加载自动配置类,创建并注册自动配置 Bean 到容器。 -
解析
@ComponentScan
注解:扫描指定包下的组件(如@Component
,@Service
,@Repository
,@Controller
等),创建并注册这些组件到容器。 -
初始化 Spring 容器:初始化容器中的所有 Bean。
-
启动嵌入式服务器:启动嵌入式服务器(如 Tomcat)。
-
应用启动完成:应用程序启动完成。
组合注解
-
@SpringBootConfiguration
@SpringBootConfiguration是一个自定义注解,他实际上就是@Configuration的别名
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {}
-
作用:标记该类为一个配置类,Spring容器会扫描并处理其中的Bean定义。
-
@EnableAutoConfiguration
@EnableAutoConfiguration注解用于启用SpringBoot的自动配置机制。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
-
作用:SpringBoot会根据项目中包含的jar包依赖来自动配置应用程序。例如,如果项目中包含了Spring Data JPA的依赖,SpringBoot将自动配置数据源和JPA实体管理器。
实现:
-
@AutoConfigurationPackage:将当前配置类所在的包及其子包中的所有@Configuration类自动注册为Bean
-
@Import(AutoConfigurationImportSelector.class):导入AutoConfigurationImportSelector类,该类负责选择和加载所有符合条件的自动配置类。
-
-
@ComponentScan
@ComponentScan注解用于自动扫描并加载符合条件的组件或Bean
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
String value() default "";
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
Class<?>[] excludeFilters() default {};
Class<?>[] includeFilters() default {};
FilterType filter() default FilterType.ANNOTATION;
boolean useDefaultFilters() default true;
ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;
boolean lazyInit() default false;
}
-
作用:自动扫描并加载符合条件的组件或Bean,无需显示使用@Bean注解或XML配置文件来注册Bean
实现:
-
excludeFilters():排除某些特定的过滤器,例如TypeExcludeFilter(自定义的过滤器,用于排除某些特定类型的类)
和
AutoConfigurationExcludeFilter(自定义的过滤器,用于排除某些自动配置类)。 -
basePackage和basePackageClasses:指定扫描的基础包和基础类。
-
小结
-
@SpringBootApplication
注解通过组合@SpringBootConfiguration
、@EnableAutoConfiguration
和@ComponentScan
注解,简化了 Spring Boot 应用的配置过程。 -
@SpringBootConfiguration
标记该类为一个配置类。 -
@EnableAutoConfiguration
启用自动配置机制,根据项目依赖自动配置应用程序。 -
@ComponentScan
自动扫描并加载符合条件的组件或 Bean。 -
过滤器
TypeExcludeFilter
和AutoConfigurationExcludeFilter
用于排除某些特定的类或自动配置类。
通过这些注解和过滤器的组合,@SpringBootApplication
注解能够极大地简化 Spring Boot 应用的启动和配置过程,使开发者能够快速搭建起一个功能完备的应用程序框架。