spring源码
2021-10-25 08:48:33 0 举报
spring源码解析
作者其他创作
大纲/内容
7. initMessageSource();
// 1. 父类GenericApplicationContext的无参构造中创创建beanFactorybeanFactory = new DefaultListableBeanFactory()
2. 注册传入的Class为BeanDefintion,到此处,spring就已经为我们注册了6-7个BeanDefintion,6个框架自带的和1个入参传入的入参传入的就是自己写的Class, 通常加了@Configuration注解的,不加@Configuration也会注册成为Bean,但是有区别
6. registerBanPostProcessors(beanFactory);
8. 如果有loadTimeWeaver这个bean存在,则添加LoadTimeWeaverAwareProcessor 就是调用setLoadTimeWeaver()方法,但是不知道这个是干嘛的
beanName: o.s.c.a.internalConfigurationAnnotationProcessorbeanClass: ConfigurationClassPostProcessor (BDRPP)span style=\"font-size: inherit;\
1. 设置BeanClassLoader2. 设置Bean的SPEL表达式解析器: StandardBeanExpressionResolver3. 增加ResourceEditorRegistrar, 暂时不知道用来做什么的?
4. postProcessBeanFactory(beanFactory);// 是一个空方法,留给子类重写,AnnotationConfigApplicationContext没有重写该方法// GenericWebApplicationContext重写了该方法,在web环境中在分析
ApplicationListenerDetector该BPP用于处理spring事件,具体处理逻辑后面分析
将所有的BeanDefinition构建成bean,放入单例池中
refresh()
10. registerListeners();
beanName: o.s.c.a.internalPersistenceAnnotationProcessorbeanClass: PersistenceAnnotationBeanPostProcessor (BPP)如果启用了JPA才会注册这个Bean, spring通过反射加装该类,如果能加装到,则会注册是一个InstantiationAwareBPP(BPP)
第6步:registerBeanPostProcessors
5. invokeBeanFactoryPostProcessors(beanFactory);// 最重要的步骤!!这一步主要就是使用ConfigurationClassPostProcessor来解析注册BeanDefintion
new AnnotationConfigApplicationContext(Class)
12. finishRefresh();
beanClass: PersistenceAnnotationBeanPostProcessor (BPP可选)beanName: o.s.c.a.internalPersistenceAnnotationProcessor如果启用了JPA才会注册这个Bean, spring通过反射加装该类,如果能加装到,则会注册是一个InstantiationAwareBPP(BPP)
调用add方法直接放入
8. initApplicationEventMulticaster();
AbstractBeanFactory.beanPostPocessors(是一个BPP的List容器):BeanPostProcessor是一个Spring中的一个重要的扩展点放入该容器中的后置处理器有两种方式:1. 直接调用addBeanPostProcessor()方法将new出来的BPP对象放入该集合中 直接放入的BPP是不会注册BeanDefinition的,也就不会生成单例bean2. 将BPP注册成BeanDefinition,在第6步时实例化这些BeanDefinition然后放入
beanClass: DefaultEventListenerFactorybeanName: o.s.c.e.internalEventListenerFactory和EventListenerMethodProcessor一样,处理spring事件
// 无参构造中初始化reader和scannerreader = new AnnotatedBeanDefinitionReader(this)scanner = new ClassPathBeanDefintionScanner(this)
beanName: o.s.c.a.internalCommonAnnotationProcessorbeanClass: CommonAnnotationBeanPostProcessor (BPP)处理@Resource注解
以上6个类是spring最先注册的6个Bean定义,在构造方法中注册的,也是整个Spring框架最原始的几个BeanDefinition
9. onRefresh();
1. prepareRefresh();
beanClass: AutowiredAnnotationBeanPostProcessor (BPP)beanName: o.s.c.a.internalAutowiredAnnotationProcessor处理@Autowired注解
new AnnotationApplicationContext()
3. 调用refresh()方法,在父类AbstractApplicationContext中refresh();该方法会完成spring容器的所有初始化工作, 总共包括13个大的步骤;核心源码都在这里面该方法的实现在其父类中: AbstractApplicationContext
1. 调用默认无参构造: this();
beanName: o.s.c.a.internalAutowiredAnnotationProcessorbeanClass: AutowiredAnnotationBeanPostProcessor (BPP)处理@Autowired注解
beanClass: CommonAnnotationBeanPostProcessor (BPP)beanName: o.s.c.a.internalCommonAnnotationProcessor处理@Resource注解
ApplicationContextAwareProcessor该BPP用于处理实现了XXXAware接口的Bean
7. 注册以下4种类型的属性注入可用对象:BeanFactory -- beanFactory (构造方法中new的DefaultListableBeanFactory)ResourceLoader -- thisApplicationEventPublisher -- thisApplicationContext -- this就是在bean里面可以直接注入这几类对象,比如:@AutowiredApplicationContext applicationContext;
13. resetCommonCaches();
4. 增加ApplictionListenerDetector(是一个BPP),直接将BPP放入到AbstractBeanFactory.beanPostProcessors中,而不是通过BeanDefintion构建出来的beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
new AnnotatedBeanDefinitionReader时会注册spring框架内置的几个类到beanDefinitionMap中:用于处理spring context初始化工作,包括BeanDefinition扫描注册,bean实例创建等,包括如下几个bean:AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry)1. 入参this.registry就是AnnotationConfigApplcationContext,实现了registry接口2. 给beanFactory(前面父类中创建的)设置比较器,用于给bean排序3. 注册的原始bean有如下几个:
11. finishBeanFactoryInitialization(beanFactory);实例化所有的非懒加载的bean
2. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
3. prepareBeanFactory(beanFactory);
收藏
收藏
0 条评论
下一页