BeanFactory:
Spring Bean的创建是典型的工厂模式,这一系列的Bean工厂,也是IOC容器为开发者管理对象间的依赖关系提供了服务。
其中BeanFactory作为spring最顶层的一个接口类,BeanFactory定义了IOC容器的基本功能规范,BeanFactory有三个子类:ListableBeanFactory、HierarchicalBeanFactory 和AutowireCapableBeanFactory。
从图上的继承结构上看,DefaultListableBeanFactory实现了所有的接口。
ListableBeanFactory表示这些Bean是可列表的。
HierarchicalBeanFactory 表示这些Bean室友继承关系的,也就是每个Bean都有可能有一个父类Bean
AutowireCapableBeanFactory表示Bean自动装配规则。
最基本的IOC容器接口BeanFactory
public interface BeanFactory {
//对FactoryBean的转义定义,
//因为如果使用Bean的名字检索FactoryBean得到的对象是工厂生成的对象
//如果需要得到工厂本身,需要转义
String FACTORY_BEAN_PREFIX = "&";
//根据Bean的名字,获取IOC容器中得到Bean的实例
Object getBean(String name) throws BeansException;
//根据Bean的名字和Class类型来得到Bean的实例,增加了类型安全验证机制
<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;
//提供对Bean的检索,看看是否在IOC容器有这个名字的Bean
boolean containsBean(String name);
//根据Bean的名字得到Bean的实例,并同时判断这个Bean是不是单例
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;
//得到Bean实例的Class类型
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
//得到Bean的别名,如果根据别名检索,那么其原名也会被检索出来
String[] getAliases(String name);
}
在BeanFactory里面只对IOC容器的基本行为作了定义,根本不关系Bean是如何定义怎么加载的。这和工厂设计模式一样,只关心从工厂里得到什么对象,至于工厂是怎么生产的,这个接口一点都不关心。
要想知道工厂是如何生产对象的,得看IOC容器具体如何实现,Spring提供了许多IOC容器的实现。例如XmlBeanFactory,ApplicationContext。
XmlBeanFactory就是针对最基本的IOC容器的实现,这个IOC容器可以读取XML文件定义的BeanFactory,
ApplicationContext是Spring提供的一个高级的IOC容器,它除了能够提供IOC容器的基本功能外,还为用户提供了其他的服务。
1.支持信息源,可以实现国际化。(实现MessageSource 接口)
2.访问资源。(实现ResourcePatternResolver 接口)
3.支持应用事件。(实现ApplicationEventPublisher 接口)
BeanDefinition:
SpringIOC容器管理了我们定义的各种Bean对象及其相互的关系,Bean对象在Spring实现中是BeanFinition来描述,继承关系如下。
Bean 的解析过程非常复杂,功能被分的很细,因为这里需要被扩展的地方很多,必须保证有足够的灵活性,以应对可能的变化。Bean 的解析主要就是对Spring 配置文件的解析。这个解析过程主要通过下图中的类完成。