本文已参与「新人创作礼」活动,一起开启掘金创作之路。
BeanDefinition
BeanDefinition
定义 Bean 的配置元信息接口
package org.springframework.beans.factory.config;
import org.springframework.beans.BeanMetadataElement;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.core.AttributeAccessor;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
int ROLE_APPLICATION = 0;
int ROLE_SUPPORT = 1;
int ROLE_INFRASTRUCTURE = 2;
void setParentName(@Nullable String parentName);
@Nullable
String getParentName();
// beanClass:表示Bean类型,未加载类的时候存放Bean的名字,加载类后存放Bean的class信息。
void setBeanClassName(@Nullable String beanClassName);
// scope:表示Bean的作用域,一般值为单例或者原型。
void setScope(@Nullable String scope);
// lazyInit:表示Bean是否是懒加载。
void setLazyInit(boolean lazyInit);
void setDependsOn(@Nullable String... dependsOn);
@Nullable
String[] getDependsOn();
void setAutowireCandidate(boolean autowireCandidate);
boolean isAutowireCandidate();
void setPrimary(boolean primary);
boolean isPrimary();
// factoryBeanName:创建当前Bean的工厂Bean。
void setFactoryBeanName(@Nullable String factoryBeanName);
void setFactoryMethodName(@Nullable String factoryMethodName);
@Nullable
String getFactoryMethodName();
ConstructorArgumentValues getConstructorArgumentValues();
default boolean hasConstructorArgumentValues() {
return !getConstructorArgumentValues().isEmpty();
}
MutablePropertyValues getPropertyValues();
default boolean hasPropertyValues() {
return !getPropertyValues().isEmpty();
}
// initMethodName:Bean初始化需要执行的方法。
void setInitMethodName(@Nullable String initMethodName);
// destroyMethodName:Bean销毁时要执行的方法。
void setDestroyMethodName(@Nullable String destroyMethodName);
@Nullable
String getDestroyMethodName();
void setRole(int role);
int getRole();
void setDescription(@Nullable String description);
@Nullable
String getDescription();
ResolvableType getResolvableType();
boolean isSingleton();
boolean isPrototype();
boolean isAbstract();
@Nullable
String getResourceDescription();
@Nullable
BeanDefinition getOriginatingBeanDefinition();
}
AbstractBeanDefinition
实现BeanDefinition接口,支撑BeaDefinition接口提供的所有方法。
GenericBeanDefinition
比AbstractBeanDefinition 多一个 parentName
@Nullable
private String parentName;
构建BeanDefinition
Spring中构建BeanDefinition的两种方法:
- BeanDefinitionBuilder
- GenericBeanDefinition
BeanDefinitionBuilder构造器
genericBeanDefinition方法
创建一个BeanDefinitionBuilder用来构造一个GenericBeanDefinition。 beanClass:表示Bean类型,未加载类的时候存放Bean的名字,加载类后存放Bean的class信息。
/**
* Create a new {@code BeanDefinitionBuilder} used to construct a {@link GenericBeanDefinition}.
* @param beanClass the {@code Class} of the bean that the definition is being created for
*/
public static BeanDefinitionBuilder genericBeanDefinition(Class<?> beanClass) {
BeanDefinitionBuilder builder = new BeanDefinitionBuilder(new GenericBeanDefinition());
builder.beanDefinition.setBeanClass(beanClass);
return builder;
}
rootBeanDefinition方法
childBeanDefinition方法
GenericBeanDefinition类
注册BeanDefinition
/** Map of bean definition objects, keyed by bean name. */
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
/** List of bean definition names, in registration order. */
private volatile List<String> beanDefinitionNames = new ArrayList<>(256);
Spring启动时在AbstractApplicationContext#refresh()方法的第当Bean注册完成后,会在spring容器中把扫描到的beanDefinition存放到beanDefinitionMap中,方便后续的使用。
读取BeanDefinition
AnnotatedBeanDefinitionReader
解析类上的注解,包含某些注解的时候会成为Bean。
XmlBeanDefinitionReader
解析xml文件中的标签。
ClassPathBeanDefinitionScanner
扫描包路径的读取器。