likes
comments
collection
share

Spring源码深入解析(二)

作者站长头像
站长
· 阅读数 13

Spring源码深入解析(二)

首先我们从Spring的核心IOC开始讲解,先了解Spring如何实现的注入。 Spring源码深入解析(二)BeanDefinition入手解析Spring框架,我们可以更深入地理解Spring的核心——IoC(Inversion of Control)容器的工作机制。BeanDefinition是Spring IoC容器中对Bean的抽象描述,它包含了创建和配置一个Bean所需的所有元数据信息。

package org.springframework.beans.factory.config;

import org.springframework.beans.BeanMetadataElement;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.core.AttributeAccessor;

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
    String SCOPE_SINGLETON = "singleton";
    String SCOPE_PROTOTYPE = "prototype";
    int ROLE_APPLICATION = 0;
    int ROLE_SUPPORT = 1;
    int ROLE_INFRASTRUCTURE = 2;

    void setParentName(String var1);

    String getParentName();

    void setBeanClassName(String var1);

    String getBeanClassName();

    void setScope(String var1);

    String getScope();

    void setLazyInit(boolean var1);

    boolean isLazyInit();

    void setDependsOn(String... var1);

    String[] getDependsOn();

    void setAutowireCandidate(boolean var1);

    boolean isAutowireCandidate();

    void setPrimary(boolean var1);

    boolean isPrimary();

    void setFactoryBeanName(String var1);

    String getFactoryBeanName();

    void setFactoryMethodName(String var1);

    String getFactoryMethodName();

    ConstructorArgumentValues getConstructorArgumentValues();

    MutablePropertyValues getPropertyValues();

    boolean isSingleton();

    boolean isPrototype();

    boolean isAbstract();

    int getRole();

    String getDescription();

    String getResourceDescription();

    BeanDefinition getOriginatingBeanDefinition();
}

BeanDefinition的主要作用

  1. 描述Bean的属性:包括Bean的类名(className)、作用域(singleton或prototype)、是否懒加载(lazy-init)、初始化方法(init-method)、销毁方法(destroy-method)、属性依赖(property values)等。

  2. 依赖关系:BeanDefinition还可以包含这个Bean所依赖的其他Bean的信息,即它的依赖注入(Dependency Injection)信息。

BeanDefinition的解析过程

  1. 读取配置信息:Spring通过BeanDefinitionReader读取XML配置文件或通过注解处理器扫描类上的注解信息,将这些配置信息转换成BeanDefinition对象。

  2. 注册BeanDefinition:将解析得到的BeanDefinition对象注册到BeanFactoryApplicationContext中,通常是DefaultListableBeanFactory这一类的具体实现。

  3. 实例化Bean:当需要使用某个Bean时,Spring IoC容器会根据BeanDefinition中的信息创建Bean实例,执行依赖注入,并且在适当的时候触发初始化和销毁回调方法。

  4. 动态生成代理:对于需要AOP支持的Bean,Spring还会根据BeanDefinition中的切面信息动态生成代理对象。

举例说明: 在Spring XML配置文件中,一个简单的Bean定义可能如下所示:

<bean id="exampleBean" class="com.example.ExampleClass">
    <property name="propertyName" value="propertyValue"/>
</bean>

这段配置会被转化为一个BeanDefinition对象,其中包含了Bean的类名(com.example.ExampleClass)、唯一标识符(exampleBean)以及属性注入信息(propertyName=propertyValue)。当Spring容器需要创建这个Bean时,它就会根据这个BeanDefinition中的信息来完成相应的工作。