赞
踩
一般来说,Spring启动,就是构造ApplicationContext对象以及调用refresh()方法的过程。
类的继承关系图
先调用this()
即它自身无参的构造方法,再根据父类GenericApplicationContext
的无参构造方法,创建DefaultListableBeanFactory
,即spring容器=BeanFactory。
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Appconfig.class);
调用父类GenericApplicationContext
的无参构造方法,创建DefaultListableBeanFactory
。
用于添加一些基础的PostProcessor,同时可以通过reader进行BeanDefinition的注册),同时对BeanFactory进行设置和添加PostProcessor(后置处理器)
给beanFactory的属性dependencyComparator添加默认值AnnotationAwareOrderComparator
。它是一个Comparator,用于排序,会获取某个对象上的@Order
注解或者通过实现Ordered
接口所定义的值进行排序,在日常开发中可以利用这个类来进行排序。
给beanFactory的属性autowireCandidateResolver添加默认值ContextAnnotationAutowireCandidateResolver
。用于解析某个Bean能不能进行自动注入,比如某个Bean的autowireCandidate属性是否等于true。在它的父类GenericTypeAwareAutowireCandidateResolver
的核心方法isAutowireCandidate()
中判断
定义集合beanDefs
,存储BeanDefinitionHolder。给beanFactory添加一些必须的beanDefinition ,存到beanDefinitionMap
集合中
给beanFactory注册一个ConfigurationClassPostProcessor
的beanDefinition,并添加到集合beanDefs。它用于解析配置类,涉及到扫描。
给beanFactory注册一个AutowiredAnnotationBeanPostProcessor
的beanDefinition,并添加到集合beanDefs。解析@Autowired注解。
给beanFactory注册一个CommonAnnotationBeanPostProcessor
的beanDefinition,并添加到集合beanDefs ,解析@Resource注解。
给beanFactory注册一个EventListenerMethodProcessor
的beanDefinition,并添加到集合beanDefs,解析@EventListener注解。
给beanFactory注册一个DefaultEventListenerFactory
的beanDefinition,并添加到集合beanDefs,解析@EventListener注解。
以下是创建AnnotatedBeanDefinitionReader
的源码
该类用于扫描得到并注册BeanDefinition。同时为属性includeFilters
,environment
,resourceLoader
设置值
添加默认的扫描过滤includeFilters
, 扫描@ComponentScan
路径下的.class文件时,默认扫描添加了@Component
的类。
register(componentClasses);
利用reader将Appconfig.class
注册为BeanDefinition,类型为AnnotatedGenericBeanDefinition
,并为beanDefinition设置属性。因为扫描时,是拿到Appconfig
类的@ComponentScan
配置的扫描路径,将目录下的.class
文件扫描得到beanDefinition,而它自己本身没有被扫描成beanDefinition,所以要单独将它注册到容器中。
该方法是容器AnnotationConfigApplicationContext
的父类AbstractApplicationContext
的方法
AbstractRefreshableWebApplicationContext
,SpringMVC从web.xml中读取servlet配置的key-value存入Environment。 initPropertySources()
是一个模板方法,让子类实现。// 验证环境变量中是否存在指定的值
getEnvironment().validateRequiredProperties();
在开发工具中设置,或者在spring.properties文件中设置都可以拿到
refreshBeanFactory(); 判断是否重复刷新,AnnotationConfigApplicationContext
不支持重复刷新,AnnotationConfigWebApplicationContext
支持重复刷新。
AnnotationConfigApplicationContext
,是SpringBoot启动类,它的父类是GenericApplicationContext
,该容器只能刷新一次。该类在创建时,就调用父类无参的构造方法创建了DefaultListableBeanFactory
容器。
AnnotationConfigWebApplicationContext
,是SpringMVC的启动类,它的父类是AbstractRefreshableWebApplicationContext
,它可以重复刷新,如果刷新过,则先执行bean的销毁逻辑,然后销毁容器,将beanFactory的引用置空,再重新创建一个DefaultListableBeanFactory赋值给beanFactory。 该类是在调用下图的refreshBeanFactory()
方法时才会创建DefaultListableBeanFactory
。
该方法用于给beanFactory设置属性
设置beanFactory的类加载器
设置Spring EL表达式的默认解析器为StandardBeanExpressionResolver
设置默认的类型转换器注册器为ResourceEditorRegistrar
,用于注册默认的PropertyEditor。
添加Bean的后置处理器ApplicationContextAwareProcessor
,用于执行Aware回调
给beanFactory的属性ignoredDependencyInterface
添加一些接口。
如果接口的实现类实现了set回调方法,同时使用了@Autowired
注解进行属性注入,那么在属性注入时,以及aware回调时,都会执行这个set方法。
如果这些接口的实现类开启的注入方式是byName或byType,实现接口的set回调方法后,spring在注入属性的时候会忽略,在aware回调时才执行这个set回调方法。
给beanFactory的属性resolvableDependencies
添加默认值,在byType进行依赖注入时,会先从resolvableDependencies
属性中根据类型找bean
添加Bean的后置处理器
ApplicationListenerDetector
,是一个BeanPostProcessor,用来判断某个Bean是不是ApplicationListener,如果是则把这个Bean添加到ApplicationContext中去,注意一个ApplicationListener只能是单例的LoadTimeWeaverAwareProcessor
,是一个BeanPostProcessor,用来判断某个Bean是不是实现了LoadTimeWeaverAware接口,如果实现了则把ApplicationContext中的loadTimeWeaver回调setLoadTimeWeaver方法设置给该Bean。添加一些单例bean到单例池
提供给AbstractApplicationContext
的子类进行扩展,具体的子类,可以继续向BeanFactory中再添加一些东西
执行BeanFactoryPostProcessor
BeanPostProcessor
表示Bean
的后置处理器,在bean完成创建后,是用来对Bean进行加工的;
BeanFactoryPostProcessor
理解为BeanFactory
的后置处理器,用来对BeanFactory进行加工的,可以拿到beanDefinition,修改它,或者再往beanFactory里面注册beanDefinition(实现接口BeanDefinitionRegistryPostProcessor 才能进行注册)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。