spring源码(二)--BeanFactory

先看这个类的继承关系图:
这里写图片描述

类名 作用
AliasResgistry 定义对alias简单的增删改操作
SimpleAliasRegistry 使用map作为alias的缓存,并对接口AliasRegistry实现
SingletonBeanRegistry 定义了对单例的注册和获取
DefaultSingletonBeanRegistry 对接口SingletonRegistry的实现
BeanFactory 定义获取Bean和Bean的各种属性
HierarchicalBeanFactory 继承BeanFactory,增加了对parentFactory的支持
BeanDefinitionRegistry 增加了对BeanDefinition的增删改
FactoryBeanRegistrySupport 增加了对FactoryBean的特殊处理
ConfigurableBeanFactory 提供了对BeanFactory的配置方法
ListableBeanFactory 根据各种条件获取bean的清单
AbstractBeanFactory 综合ConfigurableBeanFactory 和FactoryBeanRegistrySupport 的功能
AutowireCapableBeanFactory 提供创建Bean、自动注入、初始化以及应用bean后的处理器
AbstractAutowireCapableBeanFactory 综合AbstractBeanFactory 并对AutowireCapableBeanFactory 做了实现
ConfigurableListableBeanFactory 配置清单、指定忽略类型和接口
DefaultListableBeanFactory 实现了以上所有功能 ,主要是bean注册后的处理

一般使用的是DefaultListableBeanFactory这个类

类中定义了8个内部类

类名 作用
DependencyObjectProvider
FactoryAwareOrderSourceProvider
Jsr330DependencyProvider
Jsr330ProviderFactory
MultiElementDescriptor
NestedDependencyDescriptor
OptionalDependencyFactory
SerializedBeanFactoryReference

定义的字段
这里写图片描述
定义的方法:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

AbstractAutowireCapableBeanFactory中,有构造方法:

public AbstractAutowireCapableBeanFactory() {
        this.instantiationStrategy = new CglibSubclassingInstantiationStrategy();
        this.parameterNameDiscoverer = new DefaultParameterNameDiscoverer();
        this.allowCircularReferences = true;
        this.allowRawInjectionDespiteWrapping = false;
        this.ignoredDependencyTypes = new HashSet();
        this.ignoredDependencyInterfaces = new HashSet();
        this.factoryBeanInstanceCache = new ConcurrentHashMap(16);
        this.filteredPropertyDescriptorsCache = new ConcurrentHashMap(256);
        this.ignoreDependencyInterface(BeanNameAware.class);
        this.ignoreDependencyInterface(BeanFactoryAware.class);
        this.ignoreDependencyInterface(BeanClassLoaderAware.class);
    }

ignoreDependencyInterface的作用是忽略指定接口的自动装配功能,比如说A中有属性B,在获取A的Bean时,B还没有实例化,spring会自动实例化B。如果把类B添加到ignoreDependencyInterface中,那么类B就不会被实例化。


XmlBeanFactory使用private final XmlBeanDefinitionReader reader;来读取beanDefinition,这个类在第三篇中有细说。
类中只有2个构造方法,没有其他的东西,关于Resource这个类在第四篇中有说到。

  public XmlBeanFactory(Resource resource) throws BeansException {
        this(resource, (BeanFactory)null);
    }

    public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
        super(parentBeanFactory);
        this.reader = new XmlBeanDefinitionReader(this);
        this.reader.loadBeanDefinitions(resource);
    }

spring创建beanFactory,是使用refreshBeanFactory方法创建的,这个方法核心的一步是loadBeanDefinitions(beanFactory);

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
        this.refreshBeanFactory();
        ConfigurableListableBeanFactory beanFactory = this.getBeanFactory();
        return beanFactory;
    }

 protected final void refreshBeanFactory() throws BeansException {
        if(this.hasBeanFactory()) {
            this.destroyBeans();
            this.closeBeanFactory();
        }

        try {
        //普通的对象创建---如果有父context,就把父context的beanfactory
            DefaultListableBeanFactory beanFactory = this.createBeanFactory();
            //直接使用context的id
            beanFactory.setSerializationId(this.getId());
            //设置是否允许bean重复定义-allowBeanDefinitionOverriding
            //设置是否允许bean循环引用--allowCircularReferences
            this.customizeBeanFactory(beanFactory);
            
            this.loadBeanDefinitions(beanFactory);
            Object var2 = this.beanFactoryMonitor;
            synchronized(this.beanFactoryMonitor) {
                this.beanFactory = beanFactory;
            }
        } catch (IOException var5) {
  	}
  }


loadBeanDefinitions(beanFactory)方法,这个方法除了创建对象外,又把主要逻辑放在了loadBeanDefinitions上。

protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
        XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
        beanDefinitionReader.setEnvironment(this.getEnvironment());
        beanDefinitionReader.setResourceLoader(this);
        beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
        this.initBeanDefinitionReader(beanDefinitionReader);
        this.loadBeanDefinitions(beanDefinitionReader);
    }

这个方法使用XmlBeanDefinitionReader解析spring的xml配置文件,具体解析在其他文章中。

protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws IOException {
        String[] configLocations = this.getConfigLocations();
        if(configLocations != null) {
            String[] var3 = configLocations;
            int var4 = configLocations.length;

            for(int var5 = 0; var5 < var4; ++var5) {
                String configLocation = var3[var5];
                reader.loadBeanDefinitions(configLocation);
            }
        }

    }

猜你喜欢

转载自blog.csdn.net/ljz2016/article/details/82660651