spring源码(二)--BeanFactory

基本上spring使用的beanFactory都是DefaultListableBeanFactory。
先看这个类的继承关系图:
这里写图片描述

类名作用
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);
            }
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值