Spring之ApplicationContext

发布时间 2023-11-19 17:10:19作者: 残城碎梦

ApplicationContext

ApplicationContext是Spring的高级容器。

与BeanFactory类似,它可以加载bean定义并根据请求分发bean;此外,它还添加了很多特定的功能,比如:从属性文件解析文本消息、将应用程序事件发布到感兴趣的事件侦听器。

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
        MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
}

Spring提供了适合不同需求的ApplicationContext,每个应用程序上下文可以拥有多个配置文件、配置类或两者的混合,相关类图见下图:

ConfigurableApplicationContext

ConfigurableApplicationContext 扩展自 ApplicationContext,新增了 reflesh() 和 close() 这两个方法,使得其具有启动、刷新和关闭应用上下文的能力:

(1)在应用上下文关闭的情况下调用 refresh() 即可启动应用上下文;在应用上下文启动的情况下调用 reflesh() 即可清除缓存并且重新装载配置信息;

(2)调用 close() 方法则可以关闭应用上下文。 

AbstractApplicationContext 等子类实现了 refresh() 方法

ApplicationContext实现类

FileSystemXmlApplicationContext

通过FileSystemXmlApplicationContext可以从文件系统或url加载基于XML的Spring配置文件。

应用代码如下:

String path = "D:/source/Test/src/main/resources/applicationcontext/bean-config.xml";

ApplicationContext context = new FileSystemXmlApplicationContext(path);
AccountService accountService = context.getBean("accountService", AccountService.class);

ClassPathXmlApplicationContext

通过ClassPathXmlApplicationContext可以从类路径加载基于XML的Spring配置文件。

应用代码如下:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationcontext/bean-config.xml");
AccountService accountService = context.getBean("accountService", AccountService.class);

AnnotationConfigApplicationContext

AnnotationConfigApplicationContext是在Spring 3.0中引入的(与@Configuration、@Component和JSR-330元数据注释等一起工作)。

应用代码如下:

ApplicationContext context = new AnnotationConfigApplicationContext(AccountConfig.class);
AccountService accountService = context.getBean(AccountService.class);

ConfigurableWebApplicationContext

AnnotationConfigWebApplicationContext

AnnotationConfigWebApplicationContext是AnnotationConfigApplicationContext的一个基于web的变体。

从Spring 3.0开始,可以通过编程方式配置ApplicationContext,开发人员需要做的是实现WebApplicationInitializer接口。

public class MyWebApplicationInitializer implements WebApplicationInitializer {

    public void onStartup(ServletContext container) throws ServletException {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(AccountConfig.class);
        context.setServletContext(container);

        // servlet configuration
    }
}

XmlWebApplicationContext

如果在web应用程序中使用基于XML的配置可以使用XmlWebApplicationContext;类似AnnotationConfigWebApplicationContext,可以通过实现WebApplicationInitializer接口来配置应用程序。

应用代码如下:

public class MyXmlWebApplicationInitializer implements WebApplicationInitializer {

  public void onStartup(ServletContext container) throws ServletException {
    XmlWebApplicationContext context = new XmlWebApplicationContext();
    context.setConfigLocation("/WEB-INF/spring/applicationContext.xml");
    context.setServletContext(container);

    // Servlet configuration
  }
}