BeanFactory与ApplicationContext

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

BeanFactory

BeanFactory与ApplicationContext_第1张图片
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

BeanFactory与ApplicationContext_第2张图片
ClassPathXmlApplicationContext.png
BeanFactory与ApplicationContext_第3张图片
filesystem.png

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

  • GenericGroovyApplicationContext
BeanFactory与ApplicationContext_第4张图片
捕获.PNG
  • AnnotationConfigApplicationContext
BeanFactory与ApplicationContext_第5张图片
AnnotationConfigApplicationContext.PNG

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

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

  • WebApplicationContext
    WebApplicationContext extends ApplicationContext 仅新增一个方法, ServletContext getServletContext(); ServletContext与WebApplicationContext建立关系,使两者项目关联。
BeanFactory与ApplicationContext_第6张图片
webApplicationContext.PNG
  • ConfigurableWebApplicationContext 配置的方式实例化ApplicationContext,setServletContext()setServletConfig setConfigLocations()

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

  • WebApplicationContext初始化,需要ServletContext实例,所有需要Web容器后才能进行初始化,需要在配置自启动Servlet或者监听器,完成初始化工作。

    • 监听器启动

        contextConfigLocation
        
            classpath:conf/spring-mvc.groovy
        


        
            org.springframework.web.context.ContextLoaderListener
        

    • Servlet自启动

  springContextLoaderServlet
org.springframework.web.context.ContextLoaderServlet>

1

你可能感兴趣的:(BeanFactory与ApplicationContext)