springboot自动加载原理?
Springboot最大的好处就是遵从了java约定大于配置不用面对一大堆的配置文件,springboot是根据你用的包来决定提供什么散孝滚配置。
springBoot的启动可以分为两个部分,第一部分:SpringApplication的实例化;第二部分:调用该实例运行run方法(springboot初始化)。
ApplicationContextInitializer:当springboot上慎段下文Context初始化完成后会调用
ApplicationListener:当springboot启动时事件change后都会触发
springboot初始化内容还是很多的,但是总结起来就四点:
即,初始化BeanFactory,加载bean,启冲余动内置web容器;
发布ContextRefreshedEvent事件;
springboot自动装配原理@EnableAutoConfiguration
1、springboot启动会加载大量的自动配弯弊盯置类:(在下面的spring.factories文件中)
2、通过@ConditionalOnXXX判断我们是否导入了相关的功能(卜键就是pom文件中的starter),如果导入了,就会自动配置。
4、给容器中添加自动配置类的时候,埋和会从XXXProperties类中获取某些属性。我们只需要在配置文件中指定这些属性即可,如果没指定就会用默认值。
XXXA
比如:server.port
最后,通过配置:debug=true
可以查看失效和未生效的类(spring.factories文件中的)
SpringBoot运行原理SpringBoot是一个基于Spring开发,集成了大量第三方库配置的javaweb开发框架
pom.xml
父依赖
其中它主要是依赖一个父项目,主要是管理项目的资源过滤及插件。以后我们导入依赖默认是不需要写版本的。
启动器spring-boot-starter
springboot-boot-starter-xxx:spring-boot的场景启动器郑御
spring-boot-starter-web:帮我们导入了web模块正常运行所依赖的组件。
springBoot将所有的功能场景都抽取出来,做成一个个的starter(启动器),只需要在项目中引入这些starter即可,所有相关的依赖都会被引进来,我们要用什么功能就导入什么样的场景启动器即可。
@SpringBootApplication
作用:标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot运行这个类的main方法来启动SpringBoot应用。
进入这个注解,里面包含了很多其他注解
@ComponentScan作用:自动扫描并加载符合条件的组件或者bean,将这个bean定义加载到IOC容器中。
@SpringBootConfiguration作用:SpringBoot的配置类,标注在某个类上,表示这是一个姿咐SpringBoot的配置类。
进入@SpringBootConfiguration注解查看,这里的@Configuration说明这是一个配置类,配置类对应Spring的xml配置文件。
继续查看@SpringBootConfiguration包含的其他注解
@EnableAutoConfiguration:开启自动配置功能
进入@EnableAutoConfiguration注解查看
@AutoConfigurationPackage自动配置包
@import:Spring底层注解@import,给容器中导入一个组件
@Import({AutoConfigurationImportSelector.class})给容器导入组件
AutoConfigurationImportSelector:自动配置导入选择器。那么它导入哪些组件的选择器呢
这个类中有这样一个方法:getCandidateConfiguration,而在这个方法中有调用了SpringFactoriesLoader类的静态方法loadFactoryNames()方法
进入loadSpringFactories方法
根据全局搜索Spring.factories,打开后是自动配置的文件。
随便打开一个其中的自动配置类看,它们都喊册岩是javaConfig配置类,都注入了一些Bean
所以,自动配置真正实现是从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中对应的org.springframework.boot.autoconfigure包下的配置项通过反射实例化为对应标注了@Configuration的javaConfig形式的IOC容器配置类,然后将这些都汇总成为一个实例并加载到IOC容器中。
结论:
1.SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值
2.将这些值作为自动配置类导入容器,自动配置类就生效,帮我们进行自动配置工作。
3.整个J2EE的整体解决方案和自动配置都在springboot-autoConfigure的jar包中。
4.它会给容器中导入非常多的自动配置类(xxxAutoConfiguration),就是给容器中导入这个场景需要的所有组件,并配置好这些组件。
5.有了自动配置类,免去了我们手动编写配置注入功能组件等的工作。
SpringApplication
这个类主要做了以下四件事
1.推断应用的类型是普通的项目还是web项目
2.查找并加载所有可用初始化器,设置到initializers属性中
3.找出所有的应用程序监听器,设置到listeners属性中
4.推断并设置main方法的定义类,找到运行的主类
springboot加载自定义properties原理springboot自定义属性文件通过value注解引入,和@autowired不同的是,它是由ConfigurationClassPostProcessor这个BeanDefinitionRegistryPostProcessor来处理,属性文件的读取和注入是在BeanDefinition级别,对象实例化之前。
我们建一个简单的类的梳理一下。
调用堆栈从refresh开始,主要走了这几个方法:
invokeBeanFactoryPostProcessors
invokeBeanDefinitionRegistryPostProcessors
ConfigurationClassPostProcessor-processConfigBeanDefinitions
ConfigurationClassParser-doProcessConfigurationClass
ConfigurationClassParser-processPropertySource
ConfigurationClassParser-addPropertySource
ConfigurationClassParser主要方法:
doProcessConfigurationClass-processPropertySource-addPropertySource
逻辑主要集中在doProcessConfigurationClass方法圆带
doProcessConfigurationClass负责解析橘庆芦@PropertySource,@Importannotations,@ComponentScan等注解。
1调用processPropertySource处理自身差族的propertySource
2扫描类上的ComponentScan,对扫出的类继续调用parse
3处理@Importannotations等其他标签
processPropertySource结构很简单:
1根据注解里的location属性载入配置文件
2调用addPropertySource处理每个属性文件
addPropertySource这个类才是真正处理@value属性:
1把用户定义的properties文件加到Eniverment中去
2如果有相同name的属性文件,需要合并
CompositePropertySource的场景其实是你有两个不同的文件,但是@PropertySource中设置同样的name属性,这样CompositePropertySource会做一个合并,按加入的时间顺序取。
增加一个product2,PropertySourcename都设置为myprod
debug到addPropertySource,newSource和existing已经不一样了。
environment的propertySources里也有两份文件了。
面试官必问题:SpringBoot自动装配原理?!首先会通过import导入DeferredImportSelector.
为什么要导入DeferredImportSelector呢,这是因为为了顺序州做的一个考虑,它的加载顺序是最后的,把它放到最后呢才能进行定制我们自己的,而不是以返迹前它的Bean优先
然后去扫描所有jar包中的spring.factories文件,把其中所有全类限定名封装成一个list,然后进行排序返回给Spring,然后Spring会漏清将它们注册是BeanDeifnition放到BeanDefinitionMap中去,然后Spring就能管理到这些Bean了
springboot自动加载原理?视频
相关评论:
鱼孙固所以,自动配置真正实现是从classpath中搜寻所有的META-INF\/spring.factories配置文件,并将其中对应的org.springframework.boot.autoconfigure包下的配置项通过反射实例化为对应标注了@Configuration的javaConfig形式的IOC容器配置类,然后将这些都汇总成为一个实例并加载到IOC容器中。结论:1.SpringBoot在启动的...
鱼孙固要使用DevTools实现热更新,首先需要在项目中添加相应的依赖。在Spring Boot项目里,确保引入了DevTools依赖。这样,当代码修改后,应用无需重启就能运行最新的代码,极大提升了开发效率。实现热更新的关键在于两个类加载器:base Classloader和restart Classloader。base Classloader负责加载不会改变的类,如依赖...
鱼孙固SpringBoot工作原理?首先打开一个基本的springboot项目,点进去@SpringBootApplication注解。EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。配置spring.factories,通过该配置,才能让springboot来自动加载我们的Configuration类。具体原理我们...
鱼孙固SpringBoot的自动装配(一)1、SpringBoot的自动装配是指:SpringBoot会自动将一些配置类的bean注册到ioc容器,我们可以在需要的地方使用@Autowired或@Resource等注解来使用它。2、SPI文件有很多的扩展点(很多的配置项key),不在一一叙述。可以在idea中直接搜索spring.factories,可以看到有很多。3、自己动手写...
鱼孙固SpringBoot使用一个全局的配置文件 application.properties application.yml 配置文件的作用:修改SpringBoot自动配置的默认值,SpringBoot在底层都给我们自动 配置好。有什么配置项,可以移步官方文档 配置文件一般放在src\/main\/resources目录或者类路径\/confifig下,当然还有很多位置可 以放,它们会有不同优先级,后面会讲到。
鱼孙固SpringBoot的自定义配置 SpringBoot免除了项目中大部分的手动配置,对一些特定情况,我们可以通过修改全局配置文件以适应具体生产环境,可以说,几乎所有的配置都可以写在application.properties文件中,SpringBoot会自动加载全局配置文件,从而免除我们手动加载的烦恼。但是,如果我们自定配置文件,SpringBoot是无法识别这些配置文件的...
鱼孙固增加 layout 与finalName 相关配置,如下:启动脚本:执行后即可加载相关文件到 classpath了,如果jar中存在自动装配类,也会自动加载。https:\/\/docs.spring.io\/spring-boot\/docs\/current\/reference\/html\/appendix-executable-jar-format.html#executable-jar-property-launcher-features ...
鱼孙固配置文件SpringBoot使用一个全局的配置文件application.propertiesapplication.yml配置文件的作用:修改SpringBoot自动配置的默认值,SpringBoot在底层都给我们自动配置好。则只会根据classloader的classpath列表,选取第一个出现的文件。因为springboot加载配置文件时最底层是使用的下面的方法:这两个方法只会获取...
鱼孙固springboot启动会加载大量的自动配置类:(在下面的spring.factories文件中)通过@ConditionalOnXXX判断我们是否导入了相关的功能(就是pom文件中的starter),如果导入了,就会自动配置。SpringBoot自动装配是springboot重要的功能点。Boot系列、其它框架与Boot的整合很多是基于自动装配的。ComponentScan是用来扫描...
鱼孙固Starter可以理解为一个可拔插式的插件,提供一系列便利的依赖描述符,您可以获得所需的所有Spring和相关技术的一站式服务。应用程序只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。用一句话描述,就是springboot的场景启动器。官方定义的starter命名都是spring-boot...