假设你遇到的问题是做一个IOC容器,如何开始?
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String name) throws BeansException;
Object getBean(String name, Class requiredType) throws BeansException;
boolean containsBean(String name);
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
Class getType(String name) throws NoSuchBeanDefinitionException;
String[] getAliases(String name);
}
BeanFactory是spring与容器交互最基本的一个描述,即我们需要从容器中得到一个实体类,判断它是否存在,是否是单例,又或是它的类型是什么样的。
一个类一个责任:
这是一条很简单的设计原则,但很难把握
Spring中的IOC容器设计,由 BeanFactory提供一个基本的描述,然后由其它接口描述其主要组件的功能,再由具体的子类逐层实现。每个类都有很清晰的责任,这样做复用性很好,而且阅读起来结构非常的清晰
我们从上至下,先看一下DefaultSingletonBeanRegistry这个类
SingletonBeanRegistry接口描述了对Bean一系列的操作
DefaultSingletonBeanRegistry是它的实现类
3个Map,其中singletonCache,disposableBeans是LinkedHashMap, dependentBeanMap只是普通的map。
private final Map singletonCache
private final Map disposableBeans
private final Map dependentBeanMap = new HashMap();
LinkedHashMap(详见Think in Java)
LinkedHashMap散列化所有的元素,但是在遍历“键值对”时,却又以元素的插入顺序返回“键值对”(println()会迭代遍历该映射,由此可以看到遍历的结果)。此外,可以在构造器中设定LinkedHashMap,使之采用给予访问的“最近最少使用”(LRU)算法,于是没有被访问过的(可以看作需要删除的)元素就会出现在队列的前面。对于需要定期清理元素以节省空间的程序来说,此功能使得程序很容易得以实现。
首先想看的就是spring是如何保存一个bean的。
在这个registerSingleton方法中,我们只是将类放入到了一个Map中,而Bean的创建是由其子类完成的。
如同它的名字registerSingleton只负责Bean的注册(保存到Map中)和Bean的销毁(从map中移除,并调用其相应的destory()方法
// 注册一个实体类
public void registerSingleton(String beanName, Object sharedBean)
//先判断是否存在,然后在添加,即把类放入singletonCache这个map中
Object oldObject = this.singletonCache.get(beanName);
if (oldObject != null) {…}
addSingleton(beanName, sharedBean);
}
//如果一个bean,它的产生依赖其它类,那么会使用这个方法,同样依赖类会被放入到dependentBeanMap中
public void registerDependentBean(String beanName, String dependentBeanName)
spring中bean的生命周期经历了很多阶段,DispposableBean接口实现的是Bean的销毁过程,如果Bean实现了该接口,将会在创建过程中进行注册
// 将BeanName放入disposableBeans这个Map中
public void registerDependentBean(String beanName, String dependentBeanName)
// 得到一个类有2种方法直接从map中取出或由一个工厂类提供(考虑到工厂产生类的情况)
public Object getSingleton(String beanName) {
public Object getSingleton(String beanName, ObjectFactory singletonFactory)
最后,从容器中移除,destroySingleton,destroyBean两个方法递归调用,即不但要销毁这个bean,其对应的DisposableBean,调用destory()方法。而且如果这个类有依赖类,那么还要继续搜索,销毁其依赖类
public void destroySingleton(String beanName) {
//从map中将bean移除
removeSingleton(beanName);
//移除相关的DisposableBean实例
DisposableBean disposableBean = null;
synchronized (this.disposableBeans) {
disposableBean = (DisposableBean) this.disposableBeans.remove(beanName);
}
destroyBean(beanName, disposableBean);
}
protected void destroyBean(String beanName, DisposableBean bean) {
Set dependencies = null;
synchronized (this.dependentBeanMap) {
//在这里寻找是否有依赖类,然后调用destroySingleton方法
dependencies = (Set) this.dependentBeanMap.remove(beanName);
}
if (dependencies != null) {
if (logger.isDebugEnabled()) {
logger.debug("Retrieved dependent beans for bean '" + beanName + "': " + dependencies);
}
for (Iterator it = dependencies.iterator(); it.hasNext();) {
String dependentBeanName = (String) it.next();
destroySingleton(dependentBeanName);
}
}
if (bean != null) {
try {
bean.destroy();
}
catch (Throwable ex) {
logger.error("Destroy method on bean with name '" + beanName + "' threw an exception", ex);
}
}
}
}
分享到:
相关推荐
《Spring IOC:找对象的一次革命》一文深入探讨了Spring框架中的一种核心特性——Inversion of Control(IoC),即控制反转。IoC是一种设计模式,它将对象的创建和管理责任从对象本身转移到了一个外部实体,通常称为...
在深入解析Spring IoC的过程中,我们首先关注的是其核心组件——IoC(Inversion of Control,控制反转)机制。Spring框架通过IoC容器管理应用程序的组件,实现了依赖注入,使得对象之间的依赖关系由容器负责建立和...
**Spring Ioc 实现原理详解** Spring Ioc(Inversion of Control,控制反转)是Spring框架的核心特性之一,它改变了传统应用程序中对象的创建和管理方式。在传统的软件设计中,对象的创建和依赖关系的维护通常由...
"Spring IOC基本操作" Spring IOC(Inversion of Control,控制反转)是一种软件设计模式,它将对象的创建和管理交给容器,实现了对象之间的解耦合。 SpringIOC是Spring Framework中的核心组件之一,负责管理应用...
《深入理解SpringIOC:从简单实现到核心机制》 在Java世界中,Spring框架以其强大的功能和灵活性成为了企业级应用开发的首选。其中,Spring的Inversion of Control(控制反转,IoC)容器是其核心特性之一,它极大地...
Spring 框架是Java开发中的核心框架,它主要由两个关键部分组成:IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。这两个概念是Spring框架的核心特性,极大地简化了企业...
springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC...
spring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demo...
在这个"SpringIOC:SpringIOC临时二进制简单实现"中,我们将探讨如何在Java环境下构建一个简单的Spring IOC的二进制实现。 首先,理解控制反转的基本概念。在传统的编程模式中,对象通常自行创建依赖的对象,这导致...
spring-core:核心模块 依赖注入IOC和DI的最基本实现 spring-beans:Bean工厂与装配 spring-context:上下文,即IOC容器 spring-context-support:对IOC的扩展,以及IOC子容器 spring-context-indexer:类管理组件和...
Spring 中 IoC 优点与缺点解析 IoC(Inversion of Control)是 Spring 框架中的一种设计模式,它的主要思想是将对象的创建和管理交给容器,从而解耦合对象之间的依赖关系。今天,我们将详细解析 IoC 的优点和缺点。 ...
Spring IOC,全称为Inversion of Control,即控制反转,是Spring框架的核心特性之一。它将对象的创建和管理从应用程序代码中分离出来,使得开发者可以更专注于业务逻辑,而不是对象的生命周期。在Spring中,IOC容器...
Spring IoC 加载流程讲解 在本节中,我们将对 Spring IoC 加载流程进行详细的讲解,并探讨 IoC 思想和依赖倒置原则的应用。 IoC 控制反转 IoC(Inversion of Control)是指在软件设计中,将对象实例的控制权从...
spring Ioc容器配置 IOC容器数据源配置 <!-- 配置数据源 --> destroy-method="close"> <value>org.gjt.mm.mysql.Driver <value>jdbc:mysql://localhost:3306/demo <value>root ...
Spring IOC,全称Inversion of Control,即“控制反转”,是Spring框架的核心特性之一。在传统的Java应用程序中,对象的创建和管理通常由开发者自己控制。而在Spring IOC中,这种控制权被反转,对象的创建、初始化、...
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性之一,它允许开发者将对象的创建和管理交给Spring容器来处理,从而使代码更加松耦合,更易于测试和维护。下面将详细介绍Spring IOC的基本概念、...
Java反射和Spring IOC是Java开发中的两个重要概念,它们在构建灵活、可扩展的应用程序时起着关键作用。本文将深入探讨这两个主题,并提供相关的学习资源。 首先,让我们了解一下Java反射。Java反射机制是Java语言的...
《深入解析Spring IoC源码:核心机制与实践应用》 Spring框架的IoC(Inversion of Control,控制反转)是其核心特性之一,它极大地简化了Java应用程序的开发。本文将深入剖析Spring IoC容器的源码,揭示其工作原理...
标题 "Spring IOC" 描述了我们讨论的核心主题——Spring 框架中的依赖注入(Inversion of Control,简称 IOC)机制。Spring 是一个广泛应用的 Java 应用开发框架,其核心特性之一就是IOC,它极大地简化了软件组件...
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它极大地简化了Java应用的开发,通过将对象的创建和管理交由Spring容器来处理,开发者可以更专注于业务逻辑。下面,我们将深入探讨Spring IOC...