spring 底层简单分析(一)
spring通过IOC和DI进行bean的依赖和管理,其中spring具体结构如下:
其中core container是spring的核心内容包括:
core:为spring提供uitl的支持协助context、bean进行spring管理。
contex:为bean提供spring的环境、提供bean的各种信息。
bean:spring 核心组件中的核心组件,为spring提供Bean,相当于OOP中的Ojbcet。
通过实例理解spring加载过程:
通过ApplicationContext去访问bean.xml文件,其中ApplicationContext结构如下:
①加载bean.xml文件:
食用spring.context下的ApplicationContext,接口继承了不同的加载方式接口EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,MessageSource, ApplicationEventPublisher, ResourcePatternResolver。
ListableBeanFactory:访问应用程序组件的Bean factory方法。从org.springframework.beans.factory.ListableBeanFactory继承。ResourcePatternResolver:以通用方式加载文件资源的能力。从org.springframework.core.io继承。ResourceLoader接口。
ApplicationEventPublisher:向已注册的侦听器发布事件的能力。继承自ApplicationEventPublisher接口。
MessageSource:能够解析消息,支持国际化。从MessageSource接口继承。
ApplicationContext接口继承了BeanFactory接口,spring容器的创建和管理都是通过这个接口来实现的。进一步访问源码可知:
public ClassPathXmlApplicationContext(
String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
throws BeansException {
super(parent);
setConfigLocations(configLocations);
if (refresh) {
refresh();
}
}
其中refresh():是否自动刷新下,加载所有bean定义和创建单例对象-一步一步的启动容器工作:
// 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);
通过ConfigurableListableBeanFactory的getBeanFactory()获取工厂:
这里在ConfigurableListableBeanFactory:继承自ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory这三个接口,间接继承了BeanFactory接口提供了创建bean的三种方式:①以list的形式读取所有的bean,②自动连接bean工厂实现、③配置的方式创建bean
// 在应用程序上下文的标准初始化之后修改其内部bean工厂.
postProcessBeanFactory(beanFactory);
// 注册为bean的工厂处理器.
invokeBeanFactoryPostProcessors(beanFactory);
// 注册bean.
registerBeanPostProcessors(beanFactory);
//初始化此上下文的消息源。
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();
获取Bean:
从AbstractApplicationContext中访问上下文环境,DefaultResourceLoader的getBean(name, requiredType)方法获取bean,AbstractBeanFactory的getBean(String name, @Nullable Class<T> requiredType)方法访问bean。进一步通过doGetBean(name, requiredType, null, false)方法获取bean,通过doGetBean的getSingleton(beanName)返回在给定名称**册的单例对象。进一步来自于DefaultSingletonBeanRegistry下的getSingleton(beanName, true)。来自于DefaultSingletonBeanRegistry下的this.singletonObjects.get(beanName)返回注册的bean实例。整个bean获取过程结束.
此过程为基于xml的spring过程,基于注解的spring只是读取环境不同而已。