02. Spring中重要的類
阿新 • • 發佈:2021-01-15
1. BeanDefinition
Spring容器啟動中,會將Bean解析成BeanDefinition。
直接看BeanDefinition的原始碼:
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);
String getParentName();
void setBeanClassName(@Nullable String beanClassName);
String getBeanClassName();
void setScope(@Nullable String scope) ;
String getScope();
void setLazyInit(boolean lazyInit);
boolean isLazyInit();
void setDependsOn(@Nullable String... dependsOn);
String[] getDependsOn();
void setAutowireCandidate(boolean autowireCandidate);
boolean isAutowireCandidate();
void setPrimary(boolean primary);
boolean isPrimary ();
void setFactoryBeanName(@Nullable String factoryBeanName);
String getFactoryBeanName();
void setFactoryMethodName(@Nullable String factoryMethodName);
String getFactoryMethodName();
ConstructorArgumentValues getConstructorArgumentValues();
default boolean hasConstructorArgumentValues() {
return !getConstructorArgumentValues().isEmpty();
}
MutablePropertyValues getPropertyValues();
default boolean hasPropertyValues() {
return !getPropertyValues().isEmpty();
}
void setInitMethodName(@Nullable String initMethodName);
String getInitMethodName();
void setDestroyMethodName(@Nullable String destroyMethodName);
String getDestroyMethodName();
void setRole(int role);
int getRole();
void setDescription(@Nullable String description);
String getDescription();
ResolvableType getResolvableType();
boolean isSingleton();
boolean isPrototype();
boolean isAbstract();
String getResourceDescription();
@Nullable
BeanDefinition getOriginatingBeanDefinition();
}
通過BeanDefinition可以看出,就是將bean的各類資訊(類名、屬性、構造引數列表、是否懶載入等等)放到BeanDefinition中,後面各種對bean的操作就直接對BeanDefinition進行,如可以根據BeanDefinition的類名、建構函式、建構函式引數反射建立bean。
BeanDefinition是一個介面,實際使用的是其實現類:RootBeanDefinition、ChildBeanDefinition、GenericBeanDefinition。
2. BeanFactory
BeanFactory是用於訪問Spring Bean容器的根介面,是一個單純的Bean工廠,也就是常說的IOC容器的頂層定義。各種IOC容器是在其基礎上為了滿足不同需求而擴充套件的,包括經常使用的ApplicationContext。
直接看BeanFactory介面原始碼:
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
boolean containsBean(String name);
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;
String[] getAliases(String name);
}
其中最常見的就是getBean,用於獲取Bean的例項。
DefaultListableBeanFactory是整個Bean載入的核心部分,是Spring註冊及載入Bean的預設實現。
DefaultListableBeanFactory其中最重要的兩個屬性:
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
private volatile List<String> beanDefinitionNames = new ArrayList<>(256);
其中bean的定義被解析成BeanDefinition,同時解析得到beanName。將beanName和beanDefinition儲存到beanDefinitionMap中,將beanName儲存到beanDefinitionNames中。