Spring 基础2 —— 容器

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 配置文件中


容器事件的触发时机:

  • 系统创建 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 —— 容器)