`
jakoes
  • 浏览: 69013 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

spring源码分析-浅淡工厂模式的应用

阅读更多
一谈到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;
		}
	}
  • 大小: 12.3 KB
分享到:
评论
13 楼 flyaaabc 2011-04-02  
太浅了,看不出要说什么
12 楼 zhaozengfengw 2010-12-29  
只是工场模式一个实现而已,楼主只是说明了这点,我看明白了  应该是这意思
11 楼 chris_zley 2010-07-12  
只是工场模式一个实现而已,楼主只是说明了这点,我看明白了
10 楼 accphc 2010-07-12  
不懂你在说的
9 楼 iq527 2010-07-12  

工厂 + 单例 - -?
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>
7 楼 KuhYygy 2010-07-11  
正在学习ing
6 楼 caoyangx 2010-07-11  
好多人都分析过,更多的人都在浅谈。
5 楼 jakoes 2010-07-10  
大家真的不知道我在说什么吗,可能是我的文字表达能力太差。也可能是我说的过于简单。
最近在读spring源码,把里面的一些感想,尤其是spring里用到的设计模式跟大家共享,希望能起到抛砖引玉的效果。标题中的“浅谈”就是这个意思。哈哈
以后我会在文字逻辑上多下点功能,也希望各位多多提意见 ~~~~
4 楼 Shirak 2010-07-10  
分析在哪里
3 楼 whaosoft 2010-07-10  
ls的真笨 lz 那意思 他叫你自己去想去 就像我给你写个接口是的 自己去实现
lz同样说个标题内容自己去想么 呵呵
2 楼 luorongda 2010-07-10  
修改一下.
没看懂.
1 楼 creasure 2010-07-09  
没看明白你想说明什么。简单贴下代码而已

相关推荐

    最新版源码 spring-framework-5.3.10.zip

    最新版源码 spring-framework-5.3.10.zip最新版源码 spring-framework-5.3.10.zip

    AOP流程源码分析-SpringAOP中定义的类图

    AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析...

    官方原版源码spring-framework-5.1.4.RELEASE.zip

    首先,源码分析从`spring-framework-5.1.4.RELEASE-dist.zip`开始,这是Spring框架的基础组件包,包含了所有核心模块的类库和配置文件。主要模块有Core Container(核心容器)、Data Access/Integration(数据访问与...

    Spring源码编译缺少的两个包:spring-cglib-repack-3.2.0.jar和spring-objenesis-repack-2.2.jar

    在本案例中,"Spring源码编译缺少的两个包:spring-cglib-repack-3.2.0.jar和spring-objenesis-repack-2.2.jar"揭示了这两个关键的库对于Spring源码编译是必不可少的。下面将详细讲解这两个库的作用及其在Spring中的...

    spring-security-web源码所需jar包

    1. **spring-context-3.1.2.RELEASE.jar**:提供Spring的IoC(Inversion of Control)容器和AOP(Aspect Oriented Programming)支持,这是Spring框架的基础,为Spring Security提供了配置和事件处理能力。...

    spring源码阅读所需jar spring-cglib-repack-3.2.8.jar 和spring-objenesis-repack-2.6.jar

    Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单...

    spring-framework-master

    通过阅读和分析"spring-framework-master",开发者可以深入理解Spring的工作机制,提升自己的编程技巧,同时也可以根据需求自定义扩展,使Spring更好地服务于项目需求。这不仅对于Java开发者,对于所有希望深入学习...

    spring源码spring-framework-4.3.2.RELEASE

    4.3.2.RELEASE是Spring的一个稳定版本,它包含了许多重要的改进和优化,深入理解其源码对于提升开发技能和优化应用性能具有重要意义。 一、核心模块解析 1. **IoC(Inversion of Control)容器**:Spring的核心...

    spring-cglib-repack-3.2.5.jar和spring-objenesis-repack-2.6.jar

    标题中的"spring-cglib-repack-3.2.5.jar"和"spring-objenesis-repack-2.6.jar"是两个与Spring框架相关的库文件,它们主要用于Spring框架的内部实现,尤其是针对Java对象的创建和代理机制。下面将详细解释这两个库的...

    官方源码 spring-framework-5.3.4.zip

    通过分析源码,我们可以更好地理解其设计模式、工作原理以及如何优化自己的代码。 1. **模块结构** Spring Framework 5.3.4包含多个核心模块,如Core Container(核心容器)、Data Access/Integration(数据访问/...

    spring-data-redis-1.8.1.RELEASE-sources.jar(源码)

    spring-data-redis-1.8.1.RELEASE-sources.jar(spring-data-redis-1.8.1.RELEASE-sources.jar()

    官方源码 spring-framework-5.2.15.RELEASE.zip

    Web-Servlet提供了Spring MVC框架,实现了模型-视图-控制器的设计模式,提高了Web应用的开发效率。 5. **AOP模块** 面向切面编程(AOP)允许开发者定义“横切关注点”,如日志、事务管理等,将它们与业务逻辑分离...

    官方原版源码spring-framework-4.3.25.RELEASE.zip

    - **spring-framework-4.3.25.RELEASE-dist.zip**:包含Spring Framework的基础库和核心模块,如core-container、beans、context、expression-language等,这些模块是Spring框架的基础,提供了DI、AOP、事件处理等...

    官方原版源码spring-framework-5.2.3.RELEASE.zip

    在这个包中,我们能找到`spring-context`, `spring-core`, `spring-web`, `spring-aop`等模块,每个模块都对应着Spring框架的一个特定部分,例如`spring-context`是Spring应用上下文,负责环境配置和bean的生命周期...

    spring高版本源码分析缺lib spring-cglib-repack-3.2.4.jar和spring-objenesis-repack-2.4.jar

    在Spring框架的高版本源码分析过程中,可能会遇到缺少特定库的情况,比如"spring-cglib-repack-3.2.4.jar"和"spring-objenesis-repack-2.4.jar"这两个文件。这些文件是Spring框架运行时的重要组成部分,对于理解和...

    Spring 源码分析文档----自用

    本文主要基于Spring 5源码分析(第2版),详细介绍在Spring框架中常见的几种设计模式及其应用场景。 #### 二、设计模式概述 设计模式是一种在特定上下文中解决常见设计问题的方法论。在软件工程中,设计模式不仅...

    官方源码spring-framework-5.0.15.RELEASE.zip

    本篇将围绕官方源码spring-framework-5.0.15.RELEASE,对其中的关键知识点进行深入探讨。 一、Spring Framework概述 Spring Framework是基于IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented ...

    官方原版源码spring-framework-5.1.6.RELEASE.zip

    6. **文档与规范**:`spring-framework-5.1.6.RELEASE-docs.zip`包含完整的API文档和开发者指南,对于学习源码有着极大的辅助作用。而`spring-framework-5.1.6.RELEASE-schema.zip`则包含了Spring配置文件的XML ...

    spring导入eclipse时少的spring-cglib-repack-3.2.4.jar和spring-objenesis-repack-2.4.jar

    然而,有时候在导入Spring项目时,可能会遇到一些问题,例如标题中提到的"spring-cglib-repack-3.2.4.jar"和"spring-objenesis-repack-2.4.jar"这两个jar包的缺失。这些jar包对于Spring框架的正常运行至关重要,因为...

    spring源码spring-framework-4.2.5.RELEASE

    深入理解Spring源码需要对Java反射、动态代理、设计模式等有扎实的基础。建议从以下几个步骤入手: 1. 了解基本架构和模块划分。 2. 分析核心类如ApplicationContext、BeanFactory和DispatcherServlet的实现。 3. ...

Global site tag (gtag.js) - Google Analytics