
SpringBoot启动过程深度解析——自动装配-启动过程解析
发布日期:2023-09-20 01:41:38
浏览次数:1
分类:技术文章
本文共 2647 字,大约阅读时间需要 8 分钟。
SpringBoot启动过程深度解析——自动装配-启动过程解析
一、自动装配相关概念
自动装配是什么? 自动装配是用户在Spring进行简单的配置,就能让Spring在启动过程中对相关Bean进行自动装配,然后将它们交给spring容器来帮我们进行管理。自动装配功能的包: Spring-boot-autoconfigure包提供了自动装配的功能如何开启自动装配的注解以及如何实现自动装配: 如何开启: 在启动类加上@EnableAutoConfiguration来开启自动装配功能 @EnableAutoConfiguration是如何实现自动装配的: 此注解包含两个重要的注解,是通过以下的子注解实现自动装配: @AutoConfigurationPackage: 这个注解的作用说白了就是将主配置类(@SpringBootApplication标注的类)所在包以及子包里面的所有组件扫描并加载到spring的容器中 @Import(AutoConfigurationImportSelector.class) 这个注解就是引入AutoConfigurationImportSelector类,通过该类检索META-INF/spring.factories文件中EnableAutoConfiguration所有实现类,对这些实现类进行个性化的自动装配 【并非所有EnableAutoConfiguration所有实现类都会生效,而是根据实现类中各种@Condition进行条件筛选来决定要不要装配】
二、自动装配的流程
开启自动装配: 1.引入Spring-boot-autoconfigure包 2.在启动类加上@EnableAutoConfiguration来开启自动装配功能 Spring启动过程中如何扫描需要装配的Bean: 1.spring启动过程中的invokeBeanFactoryPostProcessors()方法,会调用BeanDefinitionRegisterPostProcessr的实现类,实现BeanDefnition的注册和修改 2.【ConfigurationClassPostProcessor类是BeanDefinitionRegisterPostProcessr的实现类之一,实现了对整个项目的Bean发现和BeanDefiniton的注册】 3.ConfigurationClassPostProcessor类的方法,包含对以下注解的解析@Configuration、@Component、@PropertySource、@ComponentScan、@Bean、@Import 4.由于启动类使用了注解@EnableAutoConfiguration【@AutoConfigurationPackage 和 @Import(AutoConfigurationImportSelector.class)】,所以ConfigurationClassPostProcessor类就会对这两个注解进行解析和执行特定的自动装配 5.首先是@AutoConfigurationPackage,会对主配置类所在包以及子包里面的所有组件扫描并加载到spring的容器中 6.其次是@Import(AutoConfigurationImportSelector.class),通过引入AutoConfigurationImportSelector类,并通过该类检索META-INF/spring.factories文件中EnableAutoConfiguration所有实现类,让后用这些实现类重新执行自动装配的流程 7.最终实现了自动装配 自定义的一些Bean信息到Spring容器中,并执行创建Bean的统一流程
三、自动装配过程中一些注解
如果想在特定的环境/条件下,执行自动装配的配置类的解析,就需要用到以下这些条件注解,帮助我们更加灵活地使用自动装配功能
自动配置中使用的条件化注解 ===============================================================================================================条件化注解 配置生效条件 ===============================================================================================================@ConditionalOnBean 配置了某个特定Bean @ConditionalOnMissingBean 没有配置特定的Bean @ConditionalOnClass Classpath里有指定的类 @ConditionalOnMissingClass Classpath里缺少指定的类 @ConditionalOnExpression 给定的Spring Expression Language(SpEL)表达式计算结果为true @ConditionalOnJava Java的版本匹配特定值或者一个范围值 @ConditionalOnJndi 参数中给定的JNDI位置必须存在一个,如果没有给参数,则要有JNDI InitialContext @ConditionalOnProperty 指定的配置属性要有一个明确的值 @ConditionalOnResource Classpath里有指定的资源 @ConditionalOnWebApplication 这是一个Web应用程序 @ConditionalOnNotWebApplication 这不是一个Web应用程序 ===============================================================================================================此处说明:该段文本的原文链接:https://blog.csdn.net/qq_57434877/article/details/123933529
转载地址:https://blog.csdn.net/weixin_39072857/article/details/130120565 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2023年09月24日 20时29分40秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
CSS
2019-03-07
font-size
2019-03-07
对象解析
2019-03-07
跳出"低水平勤奋陷阱"
2019-03-07
CPU参数指标说明
2019-03-07
models.py相关API
2019-03-07
关于测试
2019-03-07
HTML5
2019-03-07
节点List相关操作
2019-03-07
命名空间
2019-03-07
读书笔记
2019-03-07
Unity中常用Time类详解
2019-03-07
Echoworx为电子邮件加密平台增加生物特征身份验证功能
2019-03-07
法拉第未来选择Velodyne作为旗舰超豪华电动车FF 91的独家激光雷达供应商
2019-03-07
获高瓴资本5.3亿美元融资,京东健康就能“高枕无忧”了?
2019-03-07
被“铲屎官”养成的千亿新战场,宠物经济风口机会在哪里?
2019-03-07
奢侈品电商,压死趣店的最后一根稻草?
2019-03-07
在外卖平台也能当主播,美团直播到底“行不行”?
2019-03-07
收购快钱做线下支付,京东数科与蚂蚁终有一战?
2019-03-07
网红经济当道,奶茶店成功路能否“复制”?
2019-03-07