收藏

BeanFactory与ApplicationContext

2017-06-29  本文已影响98人  一路摇到顶

BeanFactory 与ApplicationContext都是工厂模式中的工厂,但是BeanFactory是面向Spring框架的,ApplicationContext的基础是BeanFactory,大部分应用操作的是ApplicationContext。

BeanFactory

DefaultListableBeanFactory.PNG

BeanFactory 是最顶层的接口,最主要功能就是各种获取Bean的方法。
ListableBeanFactory 拓展支持 访问容器中Bean的方法,通过类获取BeanName,Bean是否存在等工具方法。
HierarchicalBeanFactory 父子容器接口,子容器可以访问父容器。
ConfigurableBeanFactory 对容器提供了可配置性,设置类加载器,属性编辑器等
SingletonBeanRegistry ConfigurableBeanFactory也继承了这个机构提供运行时向容器注册Bean。
AutowireCapableBeanFactory Bean按照规则进行自动装配
AliasRegistry 别名注册
BeanDefinitionRegistry 配置文件中的Bean通过一个BeanDifintion表示,他就代表了Bean的描述信息,提供向容器注入的功能。
Aware 一个标记接口,spring将会在必要时候调用回调接口
BeanNameAware setBeanName() 该Bean在实例化后在当前容器的名字将会当做参数传递进来,继承Aware的主要功能就是在一些回调点,未我们进行一些hook时提供资源。
通过Xml声明一个Bean,在使用BeanFactory获取实例的流程

  1. 获取XML资源。
  2. 实例化一个BeanFactory 如DefaultListableBeanFactory
  3. 需要一个解析Bean属性的工具BeanDefinitionReader的实例如


    bean.PNG
  4. BeanDefinitionReader解析resource
  5. beanfactory生成bean
   DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
        XmlBeanDefinitionReader x = new XmlBeanDefinitionReader(factory);
        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
            Resource resources = resourcePatternResolver.getResource("classpath:com/smart/beans1.xml");
        x.loadBeanDefinitions(resources);

        Car car = factory.getBean("car1",Car.class);
        car.introduce();

BeanFactory启动后不会去实例化注册进来的Bean,会在第一个调用getBean() 时去具体实例化bean,如果是单例模式的Bean将会被保存缓存中,下次将会直接从缓存中获取。

ApplicationContext

ApplicationContext同样是有BeanFactory派生出来的,提供了很多面向实际应用的功能,主要实现类

ClassPathXmlApplicationContext与FileSystemXmlApplicationContext

ClassPathXmlApplicationContext.png filesystem.png

主要接口 ApplicationContext 继承与 ListableBeanFactory、HierarchicalBeanFactory、ApplicationEventPublisher:提供容器发布上下文事件的功能,如容器启动事件,关闭事件等实现了ApplicationListener就可以接收处理到这些事件。
MessageSource i18n国际化支持
ResourcePatternResolver 提供资源查找功能
Lifecycle 控制异步处理过程
ConfigurableApplicationContext 提供一些配置项,如refresh(),使ApplicationContext 启动刷新上下文的能力。

捕获.PNG AnnotationConfigApplicationContext.PNG

这些ApplicationContext继承与GenericApplicationContext(通用),提供特别的Bean声明方式,从而可以对Bean进行实例化等操作。

    ApplicationContext ctx = new AnnotationConfigApplicationContext(Beans.class);
        Car car =ctx.getBean("car",Car.class);

webApplicationContext.PNG

通样WebApplicationContext也提供了支持不同Bean声明的方式的ApplicationContext。

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath:conf/spring-mvc.groovy
        </param-value>
</context-param>
<listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
</listener>
<servlet>
  <servlet-name>springContextLoaderServlet</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet>
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
上一篇下一篇

猜你喜欢

热点阅读