美文网首页
spring上下文的设计

spring上下文的设计

作者: 小陈中间件 | 来源:发表于2020-07-15 23:00 被阅读0次

核心抽象类的职责

  • ApplicationContext :是整个容器的基本功能定义类。
    ApplicationContext子继承图
    • ConfigurableApplicationContext:大部分的应用上下文都实现了该接口
    • WebApplicationContext:在web应用程序中使用
      • ConfigurableApplicationContext
        ConfigurableApplicationContext父继承图
        • Closeable:接口用于关闭流并且释放与其相关的任何方法,如果流已被关闭,那么调用此方法没有效果。
        public void close() throws IOException; //释放
        
        • Lifecycle:接口对容器生命周期进行控制。
        void start(); //启动组件
        void stop(); //同步方法停止组件
        void isRunning(); //判断组件是否启动
        
    • ConfigurableApplicationContext:接口方法
    void setId(String id); // 设置应用上下文唯一的id
    void setParent(ApplicationContext parent); // 设置应用程序上下文的父级
    void setEnvironment(ConfigurableEnvironment environment); // 设置应用上下文的环境
    ConfigurableEnvironment getEnvironment();  // 获取应用上下文的环境
    // 添加一个新的BeanFactoryPostProcessor
    void addBeanFactoryPostProcessor(BeanFactoryPostProcessor postProcessor);
    // 添加应用程序监听器
    void addApplicationListener(ApplicationListener<?> listener);
    // 添加协议解析器,可能会覆盖默认的规则
    void addProtocolResolver(ProtocolResolver resolver);
    // 加载或者刷新配置
    void refresh() throws BeansException, IllegalStateException;
    // 向JVM runtime注册一个关闭钩子,JVM关闭时关闭这个上下文
    void registerShutdownHook();
    // 应用程序上问下是否是激活状态
    boolean isActive();
    // 获取应用上下文内部的bean factory
    ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;
    
  • AbstractApplicationContext :是整个容器核心处理类,是spring容器真正的执行者,实现了spring 的启动、停止、刷新、时间推送等,主要方法如下。
// 刷新BeanFactory,用于执行实际的配置加载,该方法在其他的初始化工作之前被refresh()方法调用
protected abstract void refreshBeanFactory() throws BeansException, IllegalStateException;
// 关闭BeanFactory,用于释放内部使用的BeanFactory·
protected abstract void closeBeanFactory();
// 获取内部使用的BeanFactory
public abstract ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;
  • GenericApplicationContextGenericApplicationContext继承自AbstractApplicationContext,是为通用目的设计的,能加载各种配置文件,例如xml,properties等等。它的内部持有一个DefaultListableBeanFactory的实例,实现了BeanDefinitionRegistry接口,并且没有假设一个特定的bean definition的format。实现了BeanDefinitionRegistry接口以允许配置任何bean definition reader。为了能够注册bean的定义,refresh()只允许调用一次。
GenericApplicationContext ctx = new GenericApplicationContext();
//使用XmlBeanDefinitionReader
XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(ctx);
//加载ClassPathResource
xmlReader.loadBeanDefinitions(new ClassPathResource("applicationContext.xml"));
PropertiesBeanDefinitionReader propReader = new PropertiesBeanDefinitionReader(ctx);
propReader.loadBeanDefinitions(new ClassPathResource("myBeans.properties"));
//调用Refresh方法
ctx.refresh();
//和其他ApplicationContext方法一样的使用方式
User user= (User) ctx.getBean("User");
  • WebApplicationContextWebApplicationContext是专门为web应用准备的,他允许从相对于web根目录的路劲中装载配置文件完成初始化工作,从WebApplicationContext中可以获得ServletContext的引用,整个Web应用上下文对象将作为属性放置在ServletContext中,以便web应用可以访问spring上下文,spring中提供WebApplicationContextUtilsgetWebApplicationContext(ServletContext src)方法来获得WebApplicationContext对象

  • ConfigurableWebApplicationContextConfigurableWebApplicationContext继承自WebApplicationContextConfigurableApplicationContext,提供了web应用上下文的可配置的能力。相关接口定义如下:

 // 设置web应用上下文的ServletContext
 void setServletContext(@Nullable ServletContext servletContext);
 // 设置web应用上下文的ServletConfig
 void setServletConfig(@Nullable ServletConfig servletConfig);
 // 获取web应用上下文的ServletConfig
 ServletConfig getServletConfig();
 // 设置web应用上下文的命名空间
 void setNamespace(@Nullable String namespace);
 // 获取web应用上下文的命名空间
 String getNamespace();
 // 以初始化参数的形式设置web应用上下文的配置文件位置
 void setConfigLocation(String configLocation);
 // 设置web应用上下文的配置文件的位置
 void setConfigLocations(String... configLocations);
 // 获取web应用上下文的配置文件位置
 String[] getConfigLocations();

相关文章

网友评论

      本文标题:spring上下文的设计

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