首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

Spring IOC核心源码学习(1)(转)

2012-06-28 
Spring IOC核心源码学习(一)(转)以下内容为:http://singleant.iteye.com/blog/1148937? ? ? ?public void

Spring IOC核心源码学习(一)(转)

以下内容为:http://singleant.iteye.com/blog/1148937


?


?


?

?Spring IOC核心源码学习(1)(转)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();}catch (BeansException ex) {// Destroy already created singletons to avoid dangling resources.beanFactory.destroySingletons();// Reset 'active' flag.cancelRefresh(ex);// Propagate exception to caller.throw ex;}}}

?以上的obtainFreshBeanFactory是很关键的一个方法,里面会调用loadBeanDefinition方法,如下:

?Spring IOC核心源码学习(1)(转)protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws IOException {// Create a new XmlBeanDefinitionReader for the given BeanFactory.XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);// Configure the bean definition reader with this context's// resource loading environment.beanDefinitionReader.setResourceLoader(this);beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));// Allow a subclass to provide custom initialization of the reader,// then proceed with actually loading the bean definitions.initBeanDefinitionReader(beanDefinitionReader);loadBeanDefinitions(beanDefinitionReader);}

?LoadBeanDifinition方法很关键,这里特定于整个IOC容器,实例化了一个XmlBeanDefinitionReader来解析Resource文件。关于Resource文件如何初始化和xml文件如何解析都在

?Spring IOC核心源码学习(1)(转)loadBeanDefinitions(beanDefinitionReader);

?里面的层层调用完成,这里不在累述。

Spring 的扩展性是毋庸置疑的,学习 spring 的设计是一个很好的实践理论结合。主要个人觉得有几点:

1.? 框架顶层的设计有着很好的抽象,遵循面向接口编程的规范。 Resource 、 BeanFactory 、 ApplicationContext 都是非常好的接口抽象,非常明确的定义了该组件的一些功能。

2.? 利用组合模式。

3.? 个组件的实现里大量使用了模板方法模式,提升了同一组件代码的复用性。

4.? 各种设计保留了扩展的接口,很多基于 spring 的框架都可以很容易的介入实现了自己的一些扩展。

5.? 框架里采用里很多经典的设计模式,如代理、装饰、策略等等。

热点排行