spring源码分析-浅淡工场模式的应用
spring源码分析-浅淡工厂模式的应用
一谈到spring,它可是集设计之大成,今天我们来浅谈一下spring中的工厂模式。第一次写关于设计模式的文章,如有纰漏,还请指正。
当然这只是冰山之一角。各位如果觉得太简单,只当路过而已
。
我们都知道工厂模式是GOF23中设计模式之一,属于创建模式的一种。
而工厂模式又细分为工厂方法和抽象工厂。
简单的来说,工厂方法直接在工厂里返回所需求的实例。针对只创建一种“产品”时使用。
而抽象方法则是用在创建多个“产品”的情况下,把创建“产品”的过程延迟到了子类中,只留下了一个抽象的创建方法。
下面我们来看一下spring中ApplicationContext及子类的对于工厂方法的使用。
我们先来看一看ClassPathXmlApplicationContext的继承结构:

在抽象类AbstractRefreshableApplicationContext中有getBeanFactory()的定义
当然,此方法是其实现的接口ConfigurableApplicationContext中的一个方法。如下:
我们来看看ConfigurableApplicationContext 的定义
而getBeanFactory()方法却在AbstractRefreshableApplicationContext类中被大量的使用了,随便举一二例:
又如:
而直到其子类AbstractRefreshableApplicationContext中,才得以实现:
工厂 + 单例 - -?
一谈到spring,它可是集设计之大成,今天我们来浅谈一下spring中的工厂模式。第一次写关于设计模式的文章,如有纰漏,还请指正。
当然这只是冰山之一角。各位如果觉得太简单,只当路过而已
我们都知道工厂模式是GOF23中设计模式之一,属于创建模式的一种。
而工厂模式又细分为工厂方法和抽象工厂。
简单的来说,工厂方法直接在工厂里返回所需求的实例。针对只创建一种“产品”时使用。
而抽象方法则是用在创建多个“产品”的情况下,把创建“产品”的过程延迟到了子类中,只留下了一个抽象的创建方法。
下面我们来看一下spring中ApplicationContext及子类的对于工厂方法的使用。
我们先来看一看ClassPathXmlApplicationContext的继承结构:
在抽象类AbstractRefreshableApplicationContext中有getBeanFactory()的定义
/** * Subclasses must return their internal bean factory here. They should implement the * lookup efficiently, so that it can be called repeatedly without a performance penalty. * <p>Note: Subclasses should check whether the context is still active before * returning the internal bean factory. The internal factory should generally be * considered unavailable once the context has been closed. * @return this application context's internal bean factory (never <code>null</code>) * @throws IllegalStateException if the context does not hold an internal bean factory yet * (usually if {@link #refresh()} has never been called) or if the context has been * closed already * @see #refreshBeanFactory() * @see #closeBeanFactory() */ public abstract ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;
当然,此方法是其实现的接口ConfigurableApplicationContext中的一个方法。如下:
public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext, DisposableBean { ... }
我们来看看ConfigurableApplicationContext 的定义
public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle { ... ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException; }
而getBeanFactory()方法却在AbstractRefreshableApplicationContext类中被大量的使用了,随便举一二例:
protected void initMessageSource() { ConfigurableListableBeanFactory beanFactory = getBeanFactory(); if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) { ... }
又如:
protected void initLifecycleProcessor() { ConfigurableListableBeanFactory beanFactory = getBeanFactory(); if (beanFactory.containsLocalBean(LIFECYCLE_PROCESSOR_BEAN_NAME)) { ... }
而直到其子类AbstractRefreshableApplicationContext中,才得以实现:
@Override public final ConfigurableListableBeanFactory getBeanFactory() { synchronized (this.beanFactoryMonitor) { if (this.beanFactory == null) { throw new IllegalStateException("BeanFactory not initialized or already closed - " + "call 'refresh' before accessing beans via the ApplicationContext"); } return this.beanFactory; } }
1 楼
creasure
2010-07-09
没看明白你想说明什么。简单贴下代码而已
2 楼
luorongda
2010-07-10
修改一下.
没看懂.
没看懂.
3 楼
whaosoft
2010-07-10
ls的真笨 lz 那意思 他叫你自己去想去 就像我给你写个接口是的 自己去实现
lz同样说个标题内容自己去想么 呵呵
lz同样说个标题内容自己去想么 呵呵
4 楼
Shirak
2010-07-10
分析在哪里
5 楼
jakoes
2010-07-10
大家真的不知道我在说什么吗,可能是我的文字表达能力太差。也可能是我说的过于简单。
最近在读spring源码,把里面的一些感想,尤其是spring里用到的设计模式跟大家共享,希望能起到抛砖引玉的效果。标题中的“浅谈”就是这个意思。哈哈
以后我会在文字逻辑上多下点功能,也希望各位多多提意见 ~~~~
最近在读spring源码,把里面的一些感想,尤其是spring里用到的设计模式跟大家共享,希望能起到抛砖引玉的效果。标题中的“浅谈”就是这个意思。哈哈
以后我会在文字逻辑上多下点功能,也希望各位多多提意见 ~~~~
6 楼
caoyangx
2010-07-11
好多人都分析过,更多的人都在浅谈。
7 楼
KuhYygy
2010-07-11
正在学习ing
8 楼
chinpom
2010-07-11
<div class="quote_title">jakoes 写道</div>
<div class="quote_div">大家真的不知道我在说什么吗,可能是我的文字表达能力太差。也可能是我说的过于简单。<br>最近在读spring源码,把里面的一些感想,尤其是spring里用到的设计模式跟大家共享,希望能起到抛砖引玉的效果。标题中的“浅谈”就是这个意思。哈哈<br>以后我会在文字逻辑上多下点功能,也希望各位多多提意见 ~~~~</div>
<p>JavaEye 上关于 Spring 源代码分析是比较多了,甚至还有一个专栏呢。不过,看了楼主的分析还是有些许收获的,所以我点了“良好贴”。</p>
<p> </p>
<p>但是我个人比较期待的,关于 Spring 的接口和类的命名分析却没有。比如像 ConfigurableApplicationContext 这个接口的命名,就字面意义上是不难理解,但是其中的 Configurable 这个单词在整个 Spring 的上下文命名体系中有什么规范的含义呢;类似的还有 AbstractRefreshableApplicationContext 中的 Refreshable;再比如 <span><span>ConfigurableListableBeanFactory </span></span>中的 <span><span>Listable,它表示了这种类型的 </span></span><span><span>BeanFactory 有什么额外的功能呢?</span></span></p>
<p> </p>
<p>所以,我期待以后能在楼主的关于 Spring 源代码分析的帖子中看到这方面的内容,而且我觉得对于框架源代码的初学者,先了解这些内容比先去弄懂各种复杂的继承和实现机制更为重要! <img src="/images/smiles/icon_wink.gif" alt=""></p>
<div class="quote_div">大家真的不知道我在说什么吗,可能是我的文字表达能力太差。也可能是我说的过于简单。<br>最近在读spring源码,把里面的一些感想,尤其是spring里用到的设计模式跟大家共享,希望能起到抛砖引玉的效果。标题中的“浅谈”就是这个意思。哈哈<br>以后我会在文字逻辑上多下点功能,也希望各位多多提意见 ~~~~</div>
<p>JavaEye 上关于 Spring 源代码分析是比较多了,甚至还有一个专栏呢。不过,看了楼主的分析还是有些许收获的,所以我点了“良好贴”。</p>
<p> </p>
<p>但是我个人比较期待的,关于 Spring 的接口和类的命名分析却没有。比如像 ConfigurableApplicationContext 这个接口的命名,就字面意义上是不难理解,但是其中的 Configurable 这个单词在整个 Spring 的上下文命名体系中有什么规范的含义呢;类似的还有 AbstractRefreshableApplicationContext 中的 Refreshable;再比如 <span><span>ConfigurableListableBeanFactory </span></span>中的 <span><span>Listable,它表示了这种类型的 </span></span><span><span>BeanFactory 有什么额外的功能呢?</span></span></p>
<p> </p>
<p>所以,我期待以后能在楼主的关于 Spring 源代码分析的帖子中看到这方面的内容,而且我觉得对于框架源代码的初学者,先了解这些内容比先去弄懂各种复杂的继承和实现机制更为重要! <img src="/images/smiles/icon_wink.gif" alt=""></p>
9 楼
iq527
2010-07-12
工厂 + 单例 - -?
10 楼
accphc
2010-07-12
不懂你在说的
11 楼
chris_zley
2010-07-12
只是工场模式一个实现而已,楼主只是说明了这点,我看明白了
12 楼
zhaozengfengw
2010-12-29
只是工场模式一个实现而已,楼主只是说明了这点,我看明白了 应该是这意思
13 楼
flyaaabc
2011-04-02
太浅了,看不出要说什么