美文网首页
Spring 基础2 —— 容器

Spring 基础2 —— 容器

作者: WesleyLien | 来源:发表于2017-12-13 21:36 被阅读0次

    Spring 容器(Spring 上下文)是生成 Bean 实例的工厂,负责配置、创建并管理容器中的 Bean ,包括 Bean 的生命周期

    Spring 容器的接口有:BeanFactory 接口和 ApplicationContext 接口,其中 ApplicationContext 接口是 BeanFactory 接口的子接口,它们之间的区别为:Spring中ApplicationContext和beanfactory区别,通常使用 ApplicationContext 接口作为 Spring 的容器

    ApplicationContext 相较于 BeanFactory 的优点有:

    • 允许声明式创建启动容器。如在 Web 应用中利用 ContextLoader 支持类在 Web 应用启动时自动创建 ApplicationContext
    • 继承 MessageSource 接口,因而提供国际化支持
    • 资源访问。如 URL 和 文件
    • 事件机制
    • 载入多个配置文件

    ApplicationContext 的 架构:Spring context架构--静态结构

    Spring 容器的实现类有:

    • BeanFactory :
      • XmlBeanFactory
    • ApplicationContext :
      • FileSystemXmlApplicationContext
      • ClassPathXmlApplicationContext
      • AnnotationConfigApplicationContext
      • XmlWebApplicationContext (在 Web 应用中使用的容器)
      • AnnotationConfigWebApplicationContext (在 Web 应用中使用的容器)

    实例化容器:

    //利用FileSystemResource读取配置文件
    Resource r = new FileSystemResource("applicationContext.xml");
    //利用XmlBeanFactory来加载配置文件,启动IOC容器
    BeanFactory f = new XmlBeanFactory(r);
    
    //加载 classpath 下的 applicationContext.xml 文件创建 Resource 对象
    ClassPathResoure r = new ClassPathResoure("applicationContext.xml");
    //利用XmlBeanFactory来加载配置文件,启动IOC容器
    BeanFactory f = new XmlBeanFactory(r);
    
    ApplicationContext appContext = new ClassPathXmlApplicationContext(new String[] {"applicationContext1.xml", applicationContext2.xml});
    

    从 IOC 容器中获取 Bean 实例

    Person person = (Person) f.getBean("person");
    

    为 Spring 容器注册关闭钩子。可保证 Spring 容器被恰当的关闭,并自动执行 singleton Bean 的析构回调方法

    f.registerShutdownHook();
    

    ApplicationContext 的事件机制

    通过 ApplicationEvent 类和 ApplicationListener 接口,可以实现 ApplicationContext 事件处理

    ApplicationEvent 指容器事件,由 ApplicationContext 发布(即在 Java 程序中显式触发)

    ApplicationEvent 类的实现类不需实现任何方法

    public class EmailEvent extends ApplicationEvent {
        
        public String address;
        public Strint text;
        
        // 省略 getter 和 setter
    }
    

    容器事件的监听器必须实现 ApplicationListener 接口,实现接口方法 onApplicationEvent(ApplicationEvent event),当容器内发生任何事件,此方法被触发

    public class EmailListener implements ApplicationListener {
    
        public void onApplicationEvent(ApplicationEvent event) {
            
            ...
        }
    }
    

    将监听器配置在 Spring xml 配置文件中

    <bean class="com.lian.listener.EmailListener"/>
    

    容器事件的触发时机:

    • 系统创建 Spring 容器
    • 加载 Spring 容器
    • 程序调用 ApplicationContext 的 publishEvent() 方法主动触发
      ...
      EmailEvent event = new EmailEvent();
      context.publishEvent(event);
      
    • 销毁前

    Spring 的内置事件有:

    • ContextRefreshedEvent
      ApplicationContext 初始化(指所有 Bean 被成功加载,后处理器 Bean 被检测并激活,所有 Singleton Bean 被预实例化,ApplicationContext 已就绪可用)或刷新触发该事件
    • ContextStartedEvent
      当使用 ConfigurableApplicationContext 接口的 start() 方法启动 ApplicationContext 容器时触发该事件
    • ContextClosedEvent
      当使用 ConfigurableApplicationContext 接口的 close() 方法关闭 ApplicationContext 容器时触发该事件
    • ContextStoppedEvent
      当使用 ConfigurableApplicationContext 接口的 stop() 方法停止(容器可用 start() 方法重新启动) ApplicationContext 容器时触发该事件
    • RequestHandledEvent
      Web 相关事件,只能应用于使用 DispatcherServlet 的 Web 应用(当使用 SpringMVC 时,当 Spring 处理用户请求结束后,触发该事件)

    ApplicationContext 的国际化支持

    相关文章

      网友评论

          本文标题:Spring 基础2 —— 容器

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