springboot自动加载
2021-04-25 19:37:06 0 举报
试试撒是
作者其他创作
大纲/内容
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();将配置类放入BeanDefinitionMap中
方法中重点看一下processImports方法,该方法就加载了springboot中自动装配的配置类
2
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { font color=\"#007fff\
从注册中心中的配置类派生进一步的bean定义。postProcessor.postProcessBeanDefinitionRegistry(registry);
1
refreshContext(context);加载@Import注解中配置的组件类
process();---->handler.processGroupImports();
span style=\"font-weight: normal;\
在springboot的自动装配的注解上存在两个@Import注解导入的配置类,这两个配置类都实现了相关接口1.自动配置包注解是通过Registrar实现接口做操作AutoConfigurationPackages.Registrar.class implements ImportBeanDefinitionRegistrar2.AutoConfigurationImportSelector.class implements DeferredImportSelector (extends ImportSelector)
基于ConfigurationClass构建一个配置模型,通过这个模型去加载配置的相关组件processConfigBeanDefinitions(registry);
public void parse(Set<BeanDefinitionHolder> configCandidates) { for (BeanDefinitionHolder holder : configCandidates) { BeanDefinition bd = holder.getBeanDefinition(); try { if (bd instanceof AnnotatedBeanDefinition) { //解析注解封装ConfigurationClass对象 font color=\"#3399ff\
1.检查给定的bean定义是否为配置类(或者在配置/组件类中声明的嵌套组件类,也要自动注册)的候选对象,并相应地标记它。span style=\"font-weight: normal;\
该方法的逻辑:第一次调用这个方法的对象就是配置启动类MySpringApplication1.走过解析Component注解的操作,看当前类是否有成员可以被加载2.处理类上的ComponentScan并解析 如果存在这个注解则将扫描到的类加入BeanDefinitionMap中。 并且每一次都对当前创建的BeanDefinition对象检查是否当前的类是一个配置类,也就是通过蓝色的parse递归的调用当前doProcessConfigurationClass不断检查3.处理标有@Import注解类的操作font color=\"#ff0000\
加载组件对应的配置类public Iterable<Group.Entry> getImports() { for (DeferredImportSelectorHolder deferredImport : this.deferredImports) { //执行了实现AutoConfigurationImportSelector font color=\"#007fff\
invokeBeanFactoryPostProcessors(beanFactory);真正去加载@Import(AutoConfigurationImportSelector.class)和@Import(AutoConfigurationPackages.Registrar.class)并且还将其他spring注解的类放入BeanDefinitonMap中
执行grouping.getImports()读取组件对应spring.factories文件中的配置类。这个方法执行的时候通过forEach对spring.factories文件加载的每个配置类封装成ConfigurationClass对象font color=\"#3399ff\
进入spring的refresh()方法
parser.parse(candidates);
收藏
0 条评论
下一页