一谈到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
分享到:
相关推荐
最新版源码 spring-framework-5.3.10.zip最新版源码 spring-framework-5.3.10.zip
AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析...
首先,源码分析从`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中的...
1. **spring-context-3.1.2.RELEASE.jar**:提供Spring的IoC(Inversion of Control)容器和AOP(Aspect Oriented Programming)支持,这是Spring框架的基础,为Spring Security提供了配置和事件处理能力。...
Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单...
通过阅读和分析"spring-framework-master",开发者可以深入理解Spring的工作机制,提升自己的编程技巧,同时也可以根据需求自定义扩展,使Spring更好地服务于项目需求。这不仅对于Java开发者,对于所有希望深入学习...
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框架相关的库文件,它们主要用于Spring框架的内部实现,尤其是针对Java对象的创建和代理机制。下面将详细解释这两个库的...
通过分析源码,我们可以更好地理解其设计模式、工作原理以及如何优化自己的代码。 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()
Web-Servlet提供了Spring MVC框架,实现了模型-视图-控制器的设计模式,提高了Web应用的开发效率。 5. **AOP模块** 面向切面编程(AOP)允许开发者定义“横切关注点”,如日志、事务管理等,将它们与业务逻辑分离...
- **spring-framework-4.3.25.RELEASE-dist.zip**:包含Spring Framework的基础库和核心模块,如core-container、beans、context、expression-language等,这些模块是Spring框架的基础,提供了DI、AOP、事件处理等...
在这个包中,我们能找到`spring-context`, `spring-core`, `spring-web`, `spring-aop`等模块,每个模块都对应着Spring框架的一个特定部分,例如`spring-context`是Spring应用上下文,负责环境配置和bean的生命周期...
在Spring框架的高版本源码分析过程中,可能会遇到缺少特定库的情况,比如"spring-cglib-repack-3.2.4.jar"和"spring-objenesis-repack-2.4.jar"这两个文件。这些文件是Spring框架运行时的重要组成部分,对于理解和...
本文主要基于Spring 5源码分析(第2版),详细介绍在Spring框架中常见的几种设计模式及其应用场景。 #### 二、设计模式概述 设计模式是一种在特定上下文中解决常见设计问题的方法论。在软件工程中,设计模式不仅...
本篇将围绕官方源码spring-framework-5.0.15.RELEASE,对其中的关键知识点进行深入探讨。 一、Spring Framework概述 Spring Framework是基于IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented ...
6. **文档与规范**:`spring-framework-5.1.6.RELEASE-docs.zip`包含完整的API文档和开发者指南,对于学习源码有着极大的辅助作用。而`spring-framework-5.1.6.RELEASE-schema.zip`则包含了Spring配置文件的XML ...
然而,有时候在导入Spring项目时,可能会遇到一些问题,例如标题中提到的"spring-cglib-repack-3.2.4.jar"和"spring-objenesis-repack-2.4.jar"这两个jar包的缺失。这些jar包对于Spring框架的正常运行至关重要,因为...
深入理解Spring源码需要对Java反射、动态代理、设计模式等有扎实的基础。建议从以下几个步骤入手: 1. 了解基本架构和模块划分。 2. 分析核心类如ApplicationContext、BeanFactory和DispatcherServlet的实现。 3. ...