springboot~ConfigurableListableBeanFactory和ApplicationContext的使用场景
在工具类中封装getBean,使用哪个接口来实现
实事上,在工具类中,实现BeanFactoryPostProcessor和ApplicationContextAware接口后,使用它们构造方法里的对象ConfigurableListableBeanFactory和ApplicationContext都可以很方便的获取spring容器里的bean,而在实际应用时,还有有些不同的,比如在我们的@Configuration配置类中,我直接使用ApplicationContextAware里的ApplicationContext对象来获取bean,我是否工具类里的,它是无法正常得到ApplicationContext对象的,也就无法获取bean了;而如果实现的是BeanFactoryPostProcessor接口,通过它的ConfigurableListableBeanFactory对象来获取bean,结果是正常的,我应该与这两个的加载机制有关吧。
总结:当你封装一个SpringUtils工具类时,获取bean对象的方法时,最好使用BeanFactoryPostProcessor接口里的ConfigurableListableBeanFactory对象,这样可以避免NPE(NullPointerException)的问题。
使用场景和功能
ConfigurableListableBeanFactory
和 ApplicationContext
都是 Spring 容器的接口,它们有各自的使用场景和功能:
-
ConfigurableListableBeanFactory 的使用场景:
-
Bean 定义和注册:
ConfigurableListableBeanFactory
可用于创建和注册 Bean 的定义,通常在编程式配置 Spring 容器时使用。这对于需要动态创建和注册 Bean 定义的情况很有用。 -
Bean 的延迟初始化:您可以使用
ConfigurableListableBeanFactory
来设置 Bean 的延迟初始化属性,使容器只在需要时创建 Bean 实例。 -
Bean 后处理器:如果您需要自定义 Bean 后处理器,可以使用
ConfigurableListableBeanFactory
来注册这些处理器,以对 Bean 实例进行定制化的初始化或销毁操作。 -
基本的 Bean 检索:虽然
ConfigurableListableBeanFactory
也允许您检索 Bean 实例,但它通常用于基本的编程式 Bean 检索,例如通过 Bean 名称检索。
-
-
ApplicationContext 的使用场景:
-
应用程序上下文管理:
ApplicationContext
是 Spring 应用程序的主要上下文管理器。它通常用于加载和管理应用程序的配置,包括 Bean 定义、配置文件、资源、国际化等。 -
依赖注入:
ApplicationContext
是依赖注入的核心容器,它负责创建、配置和管理 Bean 实例,并确保它们的依赖关系被满足。 -
AOP 和事务管理:
ApplicationContext
提供了 AOP 和事务管理的支持,您可以配置切面、通知和事务策略。 -
国际化和消息源:
ApplicationContext
提供了国际化和消息资源管理的功能,使应用程序能够支持多语言和本地化。 -
事件发布:
ApplicationContext
支持应用程序内部事件的发布和监听,这对于实现松耦合的组件通信非常有用。 -
Web 应用程序上下文:Spring 的
WebApplicationContext
扩展了ApplicationContext
,提供了在 Web 应用程序中的特定功能,如 Servlet 上下文和 Web 事件处理。
-
总的来说,ConfigurableListableBeanFactory
主要用于编程式配置和基本的 Bean 定义、检索以及自定义 Bean 处理。ApplicationContext
是一个更高级的容器,适用于应用程序上下文管理、依赖注入、AOP、事务、国际化、事件发布等高级功能,特别适合开发应用程序。在大多数情况下,应用程序中使用的容器通常是 ApplicationContext
或其派生类型。
区别
getBean
方法在 ConfigurableListableBeanFactory
和 ApplicationContext
接口中都存在,但它们之间有一些重要的区别,主要涉及到 Spring 容器的层次结构和功能。
-
ConfigurableListableBeanFactory:
ConfigurableListableBeanFactory
是 Spring 容器中 Bean 工厂的接口,它提供了访问和操作 Bean 定义和实例的基本方法。getBean
方法允许从容器中获取指定名称的 Bean 实例,但通常需要传递类型参数用于类型安全检查。这意味着它返回的是原始 Bean 实例,你需要自行转型为具体的对象。ConfigurableListableBeanFactory
不提供高级功能,如国际化、事件发布、AOP等,因为它的主要职责是管理 Bean 的定义和创建。
-
ApplicationContext:
ApplicationContext
是 Spring 容器的更高级别接口,它扩展了ConfigurableListableBeanFactory
并添加了更多功能。getBean
方法在ApplicationContext
中除了允许获取 Bean 实例外,还允许传递 Bean 类型和其他可选参数来更精确地检索 Bean。它返回的是 Bean 对象,无需手动进行类型转换。ApplicationContext
提供了更多的功能,如国际化、事件发布、资源访问、AOP代理等。它还支持扩展,允许通过自定义的 Bean 后处理器等方式干预容器的行为。
总的来说,ConfigurableListableBeanFactory
是一个较低级别的 Bean 工厂接口,主要用于 Bean 的创建和管理。ApplicationContext
则是更高级别的接口,它构建在 ConfigurableListableBeanFactory
之上,并提供了更多功能和便捷性,通常更适合应用程序的上下文管理。