博客
关于我
2-Spring IoC实现之DefaultListableBeanFactory(Spring Boot2)
阅读量:320 次
发布时间:2019-03-04

本文共 3260 字,大约阅读时间需要 10 分钟。

Spring IoC作用是管理Bean的生命周期并提供用户使用bean,所以我们有必要来看看Spring如何管理这些Bean的,前面我们提到IoC基本功能由BeanFactory系列类型实现,BeanFactory系列中就是DefaultListableBeanFactory这个类型完成的IoC基本功能。先来看下继承体系:

我们需要理解的是,Spring在启动时,整个流程是怎样的。从大体流程上,我们应该可以预料到,肯定是ApplicationContext方法先被调用,然后才是BeanFactory方法被调用,但是主要操作上肯定是先BeanFactory操作,再是ApplicationContext。也就是说ApplicationContext是入口,他肯定会调用BeanFactory进行操作的。下面我们来看看具体主要流程。

我们知道ApplicationContext在context包中的唯一子接口是ConfigurableApplicationContext,这个接口中有一个方法

/** * Load or refresh the persistent representation of the configuration, * which might an XML file, properties file, or relational database schema. * 

As this is a startup method, it should destroy already created singletons * if it fails, to avoid dangling resources. In other words, after invocation * of that method, either all or no singletons at all should be instantiated. * @throws BeansException if the bean factory could not be initialized * @throws IllegalStateException if already initialized and multiple refresh * attempts are not supported */void refresh() throws BeansException, IllegalStateException;

上面的注释翻一下来的意思是,加载或刷新持久化的配置描述,这个描述可以是一个xml文件,properties文件或者相关的数据库模式。他作为一个启动方法,在失败时他必须销毁已经创建的单例beans,以防资源被挂起。换句话说,这个方法被调用后,要么全部的单例被创建要么一个也不被创建。这个注释应该是比较片面的,我们只能获取到一部分信息。只要知道他是启动方法就行了。

AbstractApplicationContext是实现ConfigurableApplicationContext的抽象类,里面实现了refresh()方法,所有其他实现了ApplicationContext接口的实现类型都会调用这个方法来启动一个IoC容器,并且我们知道,AbstractApplicationContext没有持有DefaultListableBeanFactory成员变量,我们来看看这个方法,AbstractApplicationContext#refresh()

@Overridepublic 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();		}		catch (BeansException ex) {			if (logger.isWarnEnabled()) {				logger.warn("Exception encountered during context initialization - " +						"cancelling refresh attempt: " + ex);			}			// Destroy already created singletons to avoid dangling resources.			destroyBeans();			// Reset 'active' flag.			cancelRefresh(ex);			// Propagate exception to caller.			throw ex;		}		finally {			// Reset common introspection caches in Spring's core, since we			// might not ever need metadata for singleton beans anymore...			resetCommonCaches();		}	}}

 

转载地址:http://mvzh.baihongyu.com/

你可能感兴趣的文章
C++中找资源或者函数的方法
查看>>
一些留给自己的思考题(只求回过头来能够有所获)
查看>>
SQL函数返回表的写法
查看>>
delete对象时会自动调用类的析构函数
查看>>
C++ 子类对象直接赋值给父类对象可行,反过来不行
查看>>
WMWare下安装centOS7,并使用xshell进行连接记录.
查看>>
linux下同一个动态库名为何辣么多的.so文件
查看>>
SQL联表的方式(逗号, Left Join, Right Join)
查看>>
牛客网输入输出举例
查看>>
字符串初始化时的注意点
查看>>
dll路径加载顺序
查看>>
悬垂指针和野指针的区别
查看>>
软考相关试题
查看>>
顺序表的操作
查看>>
常量表达式
查看>>
POD类型
查看>>
安装HDF5及在VS下配置HDF5
查看>>
const与常量,傻傻分不清楚~
查看>>
图解哈希表及其原理
查看>>
Head First设计模式——迭代器模式
查看>>