Spring源码分析-beanFactory

来源:互联网 发布:淘宝魔镜插件 编辑:程序博客网 时间:2024/06/08 18:29

AliasRegistry:定义了对别名的简单增删改操作

public interface AliasRegistry {    void registerAlias(String var1, String var2);    void removeAlias(String var1);    boolean isAlias(String var1);    String[] getAliases(String var1);}

SimpleAliasRegistry:使用ConcurrentHashMap实现了AliasRegistry接口:

public class SimpleAliasRegistry implements AliasRegistry {    private final Map<String, String> aliasMap = new ConcurrentHashMap(16);    public SimpleAliasRegistry() {    }    ...  }

SingletonBeanRegistry :定义对单例的注册及获取

public interface SingletonBeanRegistry {    void registerSingleton(String var1, Object var2);    Object getSingleton(String var1);    boolean containsSingleton(String var1);    String[] getSingletonNames();    int getSingletonCount();}

DefaultSingletonBeanRegistry:对SingletonBeanRegistry 接口的实现,同时继承了SimpleAliasRegistry 类。

public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry { protected static final Object NULL_OBJECT = new Object();//静态不可变对象Object,因为ConcurrentHashMap不能保存null值。    private final Set<String> singletonsCurrentlyInCreation = Collections.newSetFromMap(new ConcurrentHashMap(16));//根据map生成对应结构的set,保存正在创建的单例beanName的set     private final Map<String, Object> singletonObjects = new ConcurrentHashMap(64);//保存单例的map      private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16);//保存单例bean              private final Map<String, Object> earlySingletonObjects = new HashMap(16);//缓存从ObjectFactory中获取的bean                  private final Set<String> registeredSingletons = new LinkedHashSet(64);//保存已经注册的beanName,     private boolean singletonsCurrentlyInDestruction = false;//目前是否在销毁单例         private final Map<String, Object> disposableBeans = new LinkedHashMap();//保存只使用一次的bean    private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap(16);//bean的包含关系    private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap(64);//bean的依赖关系    private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap(64);//bean的依赖关系    //单例注册的实现      public void registerSingleton(String beanName, Object singletonObject) throws IllegalStateException {        Assert.notNull(beanName, "\'beanName\' must not be null");        Map var3 = this.singletonObjects;        synchronized(this.singletonObjects) {//对保存单例的map加锁            Object oldObject = this.singletonObjects.get(beanName);//查看对应名字的单例是否存在            if(oldObject != null) {//已经存在,抛出异常                throw new IllegalStateException("Could not register object [" + singletonObject + "] under bean name \'" + beanName + "\': there is already object [" + oldObject + "] bound");            } else {//不存在,增加这个单例对象                this.addSingleton(beanName, singletonObject);            }        }    }    //往singletonObjects里面增加单例       protected void addSingleton(String beanName, Object singletonObject) {        Map var3 = this.singletonObjects;        synchronized(this.singletonObjects) {//加锁            this.singletonObjects.put(beanName, singletonObject != null?singletonObject:NULL_OBJECT);//待增加的singletonObject 为null则增加静态不可变类NULL_OBJECT            this.singletonFactories.remove(beanName);//从ObjectFactory中移除beanName            this.earlySingletonObjects.remove(beanName);//从earlySingletonObjects中移除beanName            this.registeredSingletons.add(beanName);//将beanName保存到保存已经注册的set中        }    }//增加对象工厂(工厂bean)    protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {        Assert.notNull(singletonFactory, "Singleton factory must not be null");        Map var3 = this.singletonObjects;        synchronized(this.singletonObjects) {//加锁        //判断singletonObjects是否包含这个beanName            if(!this.singletonObjects.containsKey(beanName)) {                this.singletonFactories.put(beanName, singletonFactory);                this.earlySingletonObjects.remove(beanName);                this.registeredSingletons.add(beanName);//保存beanName到set中            }        }    }//获取单例,    public Object getSingleton(String beanName) {    //获取单例,允许从ObjectFactory中获取        return this.getSingleton(beanName, true);    }//先从保存bean对map中获取,没有获取到,则从缓存ObjectFactory获取的bean的map中获取,没有获取到,则从工厂bean获取    protected Object getSingleton(String beanName, boolean allowEarlyReference) {        Object singletonObject = this.singletonObjects.get(beanName);        //保存单例的map中没有获取到单例,                if(singletonObject == null && this.isSingletonCurrentlyInCreation(beanName)) {            Map var4 = this.singletonObjects;            //对单例map进行加锁            synchronized(this.singletonObjects) {            //从缓存ObjectFactory获取的bean的map中获取                            singletonObject = this.earlySingletonObjects.get(beanName);                //从ObjectFactory获取                                if(singletonObject == null && allowEarlyReference) {                    ObjectFactory singletonFactory = (ObjectFactory)this.singletonFactories.get(beanName);                    if(singletonFactory != null) {                        singletonObject = singletonFactory.getObject();                        this.earlySingletonObjects.put(beanName, singletonObject);//将正在创建的bean放到早期引用map中                        this.singletonFactories.remove(beanName);//从保存共产bean的map中移除这个beanName                    }                }            }        }        return singletonObject != NULL_OBJECT?singletonObject:null;    }}

总结bean的增加和获取:
把bean增加到singletonObjects中,从singletonFactories中移除,从earlySingletonObjects中移除,再保存到registeredSingletons中。
BeanFactory:bean的获取和bean的各种属性

public interface BeanFactory {    String FACTORY_BEAN_PREFIX = "&";    Object getBean(String var1) throws BeansException;    <T> T getBean(String var1, Class<T> var2) throws BeansException;    <T> T getBean(Class<T> var1) throws BeansException;    Object getBean(String var1, Object... var2) throws BeansException;    <T> T getBean(Class<T> var1, Object... var2) throws BeansException;    boolean containsBean(String var1);    boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;    boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;    boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;    Class<?> getType(String var1) throws NoSuchBeanDefinitionException;    String[] getAliases(String var1);}

HierarchicalBeanFactory :在BeanFactory 的基础上增加工厂层次关系,

public interface HierarchicalBeanFactory extends BeanFactory {    BeanFactory getParentBeanFactory();    boolean containsLocalBean(String var1);}

BeanDefinitionRegistry :对BeanDefinition的增删改操作

public interface BeanDefinitionRegistry extends AliasRegistry {    void registerBeanDefinition(String var1, BeanDefinition var2) throws BeanDefinitionStoreException;    void removeBeanDefinition(String var1) throws NoSuchBeanDefinitionException;    BeanDefinition getBeanDefinition(String var1) throws NoSuchBeanDefinitionException;    boolean containsBeanDefinition(String var1);    String[] getBeanDefinitionNames();    int getBeanDefinitionCount();    boolean isBeanNameInUse(String var1);}

FactoryBeanRegistrySupport :增加对FactoryBean的操作

public abstract class FactoryBeanRegistrySupport extends DefaultSingletonBeanRegistry { private final Map<String, Object> factoryBeanObjectCache = new ConcurrentHashMap(16);//缓存从工厂bean中获取的对象}

ConfigurableBeanFactory :提供配置Factory的各种方法

public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {//bean的属性   String SCOPE_SINGLETON = "singleton";    String SCOPE_PROTOTYPE = "prototype";      void setParentBeanFactory(BeanFactory var1) throws IllegalStateException;//设置父工厂      void setBeanClassLoader(ClassLoader var1);//设置bean的类加载器      void setBeanExpressionResolver(BeanExpressionResolver var1);//设置bean表达式解析器      void setConversionService(ConversionService var1);//设置类型转换器      void addPropertyEditorRegistrar(PropertyEditorRegistrar var1);// 用一个属性编辑注册器(PropertyEditorRegistry)注册一个自定义的属性编辑器(PropertyEditor)的策略接口。      void setTypeConverter(TypeConverter var1);//设置类型转换器      void addBeanPostProcessor(BeanPostProcessor var1);//增加bean后处理器      ...}

ListableBeanFactory :根据各种条件获取bean

public interface ListableBeanFactory extends BeanFactory {<T> Map<String, T> getBeansOfType(Class<T> var1) throws BeansException;//根据类型获取bean    ...}

AbstractBeanFactory :继承了FactoryBeanRegistrySupport ,同时实现ConfigurableBeanFactory 接口的方法

public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {     private BeanFactory parentBeanFactory;//父beanFactory    private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader();//获取类加载器,首选当前线程的类加载器    private ClassLoader tempClassLoader;//临时类加载器    private boolean cacheBeanMetadata = true;    private BeanExpressionResolver beanExpressionResolver;    private ConversionService conversionService;    private final Set<PropertyEditorRegistrar> propertyEditorRegistrars = new LinkedHashSet(4);    private TypeConverter typeConverter;    private final Map<Class<?>, Class<? extends PropertyEditor>> customEditors = new HashMap(4);    private final List<StringValueResolver> embeddedValueResolvers = new LinkedList();    private final List<BeanPostProcessor> beanPostProcessors = new ArrayList();//bean后处理器    private boolean hasInstantiationAwareBeanPostProcessors;    private boolean hasDestructionAwareBeanPostProcessors;    private final Map<String, Scope> scopes = new HashMap(8);    private SecurityContextProvider securityContextProvider;    private final Map<String, RootBeanDefinition> mergedBeanDefinitions = new ConcurrentHashMap(64);    private final Set<String> alreadyCreated = Collections.newSetFromMap(new ConcurrentHashMap(64));    private final ThreadLocal<Object> prototypesCurrentlyInCreation = new NamedThreadLocal("Prototype beans currently in creation");//构造方法设置父BeanFactory public AbstractBeanFactory(BeanFactory parentBeanFactory) {        this.parentBeanFactory = parentBeanFactory;    }     public Object getBean(String name) throws BeansException {        return this.doGetBean(name, (Class)null, (Object[])null, false);    }    public <T> T getBean(String name, Class<T> requiredType) throws BeansException {        return this.doGetBean(name, requiredType, (Object[])null, false);    }//一系列最核心的getBean方法。非常重要!    public Object getBean(String name, Object... args) throws BeansException {        return this.doGetBean(name, (Class)null, args, false);    }    public <T> T getBean(String name, Class<T> requiredType, Object... args) throws BeansException {        return this.doGetBean(name, requiredType, args, false);    }    //获取bean    protected <T> T doGetBean(String name, Class<T> requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException {        final String beanName = this.transformedBeanName(name);//装换beanName        Object sharedInstance = this.getSingleton(beanName);//调用父类方法获取beanName对应单例,尝试直接从缓存获取获取singletonFactories中的ObjectFactory中获取        Object bean;        if(sharedInstance != null && args == null) {            if(this.logger.isDebugEnabled()) {                if(this.isSingletonCurrentlyInCreation(beanName)) {                    this.logger.debug("Returning eagerly cached instance of singleton bean \'" + beanName + "\' that is not fully initialized yet - a consequence of a circular reference");                } else {                    this.logger.debug("Returning cached instance of singleton bean \'" + beanName + "\'");                }            }            bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, (RootBeanDefinition)null);//bean的实例化,如果是工厂bean,则获取工厂bean的里面的bean        } else {            if(this.isPrototypeCurrentlyInCreation(beanName)) {                throw new BeanCurrentlyInCreationException(beanName);            }            BeanFactory ex = this.getParentBeanFactory();            if(ex != null && !this.containsBeanDefinition(beanName)) {                String var24 = this.originalBeanName(name);                if(args != null) {                    return ex.getBean(var24, args);                }                return ex.getBean(var24, requiredType);            }            if(!typeCheckOnly) {                this.markBeanAsCreated(beanName);            }            try {                final RootBeanDefinition ex1 = this.getMergedLocalBeanDefinition(beanName);                this.checkMergedBeanDefinition(ex1, beanName, args);                String[] dependsOn = ex1.getDependsOn();                String[] scopeName;                if(dependsOn != null) {                    scopeName = dependsOn;                    int scope = dependsOn.length;                    for(int ex2 = 0; ex2 < scope; ++ex2) {                        String dependsOnBean = scopeName[ex2];                        if(this.isDependent(beanName, dependsOnBean)) {                            throw new BeanCreationException(ex1.getResourceDescription(), beanName, "Circular depends-on relationship between \'" + beanName + "\' and \'" + dependsOnBean + "\'");                        }                        this.registerDependentBean(dependsOnBean, beanName);                        this.getBean(dependsOnBean);                    }                }                if(ex1.isSingleton()) {                    sharedInstance = this.getSingleton(beanName, new ObjectFactory() {                        public Object getObject() throws BeansException {                            try {                                return AbstractBeanFactory.this.createBean(beanName, ex1, args);                            } catch (BeansException var2) {                                AbstractBeanFactory.this.destroySingleton(beanName);                                throw var2;                            }                        }                    });                    bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, ex1);                } else if(ex1.isPrototype()) {                    scopeName = null;                    Object var25;                    try {                        this.beforePrototypeCreation(beanName);                        var25 = this.createBean(beanName, ex1, args);                    } finally {                        this.afterPrototypeCreation(beanName);                    }                    bean = this.getObjectForBeanInstance(var25, name, beanName, ex1);                } else {                    String var26 = ex1.getScope();                    Scope var27 = (Scope)this.scopes.get(var26);                    if(var27 == null) {                        throw new IllegalStateException("No Scope registered for scope \'" + var26 + "\'");                    }                    try {                        Object var28 = var27.get(beanName, new ObjectFactory() {                            public Object getObject() throws BeansException {                                AbstractBeanFactory.this.beforePrototypeCreation(beanName);                                Object var1;                                try {                                    var1 = AbstractBeanFactory.this.createBean(beanName, ex1, args);                                } finally {                                    AbstractBeanFactory.this.afterPrototypeCreation(beanName);                                }                                return var1;                            }                        });                        bean = this.getObjectForBeanInstance(var28, name, beanName, ex1);                    } catch (IllegalStateException var21) {                        throw new BeanCreationException(beanName, "Scope \'" + var26 + "\' is not active for the current thread; " + "consider defining a scoped proxy for this bean if you intend to refer to it from a singleton", var21);                    }                }            } catch (BeansException var23) {                this.cleanupAfterBeanCreationFailure(beanName);                throw var23;            }        }}

AutowireCapableBeanFactory:提供创建bean,自动注入,初始化以及应用bean的后处理器

public interface AutowireCapableBeanFactory extends BeanFactory {   <T> T createBean(Class<T> var1) throws BeansException;    void autowireBean(Object var1) throws BeansException;    ...}

AbstractAutowireCapableBeanFactory :继承AbstractBeanFactory ,实现AutowireCapableBeanFactory 接口

//创建bean的实现public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory {   public <T> T createBean(Class<T> beanClass) throws BeansException {        RootBeanDefinition bd = new RootBeanDefinition(beanClass);        bd.setScope("prototype");        bd.allowCaching = ClassUtils.isCacheSafe(beanClass, this.getBeanClassLoader());        return this.createBean(beanClass.getName(), bd, (Object[])null);    }}

DefaultListableBeanFactory:综合上面所有功能,主要是对bean注册后的处理

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信老是无响应怎么办 打游戏被骂了怎么办 微信运动跳转排行榜失败怎么办 小恩爱账号忘了怎么办 华为账号更换后游戏账号怎么办 注册游戏账号需要身份证怎么办 英雄联盟被裁决了怎么办 百度网盘密码重置不了怎么办 sap密码输入被锁怎么办 dnf二级密码错10怎么办 大网卡网速慢了怎么办 小米路由器无线速度慢怎么办 小米手机无线速度慢怎么办 电脑网卡驱动没了怎么办 电脑显示网卡驱动不正常怎么办 微信别人拒收消息怎么办 电脑无线网卡速度慢怎么办 网吧吃鸡更新慢怎么办 手机号注册不了微信怎么办 小米账号密码忘了怎么办 小米手机账号密码忘了怎么办 华为手机账号密码忘记了怎么办 老年机开不了机怎么办 天谕没有顺网登陆怎么办 苹果密保问题忘了怎么办 密保手机没用了怎么办 qq密保手机没用了怎么办 手机开机按钮坏了怎么办 改了账号游戏角色消失怎么办 华为开机键坏了怎么办 抖音账号已重置怎么办 抖音账号被重置怎么办 吃鸡账号密码忘了怎么办 微信只记得账号忘了手机号怎么办 红米3开机键失灵怎么办 晚自习教室有许多虫子怎么办 泰迪吃草又呕吐怎么办 手机不断收到验证码信息怎么办 樱桃吃多了上火怎么办 过年不想回婆婆家过怎么办 旅行箱提手坏了怎么办