SpringBoot的启动类@SpringBootApplication详解:
SpringBoot启动类:
@SpringBootApplication public class SpringBootDemo1Application { public static void main(String[] args) { SpringApplication.run(SpringBootDemo1Application.class, args); } }
@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 {
1、查看SpringBootApplication中的参数
前面四个注解:(前面两个为元注解)
//元注解:对注解进行描述的注解,加在注解类上 @Target(ElementType.TYPE) //有效时间,定义注解,一定:runtime @Retention(RetentionPolicy.RUNTIME) //注解是否在javaDoc文档显示 @Documented //注解是否被继承,子类能不能继承这个父类的注解 @Inherited
后面三个注解:
//springboot的配置类 @SpringBootConfiguration //开启自动配置 @EnableAutoConfiguration //扫描注解 @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
2、查看@SpringBootConfiguration
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration //就是Configuration注解 public @interface SpringBootConfiguration {
3、查看@EnableAutoConfiguration
@EnableAutoConfiguration 简单概括一下就是,借助@Import的支持,收集和注册特定场景相关的bean定义。
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) //导入一个类的核心类 public @interface EnableAutoConfiguration {
借助AutoConfigurationImportSelector,@EnableAutoConfiguration可以
帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器
AutoConfigurationImportSelector的核心方法:
@Override public String[] selectImports(AnnotationMetadata annotationMetadata) { if (!isEnabled(annotationMetadata)) { return NO_IMPORTS; } AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader .loadMetadata(this.beanClassLoader); AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata); return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations()); }
自动配置幕后英雄:SpringFactoriesLoader详解
SpringFactoriesLoader属于Spring框架私有的一种扩展方案,其主要功能就是从指定的配置文件META-INF/spring.factories加载配置。
public abstract class SpringFactoriesLoader { private static final Log logger = LogFactory.getLog(SpringFactoriesLoader.class); public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
配合@EnableAutoConfiguration使用的话,它更多是提供一种配置查找的功能支持,即根据@EnableAutoConfiguration的完整类名org.springframework.boot.autoconfigure.EnableAutoConfiguration作为查找的Key,获取对应的一组@Configuration类
所以,@EnableAutoConfiguration自动配置:
配置类: “spring04.config.JdbcConfig” --> 反射技术
Class.forName() --> JdbcConfig的Class对象
--> newInstace() --> 得到配置类的对象
--> 配置类对象调用方法, 把方法产生的对象保存到Ioc容器
selectImport()解析”MATA-INF/spring.factories” 文件, 这个文件包含所有的配置类的”包.类”, 通过反射,调用每一个配置类的方法, 这个方法上都有一个@Bean, 把这个方法产生的对象保存到IOC容器, 这个配置类的bean就是原先在spring配置文件中配置的bean
4、@ComponentScan包扫描
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
component
是组件,scan
是扫描,所以这个注解的含义就是用来扫描组件的,
componentScan
扫描当前包及其子包下被 @Component
,@Controller
,@Service
,@Repository
注解标记的类并纳入到spring容器中进行管理,所以这个注解会自动注入所有在主程序所在包下的组件。默认把当前启动类所在的包作为扫描包的起点,例如咱们的项目,扫描 com.maweiqi
包
以前在ssm项目中我们需要去配置我们的包扫描
<context:component-scan base-package="com.xxx"></context:component-scan>