话不多说,先上图:
ConfigurableApplicationContext是Spring框架中的一个接口,它继承了ApplicationContext接口,并扩展了一些额外的方法,用于允许应用程序在运行时动态地修改和管理应用上下文。ConfigurableApplicationContext接口提供了设置上下文ID、设置父应用上下文、添加监听器、刷新容器、关闭和判断是否活跃等方法。
此外,ConfigurableApplicationContext还新增了两个主要方法:refresh()和close(),使得ApplicationContext具有启动、刷新和关闭的功能。
从继承层次上看,ApplicationContext是ConfigurableApplicationContext的父接口,因为它定义了ApplicationContext的基本功能和行为。因此,ConfigurableApplicationContext包含了ApplicationContext的所有功能。这意味着在Spring框架的设计中,ConfigurableApplicationContext位于ApplicationContext的基础之上,为应用程序提供了更多的灵活性和动态配置能力。
ConfigurableApplicationContext与ApplicationContext的具体区别是什么?
-
接口继承关系:ApplicationContext是一个接口,而ConfigurableApplicationContext是它的子接口。这意味着ConfigurableApplicationContext继承了ApplicationContext的功能,但提供了更多的配置选项。
-
方法访问权限:ApplicationContext接口提供的方法都是只读的,不允许直接访问。只有通过子接口ConfigurableApplicationContext,才能对这些方法进行配置。
-
返回值类型:当调用ApplicationContext的run方法时,实际上是返回一个类型为ConfigurableApplicationContext的对象,这个对象可以用来配置应用程序的上下文。
-
配置能力:ConfigurableApplicationContext提供了修改bean定义、激活环境、注册shut-down hook等能力,这些都是ApplicationContext所没有的功能。
-
资源管理:ConfigurableApplicationContext还涉及到资源管理的问题,例如解决资源泄漏问题时,需要导入特定的包以使用ConfigurableApplicationContext的强转类型。
-
Web应用场景:ConfigurableApplicationContext也支持Web应用场景,与WebApplicationContext一起,构成了Spring应用框架的核心组成部分。
ConfigurableApplicationContext相比于ApplicationContext,增加了更多的配置能力,如修改bean定义、激活环境等,同时也支持Web应用场景,是Spring框架中不可或缺的一部分。
如何在Spring框架中使用ConfigurableApplicationContext进行动态配置?
-
创建ConfigurableApplicationContext对象:首先需要创建一个ConfigurableApplicationContext对象。这是因为ConfigurableApplicationContext是应用的上下文信息,其中包含了Environment环境信息。可以通过
SpringApplication.run ()
方法来启动应用程序,并使用spring.servlet.multipart.location
配置来指定应用运行时的文件传输方式。 -
使用ApplicationContextInitializer进行初始化:ApplicationContextInitializer是Spring框架中的一个概念,它的主要目的是在ConfigurableApplicationContext类型(或者子类型)的ApplicationContext上执行refresh操作。这意味着可以在应用程序启动时,通过调用
ApplicationContextInitializer.init ()
方法来初始化ApplicationContext,从而为应用程序提供动态配置的能力。 -
动态刷新配置:Spring Cloud提供了配置管理和动态监听的机制,允许开发者动态更新配置。这包括自定义刷新事件和强制刷新上下文等方式,以实现更灵活的配置更新。例如,可以通过配合RefreshScope实现自动刷新配置,或者通过创建一个新的ConfigurableApplicationContext进行配置的加载和刷新。
-
动态获取配置参数:Spring Boot提供了多种方式动态获取配置参数,如通过application.properties 或application.yml 文件定义配置参数,然后通过注解在代码中读取这些参数。这种方式适用于需要在运行时动态调整配置的场景。
使用ConfigurableApplicationContext进行动态配置主要涉及到创建ConfigurableApplicationContext对象、使用ApplicationContextInitializer进行初始化、动态刷新配置以及动态获取配置参数等步骤。这些方法可以帮助开发者根据实际需求动态地调整应用的配置,提高开发效率和系统的灵活性。
ConfigurableApplicationContext的refresh()和close()方法具体如何实现?
ConfigurableApplicationContext的refresh()方法用于重新加载Spring应用上下文中的配置和bean定义,同时启动所有相关的bean。这个方法是通过继承AbstractApplicationContext类来实现的,因为AbstractApplicationContext作为ConfigurableApplicationContext的实现类实现了refresh()方法。具体到SpringIOC的实现,refresh()方法会在初始化时执行,以确保所有配置都被正确加载和初始化入用例中。
close()方法则用于关闭应用程序的上下文并销毁它,释放所有已经占用的资源,包括所有bean的占用的资源,关闭应用程序上下文的底层连接,关闭JVM等。这个方法可以通过创建一个新的上下文并调用close()方法来实现,或者在需要的地方执行context.close 方法来完成关闭。此外,如果想要关闭现在使用的context,最简单的方式就是使用actuator的shutdown端点,但这可能不是最优雅或最安全的方式。
ConfigurableApplicationContext的refresh()方法通过继承AbstractApplicationContext类并在实现中调用来实现,主要用于重新加载配置和启动相关bean。而close()方法则用于关闭应用上下文,释放资源并关闭底层连接等操作。
在Spring框架中,ConfigurableApplicationContext的应用场景有哪些?
-
Web应用中的初始化:ConfigurableApplicationContext用于初始化Spring ConfigurableApplicationContext应用上下文,这是因为在Web应用中需要通过编程方式对应用上下文进行初始化。这种方式可以帮助开发者更灵活地配置应用上下文的属性和环境信息,从而提高应用的可维护性和可扩展性。
-
注册属性源或针对上下文的环境信息激活:ConfigurableApplicationContext还可以用于注册属性源(property sources)或者针对上下文的环境信息(environment)进行激活。这种方式允许开发者根据需要动态地配置应用上下文,以适应不同的应用需求。
-
Spring Boot应用程序中的获取方式:Spring Boot应用程序中获取ConfigurableApplicationContext的方式,与在标准Spring应用中有所不同。在Spring Boot中,获取ConfigurableApplicationContext的方式更加灵活,提供了顶层接口Configurable和Abstract等特性,使得开发者能够更方便地管理和配置应用上下文。
ConfigurableApplicationContext在Spring框架中的应用场景主要涉及到Web应用的初始化、属性源的注册与环境的激活,以及Spring Boot应用程序的灵活性配置。这些应用场景展示了ConfigurableApplicationContext在提高开发效率和降低维护成本方面的重要作用。
ConfigurableApplicationContext与applocationContext的区别和联系是什么?
ConfigurableApplicationContext是一个可配置的应用上下文,它允许开发者通过配置文件来动态地设置应用上下文的属性,如服务器地址、数据库连接信息等。而ApplicationContext接口本身则是read-only的,这意味着它不能被修改,只能读取已有的配置信息。
联系方面,ConfigurableApplicationContext是ApplicationContext的子接口,大部分的应用上下文都实现了这个接口。这表明ConfigurableApplicationContext在Spring框架中扮演着一个基础组件的角色,为其他应用上下文提供了可定制化的能力。例如,WebApplicationContext就是基于ConfigurableApplicationContext实现的,专门用于Web应用程序中。此外,从ConfigurableApplicationContext的子类可以看出,它与AbstractApplicationContext有着紧密的联系,后者是Spring框架中最基本的应用层组件。
ConfigurableApplicationContext与ApplicationContext之间的区别在于它们的实现方式和功能,ConfigurableApplicationContext提供了更灵活的配置能力,而ApplicationContext则是Spring框架中最基础的应用上下文,两者都依赖于ConfigurableApplicationContext来实现更复杂的应用逻辑。同时,ConfigurableApplicationContext也是ApplicationContext体系中不可或缺的一部分,它通过继承自AbstractApplicationContext来与其他应用上下文进行交互。