Spring源码
Spring的执行流程:
beanDefinitionReader是一个简单的接口,是用于读取Spring配置文件的内容,并转换为BeanDefinition。
- PropertiesBeanDefinitionReader:是一个具体实现类,可以从properties文件读取Bean定义信息。 - XmlBeanDefinitionReader:具体实现类,可以从XML文件读取Bean定义信息。
BeanDefinition:存储bean的信息,
beanfactoryPostProcessor: 加载配置文件的时候不会进行值的替换,这时需要调用BeanFactory的后置处理器做一些字符替换
map结构存储bean
beanFactory:定义获取bean及bean的各种属性,提供访问bean容器的入口。(等同于容器,操作beanfactory等于操作容器)
Spring核心源码(包含13个方法):
@Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // 准备此上下文以进行刷新。 //设置容器创建时间,和一些空集合 prepareRefresh(); // 告诉子类刷新内部 bean 工厂。 //先创建beanFactory (DefaultListableBeanFactory beanFactory = createBeanFactory();) //调用loadBeanDefinitions(beanFactory);使用BeanDefinitionReader读取配置文件 //从配置文件加载bean的定义信息封装成一个集合,保存到BeanDefinition中 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // 准备在此上下文中使用的bean工厂 //(此时容器中除了一些bean信息,然后是空的)所以要给bean工厂设置一些属性值 prepareBeanFactory(beanFactory); try { // 允许在上下文子类中对bean工厂进行后处理。 //空,留给子类扩展使用 postProcessBeanFactory(beanFactory); // 调用在上下文中注册为bean的工厂处理器。 //实例化并调用所有已注册的 BeanFactoryPostProcessor //( 准备工作:准备beanPostProcessor,准备监听器事件,广播器) invokeBeanFactoryPostProcessors(beanFactory); //实例化并注册所有 BeanPostProcessor bean,如果给定 //则尊重显式顺序。 <p>必须在应用程序 bean 的任何实例化之前调用 //注册拦截bean创建的bean处理器 1.registerBeanPostProcessors(beanFactory); // 为此上下文初始化消息源。 //国际化的一些操作 2.initMessageSource(); // 为此上下文初始化事件多播器 3.initApplicationEventMulticaster(); // 初始化特定上下文子类中的其他特殊 bean。 //空 4.onRefresh(); //检查侦听器 bean 并注册它们。 5.registerListeners(); 1-5 实例化前的准备工作 //实例化所有剩余的(非惰性初始化)单例。 finishBeanFactoryInitialization(beanFactory); (doCreateBean:通过反射创建对象 constructor=class.getDeclaredConstructor(), constructor.newinstance() 此时的bean实例属性值为空) // 最后一步:发布相应的事件 finishRefresh(); } catch (BeansException ex) { if (logger.isWarnEnabled()) { logger.warn("Exception encountered during context initialization - " + "cancelling refresh attempt: " + ex); } // 销毁已经创建的单例以避免悬空资源 destroyBeans(); // 重置“活动”标志。 cancelRefresh(ex); // Propagate exception to caller. throw ex; } finally { //重置 Spring 核心中的常见自省缓存,因为我们可能不再需要单例 bean 的元数据...... resetCommonCaches(); } } }
Spring加载配置文件到应用程序:调用loadBeanDefinitions(beanFactory);使用BeanDefinitionReader读取配置文件
解析工作(解析bean标签的各种其他属性,解析构造函数参数,解析property元素等)
bean的生命周期
spring容器按照使用者可以分为几类:
1.自定义对象
2.容器对象
如果想要在自定义对象中获取容器对象,则需要实现BeanFactoryAware, ApplicationContextAware接口
容器调用invokeAware方法,调用aware接口处理器的一些方法实现注入.
aware接口:
ApplicationContextAware:
BeanFactoryAware:
BeanPostProcessor:处理器 主要实现 aop(动态代理)
前置处理器
后置处理器
容器和对象的创建流程: • 1.先创建容器(创建容器之前调用prepareRefresh()方法做一些准备工作(设置容器的启动时间,设置活跃状态为true,关闭状态为false和创建一堆空集合)) • 2.加载配置文件,封装成BeanDinition • 3.调用执行beanFactoryPostProcessor ( 准备工作:准备beanPostProcessor,准备监听器事件,广播器) • 4.实例化 • 5.初始化 • 6.获取完整对象
- 海报