1.@SpringbootApplication
@Configuration标志的类 在spring ioc启动的时候就会加载创建这个类对象
@EnableAutoConfiguration 中有两个注解
(1)@AutoConfigurationPackage 扫描主程序包(主程序main所在包及其子包)
可以看到这个类 :
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
这个类是注册组件的
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
AutoConfigurationPackages.register(registry, (String[])(new PackageImports(metadata)).getPackageNames().toArray(new String[0]));
}
AnnotationMetadata 启动类的一些元信息
debug打这个断点的时候 执行 new PackageImports(metadata)).getPackageNames() 可以得到主程序所在包的包名
这个注解两个作用:
利用@import给容器导入组件和把主程序所在的包的所有组件导入进来
( 2 ) @Import({AutoConfigurationImportSelector.class}) 向容器中注入类
加载自动配置类
扫描spi文件
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
组件扫描 排除一些组件
(1)这个类实现
(2)排除已经扫描进来的配置类和自动配置类
重新启动看执行顺序 先@ComponentScan( 再@EnableAutoConfiguration 最后 @SpringBootConfiguration
run中看 停留在refreshcontext(context)
springboot生命周期:
自动配置在初始化组件创建中 stated 中refresh是在调用spring 最外层就是启动ioc容器 ioc容器造工厂 工厂造组件
准备工厂可以理解为放车间 放流水线
finishBeaFactoryInitialzation 开始造扫描出的组件 调用无参构造器 或者有参构造器创建
这些组件会被创建
@Configuration
@Componet
@Bean
@Service
。。。