1. 程式人生 > 其它 >02. Spring中重要的類

02. Spring中重要的類

技術標籤:Spring原始碼spring

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。
BeanDefinition實現類

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中。