spring_启动流程详解
2022-12-18 01:38:28 7 举报
spring_启动流程详解
作者其他创作
大纲/内容
向BeanFactory中添加AutowiredAnnotationBeanPostProcessor对应的BeanDifinition
向BeanFactory中添加EventListenerMethodProcessor对应的BeanDifinition
registerBeanPostProcessors(beanFactory):因为上面的步骤完成了扫描,这个过程中程序员可能自己定义了一些BeanPostProcessor,在这一步就会把BeanFactory中所有的BeanPostProcessor找出来并实例化得到一个对象,并添加到BeanFactory中去(属性beanPostProcessors),最后直接添加一个ApplicationListenerDetector对象(也是一个BeanPostProcessor)
扫描得到BeanDefinition并注册
initPropertySources()空方法,给子类重写(模板模式)
设置beanFactory的类加载器beanFactory.setBeanClassLoader(getClassLoader());
执行ConfigurationClassPostProcessor的postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
// 子类来设置一下BeanFactorypostProcessBeanFactory(beanFactory);
设置autowireCandidateResolver
用来解析单例Bean中被@EventListener注解了的方法,并封装为ApplicationListener并添加到ApplicationContext中
设置ApplicationContext的initLifecycleProcessor
// BeanFactory准备好了之后,执行BeanFactoryPostProcessor,开始对BeanFactory进行处理// 默认情况下:// 此时beanFactory的beanDefinitionMap中有6个BeanDefinition,5个基础BeanDefinition+AppConfig的BeanDefinition// 而这6个中只有一个BeanFactoryPostProcessor:ConfigurationClassPostProcessor// 这里会执行ConfigurationClassPostProcessor进行@Component的扫描,扫描得到BeanDefinition,并注册到beanFactory中// 注意:扫描的过程中可能又会扫描出其他的BeanFactoryPostProcessor,那么这些BeanFactoryPostProcessor也得在这一步执行invokeBeanFactoryPostProcessors(beanFactory); // scanner.scan()
执行还没执行的BeanFactoryPostProcessor的postProcessBeanFactory()方法
// 给子类的模板方法onRefresh();提供给AbstractApplicationContext的子类进行扩展,没用
解析配置类的BeanFactoryPostProcessor会进行扫描
设置表达式解析器:StandardBeanExpressionResolver// Spring5.3中新增的功能,可以选择是否开启Spel功能,shouldIgnoreSpel默认为false,表示开启if (!shouldIgnoreSpel) {beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));}
// Prepare the bean factory for use in this context.// 准备BeanFactory// 1. 设置BeanFactory的类加载器、SpringEL表达式解析器、类型转化注册器// 2. 添加三个BeanPostProcessor,注意是具体的BeanPostProcessor实例对象// 3. 记录ignoreDependencyInterface// 4. 记录ResolvableDependency// 5. 添加三个单例BeanprepareBeanFactory(beanFactory);
执行LifecycleBean
本地路径\\spring-framework-5.3.10-main\\spring-context\\src\\main\\java\\org\\springframework\\context\\annotation\\AnnotatedBeanDefinitionReader.javaregister(componentClasses);//这里进入AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(beanClass);
在构造过程中会添加@Component注解对应的AnnotationTypeFilter到includeFilters中
从BeanFactory中找到类型为BeanFactoryPostProcessor的beanName,而这些BeanFactoryPostProcessor包括了上面的BeanDefinitionRegistryPostProcessor
添加一个Bean的后置处理器:ApplicationContextAwareProcessor//用来判断某个Bean是不是ApplicationContextAware等等,如果是则执行Aware回调// 组成一个BeanPostProcessor,用来处理EnvironmentAware、EmbeddedValueResolverAware等回调beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
利用reader注册AppConfig为BeanDefinition,类型为AnnotatedGenericBeanDefinition
从BeanFactory中找到类型为BeanDefinitionRegistryPostProcessor的beanName,也就是ConfigurationClassPostProcessor,然后调用BeanFactory的getBean方法得到实例对象
initMessageSource();如果BeanFactory中存在一个叫做“messageSource”的BeanDefinition,那么就会把这个Bean对象创建出来并赋值给ApplicationContext的messageSource属性,让ApplicationContext拥有国际化的功能
执行其他BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry()方法
发布ContextRefreshedEvent事件publishEvent(new ContextRefreshedEvent(this));
自动注入候选者解析器,用来判断某个Bean针对当前依赖是否能进行自动注入
本地路径\\spring-framework-5.3.10-main\\spring-context\\src\\main\\java\\org\\springframework\\context\\support\\GenericApplicationContext.javapublic GenericApplicationContext() {this.beanFactory = new DefaultListableBeanFactory();}
finishRefresh();BeanFactory的初始化完后,就到了Spring启动最后一步
记录启动时间this.startupDate = System.currentTimeMillis();
initApplicationEventMulticaster();如果BeanFactory种存在一个叫“applicationEventMulticaster”的BeanDefinition,那么就会把这个Bean对象创建出来并赋值给ApplicationContext的applicationEventMulticaster属性,让ApplicationContext拥有事件发布的功能
向BeanFactory中添加DefaultEventListenerFactory对应的BeanDifinition
解析@Import、@Bean等注解得到BeanDefinition并注册
设置dependencyComparator
本地路径\\spring-framework-5.3.10-main\\spring-context\\src\\main\\java\\org\\springframework\\context\\annotation\\AnnotationConfigApplicationContext.javathis.reader = new AnnotatedBeanDefinitionReader(this);
会处理Bean中@Resource注解进行依赖注入
接下来就是调用refresh()方法
使得ApplicationListenerDetector为BeanPostProcessor列表中的最后一个本地路径\\spring-framework-5.3.10-main\\spring-context\\src\\main\\java\\org\\springframework\\context\\support\\PostProcessorRegistrationDelegate.javabeanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
执行所有BeanDefinitionRegistryPostProcessor的postProcessBeanFactory()方法
添加ignoreDependencyInterface
和上面一起使用, DefaultEventListenerFactory中定义了如何把 @EventListener封装为ApplicationListener
// 把定义的ApplicationListener的Bean对象,设置到ApplicationContext中去,并执行在此之前所发布的事件registerListeners();从BeanFactory中获取ApplicationListener类型的beanName,然后添加到ApplicationContext中的事件广播器applicationEventMulticaster中去
添加一个Bean的后置处理器:ApplicationListenerDetector
构造AnnotatedBeanDefinitionReader
添加resolvableDependencies
添加一些单例Bean到单例池
解析AppConfig类
prepareRefresh()
构造一个BeanFactory,为DefaultListableBeanFactory
是一个Bean的后置处理器,检查某个Bean是不是一个ApplicantsListener,如果是会添加到ApplicationContext// ApplicationListenerDetector负责把ApplicantsListener类型的Bean注册到ApplicationContext中beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
比较器,可以用来排序,获取@Priority的值,Ordered接口的值,@Order注解的值
向BeanFactory中添加ConfigurationClassPostProcessor对应的BeanDifinition
会处理Bean中@Autowired注解、@Value注解进行依赖注入
向BeanFactory中添加CommonAnnotationBeanPostProcessor对应的BeanDifinition
验证Environment中是否包括了必须要有的属性
如果某个类实现了这个类合中的接口,那么对应的set方法不会被用来进行byType或byName的自动注入// 如果一个属性对应的set方法在ignoredDependencyInterfaces接口中被定义了,则该属性不会进行自动注入(是Spring中的自动注入,不是@Autowired)beanFactory.ignoreDependencyInterface(EnvironmentAware.class);beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);beanFactory.ignoreDependencyInterface(MessageSourceAware.class);beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);beanFactory.ignoreDependencyInterface(ApplicationStartupAware.class);另外其实在构造BeanFactory的时候就已经提前添加了另外三个:BeanNameAwareBeanClassloaderAwareBeanFactoryAware
finishBeanFactoryInitialization(beanFactory);完成BeanFactory的初始化,主要是实例化非懒加载的单例Bean
到此,所有的BeanFactoryPostProcessor的逻辑都执行完了,主要做的事情就是得到BeanDefinition并注册到BeanFactory中
构造ClassPathBeanDefinitionScanner
0 条评论
下一页