每个springBoot程序都有一个主入口,也就是main方法,main方法调用springApplication.run()启动整个spring boot程序,该方法所在的类有一个@SpringBootApplication注解,它是一个组合注解
spring启动类:@SpringBootAppclation
public class SpringRunAppliction(){
public static void main(String[] args ){
//spring中最先启动的部分
//加载该文件,加载@SpringBootApplaction注解
SpringAppliction.run(RunApp.calss);
}
}
@SpringBootApplication注解的组成:
@Target(ElementType.TYPE) //对类有效
@Retention(RetentionPolicy.RUNTIME) //运行期有效执行
@documented //生成源码时是否生成动态文档
@Inherited //标识注解是否可以被继承
//修饰主启动类,标识这是一个扫描并配置用户自己的配置类,并实例化对。由主启动类加载所有其他配置类
@SpringBootConfiguration
//加载根据用户配置加载jar包
@EnableAutoConfiguration
//扫描包配置
@ComponentScan(
//排除特定的类型(excludeFilters排斥过滤器)
excludeFilters = { @Filter(type = FilterType.CUSTOM, classes =
TypeExcludeFilter.class
),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
@AliasFor(annotation = EnableAutoConfiguration.class)
Class>[] exclude() default {};
@AliasFor(annotation = EnableAutoConfiguration.class)
String[] excludeName() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanbasePackages() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
Class>[] scanbasePackageClasses() default {};
@AliasFor(annotation = Configuration.class)
boolean proxyBeanMethods() default true;
@SpringBootConfiguration
修饰主启动类,表示这是一个配置类,只是简单地继承自@Configuration
一个架构只能有一个SpringBootConfigration
@Target(ElementType.TYPE) //对类有效
@Retention(RetentionPolicy.RUNTIME) //运行期有效执行
@documented //生成源码时是否生成动态文档
@Cofiguration //@Configuration 配置文件 配置类,整合当前类中的第三方框架(配置)
public @interface SpringBootConfiguration {
@AliasFor(annotation = Configuration.class)
boolean proxyBeanMethods() default true;
}
@Configuration,标志这是一个配置类, 一般用于标识类文件,告知SpringBoot程序,这个类是整合第三方框架/配置类
@EnableAutoConfiguration启用Spring应用程序上下文的自动配置,尝试猜测和配置您可能需要的bean。自动配置类通常基于类路径和定义的bean应用。
使用@SpringBootApplication注解启动时,会自动启用上下文的自动配置,因此添加此注释不会产生额外的效果
自动配置尝试尽可能智能化,并在您定义更多自己的配置时退出。您始终可以手动在exclude属性中排除任何不想应用的配置(如果您没有访问权限,请使用excludeName()。您还可以通过实用配置的spring.autoconfigure.exclude属性排除它们。自动配置总是在注册用户定义的bean之后应用
用@EnableAutoConfiguration注释的类的包,自动装配,通常用作“默认值”。例如,它将在扫描@Entity类时使用。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@documented
@Inherited
//自动配置包 : 会把@springbootApplication注解标注的类所在包名拿到,
//并且对该包及其子包进行扫描,将组件添加到容器中
@AutoConfigurationPackage
//可以帮助springboot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot
//并创建并使用的IoC容器(ApplicationContext)中
@import(AutoConfigurationimportSelector.class)
public @interface EnableAutoConfiguration {
}
@AutoConfigurationPackage
启动自动配置包扫描的路径,工作原理:自动动态获取主启动类的包路径,开启包扫描的机制
(代码都要写在主启动类的同包及子包类)。注册当前主程序的同级以及子集的包组件,其实就是注册了一个Bean的定义
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@documented
@Inherited
@import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
}
@import(AutoConfigurationimportSelector.class)
@import也是Spring原生提供的注解,通过该注解讲Registrar类导入到容器中。
springboot体现了开箱即用的设计思想,用户引入配置之后,只需少量配置(配置config文件)就可以直接使用
将其他的包加入自己的项目中,负责加载但不运行
主启动执行时,内部会加载@import(AutoConfigurationimportSelector.class),该注解的作用就是根据依赖信息,扫描并加载进来的“启动器”。Springboot内部的多个启动器会根据用户的加载,执行对应的jar包,最终整合所有需要的框架
AutoConfigurationimportSelector.class
帮助Spring应用将所有的符合条件的@Configuration中的配置类加载到工厂中,告知其需要导入哪一些的组件,进入该类,有一些重要的方法需要解析
@ComponentScan()组件扫描,可以自动发现并包装Bean,自动扫描并加载符合的组件(比如@Component和@Pepository等)或者Bean定义,最终将这些bean定义下载到IoC容器中
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM,classes =TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class)
})



