spring上下文的设计

核心抽象类的职责

  • 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();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358