Spring笔记--工厂的接口设计

39 阅读3分钟

ApplicationContext

在最初使用Spring进行学习的时候,应该使用的是:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");  
ApplicationContext applicationContext = new AnnoatationConfigApplicationContext("application.xml"); 

或者

BeanFactory factory = new XmlBeanFactory("application.xml");

这两种方式通过调用getBean来获取一个bean对象,之前一直不理解为什么会冒出来一个ApplicationContext出来,不是应该使用BeanFactory来进行bean的创建和管理吗?在经过学习之后可以发现ApplicationContext可以说Spring容器设计体系中的集大成者。接下来就现在看一下Spring中的各个容器接口。

image.png 在上面这张图中可以看到BeanFactory作为这个容器体系的最顶层的设计,其中就提供了Bean的获取的方法。在这个跟接口下面则是又有这个众多的子接口,来在自己的父接口的基础上进行叠加更多的新功能和特性。他们有些是为最底层最终的实现类提供基础服务,有些容器则是表明了特定的使用场景。总之,Spring容器的设计过程就是一个叠加的过程。 这也足以说明Spring设计工厂体系的实现,不断的遵循的职责单一的设计规则
现在可以看一下直接继承了BeanFactory的三个接口和一个间接继承的接口:

  1. AutowireCapableBeanFactory:具有自动注入能力的工厂,也就是这个工厂为@Autowire提供了实现,不仅如果对于一个Bean的初始化和销毁即initializeBean和destroyBean方法的操作也是由这个工厂实现的。最后重要的是,对于BeanFactory来说它只是提供了Bean获取操作,而Bean的创建操作则是由AutowireCapableBeanFactory提供的:createBean来进行实现。
  2. HierarchicalBeanFactory:具有继承能力的工厂,其实就是具有父子容器关系的工厂,不过这个工厂只可以去获取父容器因此一般情况不会单独使用它需要和另一个容器工厂一起使用。另一个方法就是:containsLocalBean(),这个方法可以只在本身的容器中去寻找一个Bean,而不去父容器中去寻找。
  3. ListableBeanFactory:具有批量获取bean的能力,这个工厂的的作用就是根据某一个条件去获取一批bean实例或者以及bean的一些相关信息(beanName)。有了这个工厂我们可以通过注解、Class类型去获取Bean
  4. ConfigurableBeanFactory:是一个工厂具有可配置化的能力,这就意味着可以去对工厂进行配置,其中可以添加Bean的后处理器,类型转换器、为此工厂设置一个父工厂、设置当前Bean的Scope(singleton和prototype)等等,因此这个工厂就具备的较为全面的能力。

而ApplicationContext虽然作为一个集大成者,但是其中的很多功能都不是靠它自己完成的,而是通过委托的方式,把专业的事情交给专业的人去做,因此就人如其名一样,ApplicationContext翻译过来就是应用上下文,而他本身就是一个统筹的角色,协调内部的对象完成一个bean的创建和加载。