Spring Core中的设计模式分析
1. 单例模式 (Singleton Pattern)
源码分析:
在Spring框架中,Bean默认是单例的。这意味着在整个Spring IoC容器中,只有一个Bean实例。Spring通过DefaultSingletonBeanRegistry
来实现单例模式。
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
@Override
public Object getSingleton(String beanName) {
return this.singletonObjects.get(beanName);
}
@Override
public void registerSingleton(String beanName, Object singletonObject) {
synchronized (this.singletonObjects) {
this.singletonObjects.put(beanName, singletonObject);
}
}
}
设计思想:
单例模式确保一个类只有一个实例,并提供一个全局访问点。在Spring中,单例模式用于确保每个Bean在容器中只有一个实例,从而节省内存和资源。
解决的问题:
- 资源共享:确保同一个Bean实例在应用程序的不同部分被共享,避免重复创建Bean实例。
- 性能优化:通过避免多次实例化,节省了内存和资源,提高了性能。
优缺点:
- 优点:
- 节省内存:减少了Bean实例的数量。
- 资源共享:确保应用程序中的Bean实例可以共享状态。
- 缺点:
- 全局状态:单例Bean可能会导致全局状态的管理变得复杂。
- 线程安全:单例Bean需要处理线程安全问题。
2. 工厂方法模式 (Factory Method Pattern)
源码分析:
Spring使用BeanFactory
和ApplicationContext
来创建和管理Bean实例。BeanFactory
接口定义了获取Bean的方法,而具体的创建逻辑由子类实现。
public interface BeanFactory {
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
}
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory {
@Override
public Object getBean(String name) throws BeansException {
return doGetBean(name, null, null, false);
}
protected <T> T doGetBean(final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly) {
// 创建或获取Bean的逻辑
}
}
设计思想:
工厂方法模式通过定义一个创建对象的接口,将对象的实际创建工作推迟到子类中实现。这使得代码可以更加灵活和可扩展。
解决的问题:
- 对象创建的灵活性:通过工厂方法,可以根据具体的需求创建不同类型的对象,而无需修改现有代码。
- 解耦:工厂方法将对象的创建过程与使用过程解耦,降低了代码的耦合性。
优缺点:
- 优点:
- 灵活性:可以根据需求创建不同类型的对象。
- 解耦:对象的创建过程与使用过程分离,降低了代码的耦合度。
- 缺点:
- 复杂性:增加了代码的复杂性,因为需要额外的工厂类和方法。
3. 模板方法模式 (Template Method Pattern)
源码分析:
Spring使用模板方法模式在AbstractApplicationContext
类中定义了一些通用的操作流程,如refresh()
方法。
public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext {
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
prepareRefresh();
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
prepareBeanFactory(beanFactory);
postProcessBeanFactory(beanFactory);
invokeBeanFactoryPostProcessors(beanFactory);
registerBeanPostProcessors(beanFactory);
initMessageSource();
initApplicationEventMulticaster();
onRefresh();
registerListeners();
finishBeanFactoryInitialization(beanFactory);
finishRefresh();
}
}
protected void prepareRefresh() {
// 准备刷新上下文的逻辑
}
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
// 获取新的BeanFactory的逻辑
}
// 其他方法
}
设计思想:
模板方法模式通过在基类中定义一个算法的骨架,并将具体的步骤延迟到子类实现,从而使得算法的结构可以在不改变算法结构的情况下得到复用和扩展。
解决的问题:
- 代码复用:通过在基类中定义通用的操作流程,子类可以复用这些通用逻辑。
- 代码扩展:子类可以在不修改基类的情况下,定制具体的操作步骤,实现代码的扩展。
优缺点:
- 优点:
- 复用性:基类中的通用逻辑可以被多个子类复用。
- 可扩展性:子类可以在不修改基类的情况下扩展功能。
- 缺点:
- 灵活性:模板方法模式在设计时需要考虑到未来的扩展需求,可能会增加设计的复杂性。
- 子类依赖:子类必须实现基类中定义的抽象方法,增加了子类的实现负担。
总结
Spring Core模块通过使用单例模式、工厂方法模式和模板方法模式,提高了代码的灵活性、可维护性和可扩展性。单例模式确保Bean实例的唯一性和资源共享,工厂方法模式解耦了对象的创建和使用,模板方法模式则提供了复用和扩展通用操作流程的能力。每种模式都有其独特的优势和劣势,但它们在Spring中的应用无疑增强了框架的整体设计和实现。