美文网首页收藏
BeanFactory与ApplicationContext

BeanFactory与ApplicationContext

作者: 一路摇到顶 | 来源:发表于2017-06-29 21:40 被阅读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 启动刷新上下文的能力。

    • GenericGroovyApplicationContext
    捕获.PNG
    • AnnotationConfigApplicationContext
    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建立关系,使两者项目关联。
    webApplicationContext.PNG
    • ConfigurableWebApplicationContext 配置的方式实例化ApplicationContext,setServletContext()setServletConfig setConfigLocations()

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

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

      • 监听器启动
    <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>
      <servlet-name>springContextLoaderServlet</servlet-name>
    <servlet-class>org.springframework.web.context.ContextLoaderServlet>
    </servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>
    

    相关文章

      网友评论

        本文标题:BeanFactory与ApplicationContext

        本文链接:https://www.haomeiwen.com/subject/vkvvcxtx.html