创建BeanFactory -- DefaultListableBeanFactory
注册,然后setXXX
addBeanDefinitionXXX ---> 存放到 BeanFactoy中
addBeanPostProcessor.
public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
this();
register(componentClasses);
refresh();
}
调用构造,注册实例,刷新容器。
- 准备刷新 prepareRefresh();
可以记录启动时间,允许子类添加内容到容器里面 - 构建BeanFactory 做初始化操作
- 构建BeanFactoryProcessor
- onRefresh方法 空实现
- 完成刷新,完成初始化,然后发送初始化完成推送
BeanFactory对象
调用无参构造,创建一个DefaultListableBeanFactory.
构建BeanFactory对象(DefaultListableBeanFactory)解析后得到BeanDefinition,注册到BeanFactory中。
解析@ComponentScan,Import,Bean注解 .
ApplicationContext需要支持国家化,事件机制,所以还需要初始化Msg,ApplicationEventMulCa. ApplicationListener对象添加到ApplicationContext中,启动完毕后发布事件.
- Multicaster,Event,国际化资源
protected void registerListeners() {
// Register statically specified listeners first.
for (ApplicationListener<?> listener : getApplicationListeners()) {
getApplicationEventMulticaster().addApplicationListener(listener);
}
// Do not initialize FactoryBeans here: We need to leave all regular beans
// uninitialized to let post-processors apply to them!
String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
for (String listenerBeanName : listenerBeanNames) {
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
}
// Publish early application events now that we finally have a multicaster...
Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
this.earlyApplicationEvents = null;
if (!CollectionUtils.isEmpty(earlyEventsToProcess)) {
for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
getApplicationEventMulticaster().multicastEvent(earlyEvent);
}
}
}
// Publish the final event.
publishEvent(new ContextRefreshedEvent(this));
发布了ContextRefreshedEvent事件。
- CommonAnnotationBeanPostProcessor
处理@Resource,@PostConstruct @PreDestory 注解 - AutowiredAnnotationBeanPostProcessor
处理@AutoWired,@Value注解 - ApplicationContextAwareProcessor
处理ApplicationContextAware回调
BeanFactoryPostProcessor
两个相近的接口
public class BeanFacPro implements BeanFactoryPostProcessor, BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
BeanDefinition beanDefinition = beanFactory.getBeanDefinition("");
beanFactory.registerSingleton("a",beanDefinition);
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
registry.registerBeanDefinition("",new RootBeanDefinition("value"));
}
}
该步骤发生在生成了BeanDefinition,但是单例Bean没有创建出来的时机,所以修改BeanDefinition会生效.
refresh
加载配置的资源,要么全部成功,要么失败后全部销毁
Lifecycle
SmartLifecycle可以监听ApplicationContext的启动和关闭
网友评论