??通过XmlWebApplicationContext可以发现这个类的继承体系如下图所示:
??实现了相当多的接口,我们首先从BeanFactory看起。
?

?
BeanFactory是一个访问Spring容器的根节点,是一个Bean容器的最基本功能的定义
?
public interface BeanFactory {
/**
*用来访问BeanFactory本身的bean名称的前缀
*/
String FACTORY_BEAN_PREFIX = "&";
/**
*返回指定名称的Bean实例
*/
Object getBean(String name) throws BeansException;
/**
*返回指定名称和类型的Bean实例
*/
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
/**
* 返回指定类型的Bean实例
*/
<T> T getBean(Class<T> requiredType) throws BeansException;
/**
*可变参数主要用来指定是否显示使用静态工厂方法创建一个原型(prototype)Bean。
*/
Object getBean(String name, Object... args) throws BeansException;
/**
*判断BeanFactory中是否包含指定名称的Bean
*/
boolean containsBean(String name);
/**
*判断指定名称的Bean是否是单例模式的Bean
*/
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
/**
*判断指定名称的Bean是否是原型类型的Bean
*/
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
/**
* 判断指定名称的Bean的类型和指定的类型是否匹配
*/
boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;
/**
* 返回指定名称的Bean的类型
*/
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
/**
* 获取指定名称的Bean的所有别名
*/
String[] getAliases(String name);
}
?
HierarchicalBeanFactory是的BeanFactory具有了层次结构,具备了管理双亲IOC容器的功能
public interface HierarchicalBeanFactory extends BeanFactory {
/**
* 返回上一级BeanFatory,如果没有则返回null
*/
BeanFactory getParentBeanFactory();
/**
* 返回本地BeanFactory中是否包含指定Bean名称的Bean,忽略在上一级BeanFactory中的bean
*/
boolean containsLocalBean(String name);
}
?LisableBeanFactory接口继承了BeanFactory接口,一次预加载所有的bean配置
public interface ListableBeanFactory extends BeanFactory {
/**
* 判断是否包含指定名称的bean的配置
*/
boolean containsBeanDefinition(String beanName);
/**
*获取容器中bean的数量
*/
int getBeanDefinitionCount();
/**
* 获取所有Bean的名称
*/
String[] getBeanDefinitionNames();
/**
*获取所有指定类型的bean的名称
*/
String[] getBeanNamesForType(Class<?> type);
/**
* 获取所有指定类型的bean的名称
*/
String[] getBeanNamesForType(Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);
/**
* 获取所有指定类型的Bean的映射,
*/
<T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException;
/**
*查找所有具有指定注解类型的注解的bean
*/
<T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons, boolean allowEagerInit)
throws BeansException;
/**
* 查找所有具有指定注解类型的注解的bean
*/
Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType)
throws BeansException;
/**
* 查找指定Bean上指定注解类型的注解
*/
<A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType);
}
?ApplicationEventPublisher?分装了一个发布ApplicationEvent的功能
public interface ApplicationEventPublisher {
/**
* 通知这个应用注册的所有监听器
*/
void publishEvent(ApplicationEvent event);
}
?MessageSource消息参数化和国际化支持接口
public interface MessageSource {
String getMessage(String code, Object[] args, String defaultMessage, Locale locale);
String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException;
String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;
}
?ApplicationContext
/**
* 为应用提供配置的核心接口。在应用运行期间只读。
* ApplicationContext提供了如下功能:
* 访问应用组件的BeanFactory方法,继承自ListableBeanFactory
* 使用通用方式加载文件资源的能力,继承自ResourceLoader
* 向注册的监听器发布事件的能力,继承自ApplicaitonEventPublisher
* 支持消息国际化的能力,继承自MessageSource
* 继承父上下文。子上下文定义优先于祖先上下文。
*/
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
/**
*返回这个应用上下文的唯一Id,如果没有则返回null
*/
String getId();
/**
*获取应用上下文显示的名称
*/
String getDisplayName();
/**
* 返回应用上下文第一次加载的时间毫秒值
*/
long getStartupDate();
/**
* 获取父上下文,如果没有则返回null
*/
ApplicationContext getParent();
/**
*返回AutoCapableBeanFactory,为这个上下文提供AutowireCapableBeanFactory功能
*/
AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}
?
public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle {
/**
* 上下文配置路径的分割符
*/
String CONFIG_LOCATION_DELIMITERS = ",; \t\n";
/**
* ConversionService bean的名称
*/
String CONVERSION_SERVICE_BEAN_NAME = "conversionService";
/**
* LoadTimeWeaver Bean的名称
*
*/
String LOAD_TIME_WEAVER_BEAN_NAME = "loadTimeWeaver";
/**
* 环境变量Bean的名称
*/
String ENVIRONMENT_BEAN_NAME = "environment";
/**
* 系统属性Bean的名称
*/
String SYSTEM_PROPERTIES_BEAN_NAME = "systemProperties";
/**
* 系统环境变量Bean的名称
*/
String SYSTEM_ENVIRONMENT_BEAN_NAME = "systemEnvironment";
/**
* 设置应用上下文唯一Id
*/
void setId(String id);
/**
* 设置父山下文
*/
void setParent(ApplicationContext parent);
/**
* 获取环境变量
*/
ConfigurableEnvironment getEnvironment();
/**
* 设置环境变量
*/
void setEnvironment(ConfigurableEnvironment environment);
/**
* 注册一个BeanFactoryPostProcessor
*/
void addBeanFactoryPostProcessor(BeanFactoryPostProcessor beanFactoryPostProcessor);
/**
* 注册一个ApplicationEvent监听器
*/
void addApplicationListener(ApplicationListener<?> listener);
/**
*刷新应用上下文
*/
void refresh() throws BeansException, IllegalStateException;
/**
* 注册一个JVM关闭的钩子,在关闭JVM时关闭应用上下文
*/
void registerShutdownHook();
/**
* 关闭应用上下文
*/
void close();
/**
* 判断应用上下文是否处于激活状态
*/
boolean isActive();
/**
* 返回次上下文内部BeanFactory
*/
ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;
}
?
XmlWebApplicationContext源码学习(一)
原文:http://zhangwei-david.iteye.com/blog/2223587