Spring是什么?
Spring发展至今,已经不是简单的Spring Framework,它包括Spring Data、Spring Boot、Spring Cloud等等组成
不过这里咱们仅讨论Spring Framework,重点讨论Spring的启动过程及拓展应用java
web.xml配置web
refresh()
删减了一些可有可无的代码spring
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory)
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
}
}
}
复制代码
容器refresh预准备工做 AbstractApplicationContextsession
initPropertySources() AbstractApplicationContext子类自定义属性设置的方法app
getEnvironment().validateRequiredProperties() 校验设置属性ide
this.earlyApplicationEvents = new LinkedHashSet<>() 保存容器早期的事件post
获取工厂测试
refreshBeanFactory执行完进入getBeanFactory()
直接返回改beanFactory 方法结束ui
在工厂设置类加载器、表达式解析器this
给工厂添加ApplicationContextAwareProcessor(processor先不解释有什么意思 后续会说明)
设置须要忽略的自动装配的接口(EnvironmentAware、ApplicationContextAware等Aware)
给工厂添加 beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this))
接着上面方法
BeanFactory准备工做完成后 后置处理
空方法 子类自定义属性设置的方法 这里web环境 用的工厂是AbstractRefreshableWebApplicationContext
记住这里只是web端拓展才有的实现
WebApplicationContextUtils.registerWebApplicationScopes(beanFactory, this.servletContext)
spring自己只有singleton和prototype两个,web环境加上了request、session、globalSession
这里没仔细看
先获取全部的BeanDefinitionRegistryPostProcessor
依次执行实现了PriorityOrdered、Ordered接口和没有实现它们的 processor postProcessor.postProcessBeanDefinitionRegistry(registry)
在这里我debug发现 spring内部有一个ConfigurationClassPostProcessor
它的做用是负责解析处理全部@Configuration标签类,并将Bean定义(包括其它processor)注册到BeanFactory中。
这里注册完以后 再次获取全部BeanDefinitionRegistryPostProcessor,按顺序执行 invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry)
重点:其它的BeanDefinitionRegistryPostProcessor就是Spring提供给咱们注册bean的通道
再执行postProcessor.postProcessBeanFactory(beanFactory)
获取全部的BeanFactoryPostProcessor
分类执行 执行过的再也不执行
实践出真知 这里是用SpringBoot简单搭起的一个demo,跟上面不同,不过不影响测试结果
注册Bean的后置处理器(跟上面的FactoryPostProcessor不同)
Bean的生命周期: Bean建立--初始化--销毁
不一样BeanPostProcessor功能都不同
BeanPostProcessor的实现子接口:
DestructionAwareBeanPostProcessor InstantiationAwareBeanPostProcessor MergedBeanDefinitionPostProcessor SmartInstantiationAwareBeanPostProcessor
BeanPostProcessor
初始化MessageSource组件(作国际化、消息绑定、消息解析)
有->this.applicationEventMulticaster beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class)
没有->new DelegatingMessageSource() 注册一个MessageSource组件
beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource)
初始化事件派发器
有->this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class)
没有->new SimpleApplicationEventMulticaster() beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster)
这个派发器在后续颇有用
子类自定义的方法 web环境下直接进入一个空方法
还不肯定什么环境下会有执行 欢迎联系交流~
较为复杂,单独做为一篇