spring源码分析1
采用的spring1.0.0版本的源码,我一直认为spring中的一些设计思想从最初版本就已经确定了,后续的版本只是不断的优化该思想,spring1.0中还没有基于注解的配置,也便于我们分析理解,主要的还是以xml的形式配置bean,源码下载地址
spring IOC
我们看spring相关教程中,在spring IOC容器中,由spring管理bean与bean之间的依赖,本节主要从源码层面分析,spring是如何管理bean与bean之间的依赖
在spring ioc中,我们听的比较多的有FactoryBean、BeanFactory、ApplicationContext,如果看过spring bean的加载顺序可能还听过,BeanNameAware、BeanFactoryAware、InitializingBean等等,面试中也经常问道IOC有关的知识
慢慢来,我们一个一个分析
BeanFactory继承关系介绍
BeanFactory从名字上看,是bean工厂,是管理bean的地方,从源码的注解上来看,是一个接口,实现类可以持有一些bean定义,每个bean定义都有一个名字。可以看出IOC容器一定实现了beanFactory
Interface to be implemented by objects that hold a number of bean definitions,each uniquely identified by a String name.
看看它有哪些接口,英文注释太多了,我添加了一些我自己的理解
public interface BeanFactory {
//根据bean名称获取bean实例
Object getBean(String name) throws BeansException;
//根据bean名称与bean类型获取bean实例
Object getBean(String name, Class requiredType) throws BeansException;
//IOC容器是否含有bean名称的实例
boolean containsBean(String name);
//IOC容器含有bean名称的实例是否为单例
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
//IOC容器含有bean名称的实例的别名
String[] getAliases(String name) throws NoSuchBeanDefinitionException;
}
在spring1.0中,继承BeanFactory如图所示
我们使用的最多的还是ApplicationContext接口
public interface ApplicationContext
extends ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ResourceLoader {
ApplicationContext getParent();
String getDisplayName();
long getStartupDate();
void publishEvent(ApplicationEvent event);
}
MessageSource定义了国际化相关的方法,ResourceLoader定义了根据路径获取资源文件的方法,ListableBeanFactory在BeanFactory的基础上增加了beanDefinition的相关接口
public interface ListableBeanFactory extends BeanFactory {
//bean定义数量
int getBeanDefinitionCount();
//所有bean定义名称
String[] getBeanDefinitionNames();
//根据类型返回所有bean定义名称
String[] getBeanDefinitionNames(Class type);
//是否含有bean名称的bean定义
boolean containsBeanDefinition