- 概述
- spring 单例模式源码分析
Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。
spring 单例模式源码分析单例注册表
Spring采用单例注册表的特殊方式实现单例模式.首先自己写个单例注册表.我们可以通过Map缓存单例对象,实现单例注册表.值得注意的是,采用ConcurrentHashMap是出于线程安全的考虑.
Spring采用了这种单例注册表的特殊方式实现单例模式的.
public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {
@SuppressWarnings("unchecked") protectedT doGetBean( final String name, final Class requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException { //对Bean的name进行处理,防止非法字符 final String beanName = transformedBeanName(name); Object bean; // Eagerly check singleton cache for manually registered singletons. //从单例注册表中检查是否存在单例缓存 Object sharedInstance = getSingleton(beanName); if (sharedInstance != null && args == null) { //省略部分代码... // 返回缓存实例 bean = getObjectForBeanInstance(sharedInstance, name, beanName, null); } else { //省略代码... try { // ...忽略代码 // 单例模式,实例化bean,处理分支 // Create bean instance. if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, new ObjectFactory
}
其中中重要的代码是getSingleton()方法,下面深入分析该方法:
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
// 通过 Map 实现单例注册表 private final MapsingletonObjects = new ConcurrentHashMap (64); public Object getSingleton(String beanName, ObjectFactory> singletonFactory) { Assert.notNull(beanName, "'beanName' must not be null"); synchronized (this.singletonObjects) { // 检查缓存中是否存在实例 Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null) { // ...忽略代码 try { singletonObject = singletonFactory.getObject(); } catch (BeanCreationException ex) { // ...忽略代码 } finally { // ...忽略代码 } // 如果实例对象在不存在,我们注册到单例注册表中。 addSingleton(beanName, singletonObject); } return (singletonObject != NULL_OBJECT ? singletonObject : null); } } protected void addSingleton(String beanName, Object singletonObject) { synchronized (this.singletonObjects) { this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT)); } }
}
单例模式说白了就是同一个内存地址,在对象生成的时候会在堆里面生成一个实例化的对象,栈里面也会生成指向这个对象的地址(引用地址)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)