Spring源码深入解析(二)
Spring源码深入解析(二)
首先我们从Spring的核心IOC开始讲解,先了解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的主要作用:
-
描述Bean的属性:包括Bean的类名(className)、作用域(singleton或prototype)、是否懒加载(lazy-init)、初始化方法(init-method)、销毁方法(destroy-method)、属性依赖(property values)等。
-
依赖关系:BeanDefinition还可以包含这个Bean所依赖的其他Bean的信息,即它的依赖注入(Dependency Injection)信息。
BeanDefinition的解析过程:
-
读取配置信息:Spring通过
BeanDefinitionReader
读取XML配置文件或通过注解处理器扫描类上的注解信息,将这些配置信息转换成BeanDefinition
对象。 -
注册BeanDefinition:将解析得到的
BeanDefinition
对象注册到BeanFactory
或ApplicationContext
中,通常是DefaultListableBeanFactory
这一类的具体实现。 -
实例化Bean:当需要使用某个Bean时,Spring IoC容器会根据
BeanDefinition
中的信息创建Bean实例,执行依赖注入,并且在适当的时候触发初始化和销毁回调方法。 -
动态生成代理:对于需要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
中的信息来完成相应的工作。
转载自:https://juejin.cn/post/7355088718371225610