《Spring源码学习:源码分析概述》中提到在Spring容启动的过程中,会将类解析成Spring
内部的BeanDefinition结构,并将BeanDefinition存储到个叫DefaultListableBeanFactory中,本
篇将深分析BeanFactory。
先,看下DefaultListableBeanFactory的类图,
可以看到DefaultListableBeanFactory间接实现BeanFactory接,先来分析下这个
BeanFactory,直接查看BeanFactory源代码,
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
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;
String[] getAliases(String name);
}
从接中的法名可以很容的解每个法的意图,最常或者最常的就是getBean法,
于获取Bean的实。BeanFactory是于访问Spring Bean容的根接,是个单纯的Bean
,也就是常说的IOC容的顶层定义,各种IOC容是在其基础上为满同需求扩展
的,包括经常使的ApplicationContext。
DefaultListableBeanFactory是整个Bean加载的核部分,是Spring注册及加载Bean的默认实
现。下出DefaultListableBeanFactory源代码中两个重要的属性,
/** Map of bean definition objects, keyed by bean name */
private final Map<String, BeanDefinition> beanDefinitionMap = new
ConcurrentHashMap<String, BeanDefinition>(256);
/** List of bean definition names, in registration order */
private volatile List<String> beanDefinitionNames = new ArrayList<String>(256);
其中,bean的定义被解析成BeanDefinition,同时解析得到beanName,将beanName和
BeanDefinition存储到beanDefinitionMap中,同时会将beanName存储到beanDefinitionNames
中。DefaultListableBeanFactory间接继承DefaultSingletonBeanRegistry,
DefaultSingletonBeanRegistry中有如下属性,
/** Cache of singleton objects: bean name --> bean instance */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String,
Object>(256);
singletonObjects于存储单bean的实,getBean法就是从这个Map取实对象的。
评论0
最新资源