springboot-1-自动装配/启动流程/常用注解

SpringFactoriesLoader(sfl)加载classpath的META-INF下的spring.factories文件
1 接口=实现1,实现2,给出接口的多个实现
2 EnableAutoConfiguration=多个AutoConfiguration类
上面是spring-boot自动装配的简要说明,具体看下:https://blog.csdn.net/weixin_43207025/article/details/117548451

排除某些自动装配类:配置文件spring.autoconfigure.exclude或@EnableAutoConfiguration注解中排除,但用户一般不直接用这个注解,我们可以在@SpringBootApplication中排除

@Configuration:含@Component,可被组件扫描到进行注册,其作用相当于一个xml文件,提供多个BeanDefinition
@Bean:放在@Configuration类的方法上提供一个BeanDefinition(可结合@Scope等),Bean实例生成可通过static或instance方法
@Import:xml可以import另一xml,@Configuration类可以@Import另一@Configuration类,还可以@Import ImportSelector(可import一些@Configuration类)和ImportBeanDefinitionRegistrar(可注册一些BeanDefinition)
@ComponentScan:若不加路径,以注解所在类的包为扫描路径
主类的@SpringBootApplication:含@SpringBootConfiguration(即为@Configuration),含@EnableAutoConfiguration(即@Import(AutoConfigurationImportSelector.class)和@Import(AutoConfigurationPackages.Registrar.class)),含@ComponentScan
@Conditional注解,决定@Configuration类是否被加载,可含多个Condition(SpringBootCondition)进行判断,有多个变种,如@ConditionalOnClass就是含OnClassCondition的@Conditional

启动过程:
1推断web环境(classpath是否有Servlet等),主类(main方法类,看下堆栈)
2 sfl 加载ApplicationContextInitializer和ApplicationListener
3 Environment的生成(StandardEnvironment或StandardServletEnvironment),环境生成时内部加入多PropertySource如systemProperties,环境变量,web.xml内的servletContext参数或servlet参数
4 EventPublishingRunListener(SpringApplicationRunListener)发布ApplicationEnvironmentPreparedEvent(ApplicationEvent),ConfigFileApplicationListener接收事件,sfl加载EnvironmentPostProcessor(自己也是),在其Loader.load方法我们看到加载配置文件的过程
看看这几个:location name-profile ext
location:classpath或项目根目录,可加一层config目录, spring.config.location 可指定
name:application,spring.config.name可指定
profile:默认没有,除非你指定了Spring的profile(参数或默认文件),会额外加载profile对应文件
ext:properties,xml,yaml,yml
5 创建AnnotationConfigApplicationContext或AnnotationConfigEmbeddedWebApplicationContext(web环境)
6 应用ApplicationContextInitializer,创建BeanDefinitionLoader(可加载资源,类,包等,含多个Reader),加载source(传入的启动Class),这样主类被注册入ApplicationContext,BeanDefinitionReader是只能对资源(如xml)进行加载
7调用ApplicationContext的refresh方法,其中ConfigurationClassPostProcessor(BeanFactoryPostProcessor)在所有BeanDefinition中找到唯一的@Configuration类即我们的主类

处理@Configuration类:用ConfigurationClass进行表示处理
ConditionEvaluator考虑此@Configuration类是否满足@Conditional条件,不满足不加载
考虑@Configuration类里的内部@Configuration类
处理@Import:收集所有@Import,比如某些在注解的注解上
1 @Import为@Configuration类,进入处理@Configuration类流程
2 @Import为ImportSelector,若为DeferredImportSelector,稍后触发,否则调用ImportSelector的selectImports方法,又带来多个(可被@Import的元素),再次进入处理@Import流程
3 @Import为ImportBeanDefinitionRegistrar,设置入ConfigurationClass
还需考虑@PropertySource,@ComponentScan,@ImportResource,@Bean设置入ConfigurationClass等

处理完@Configuration类后,处理前面说到的DeferredImportSelector,同样带来多个进入@Import流程

最后注册所有@Configuration类相关的BeanDefinition,包括ConfigurationClass里的@Bean,ImportBeanDefinitionRegistrar,还有@ImportResource,还有@Configuration类自己

实际上我们依赖AutoConfigurationImportSelector这个DeferredImportSelector,其用sfl获得EnableAutoConfiguration对应的各类名,进行排序(AutoConfigureOrder,AutoConfigureBefore,AutoConfigureAfter),排除部分,进行过滤AutoConfigurationImportFilter(只有OnClassCondition进行初步过滤,后面在ConditionEvaluator进行主要过滤),由这个我们获取了很多@Configuration类

AutoConfigurationPackages.Registrar这个ImportBeanDefinitionRegistrar没太多用,仅注册了个BasePackages的bean,含我们主类的包名

8 若为web的ApplicationContext,在refresh方法中其onRefresh方法会创建EmbeddedServletContainer

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值