二、Spring 通过注解加载bean
1.加载注解标注的类。MainConfig是通过注解注册在IOC容器中。
ApplicationContext context
= new AnnotationConfigApplicationContext(MainConfig
.class);
2. 注册到BeanDefinitionRegistry。
后续对MainConfig的注册处理都是由AnnotatedBeanDefinitionReader类进行处理。最终注册到BeanDefinitionRegistry的实现类DefaultListableBeanFactory中。
在doRegisterBean方法做四件事
1)、将bean封装为AnnotatedGenvericBeanDefinition对象。
2)、获取该bean的名称MainCofig。此时是将bean的全路径引入的,通过以点进行分割获取末尾的字符串就是bean的名称。
3)、判断设置bena的作用域,采用代理模式进行判断设置,默认是Singlne单例。
4)、注册DefaultListableBeanFactory容器中beanDefinitionMap和beanDefinitionNames,以beanName为key,封装的BeanDefinition对象为Value注册进beanDefinitionMap。将beanName放入beanDefinitionNames中。
3. 将DefaultListableBeanFactory中注册信息经过下面处理后放入到ConfigurableListableBeanFactory容器中。
this.postProcessBeanFactory(beanFactory
);
this.invokeBeanFactoryPostProcessors(beanFactory
);
this.registerBeanPostProcessors(beanFactory
);
this.initMessageSource();
this.initApplicationEventMulticaster();
this.onRefresh();
this.registerListeners();
this.finishBeanFactoryInitialization(beanFactory
);
this.finishRefresh();
总结 我们可以在下面阶段接入自己的业务逻辑
this.postProcessBeanFactory(beanFactory
);
this.invokeBeanFactoryPostProcessors(beanFactory
);
this.registerBeanPostProcessors(beanFactory
);