无锡网站制作,做网站我网站找第三方支付,夏天做哪个网站能致富,网站做流量的论坛贴吧SpringBoot源码系列文章
SpringBoot源码解析(一)#xff1a;SpringApplication构造方法
SpringBoot源码解析(二)#xff1a;引导上下文DefaultBootstrapContext
SpringBoot源码解析(三)#xff1a;启动开始阶段
SpringBoot源码解析(四)#xff1a;解析应用参数args
Sp…SpringBoot源码系列文章
SpringBoot源码解析(一)SpringApplication构造方法
SpringBoot源码解析(二)引导上下文DefaultBootstrapContext
SpringBoot源码解析(三)启动开始阶段
SpringBoot源码解析(四)解析应用参数args
SpringBoot源码解析(五)准备应用环境
SpringBoot源码解析(六)打印Banner
SpringBoot源码解析(七)应用上下文结构体系 目录 前言一、AnnotationConfigServletWebServerApplicationContext类图二、AnnotationConfigServletWebServerApplicationContext组件功能解析1、BeanFactoryBean管理核心接口2、HierarchicalBeanFactory支持父子容器3、ListableBeanFactory批量获取Bean4、MessageSource国际化消息支持5、EnvironmentCapable环境变量访问能力6、ResourcePatternResolver资源路径解析器7、ApplicationEventPublisher发布事件8、ApplicationContext应用上下文核心接口9、LifecycleBean生命周期管理接口10、ConfigurableApplicationContext可配置应用上下文11、WebApplicationContextweb应用上下文12、ConfigurableWebApplicationContext可配置web应用上下文13、WebServerApplicationContextweb服务应用上下文14、ConfigurableWebServerApplicationContext可配置web服务应用上下文15、AbstractApplicationContext抽象应用上下文16、BeanDefinitionRegistryBean定义注册接口17、GenericApplicationContext通用应用上下文18、GenericWebApplicationContextweb通用应用上下文19、ServletWebServerApplicationContextweb服务通用上下文20、AnnotationConfigRegistry注解配置注册器21、AnnotationConfigServletWebServerApplicationContext注解驱动web服务应用上下文 总结 前言 在解析SpringBoot源码之前需要对其使用的应用上下文ApplicationContext相关组件有清晰的了解。SpringBoot的核心在于基于Spring的扩展其自动配置机制、嵌入式Web容器等特性都依赖于一套规范的上下文组件。因此提前理清这些核心组件的功能和职责可以显著提高源码阅读的效率避免频繁地在代码中跳转而迷失方向。 SpringBoot在调用SpringApplication.run()方法启动时根据应用类型如 Servlet 类型通过createApplicationContext()方法推断并创建AnnotationConfigServletWebServerApplicationContext用于初始化和管理 Web 应用的上下文环境。 一、AnnotationConfigServletWebServerApplicationContext类图 类图如下摆这个图用我好长时间♂️每个类的作用将在下面进行简要分析。 二、AnnotationConfigServletWebServerApplicationContext组件功能解析
1、BeanFactoryBean管理核心接口 BeanFactory是Spring框架中最基础的IOCInversion of Control控制反转容器接口它负责创建、管理和配置应用中的Bean对象并处理Bean的依赖注入与生命周期管理。BeanFactory支持延迟加载懒加载即在首次请求时才实例化Bean适用于轻量级应用或资源受限的环境。
public interface BeanFactory {// bean名称前加返回的FactoryBean工厂实例否则返回实际创建类型实例String FACTORY_BEAN_PREFIX ;// 根据指定的名称获取Bean实例// 返回的实例可能是单例模式下的共享实例也可能是每次请求都会创建的新实例具体取决于 Bean 的配置// 如果容器中不存在该名称的 Bean则会抛出异常Object getBean(String name) throws BeansException;// 根据指定的名称和类型获取Bean实例// 如果名称对应的 Bean 类型与指定的类型不匹配则会抛出异常T T getBean(String name, ClassT requiredType) throws BeansException;// 根据指定的名称和参数获取Bean实例Object getBean(String name, Object... args) throws BeansException;// 根据指定的类型获取唯一匹配的Bean实例// 如果容器中不存在该类型的 Bean或者存在多个该类型的 Bean则会抛出异常 T T getBean(ClassT requiredType) throws BeansException;// 根据指定的类型和参数获取Bean实例T T getBean(ClassT requiredType, Object... args) throws BeansException;// 返回一个可以提供指定类型Bean的ObjectProvider对象// ObjectProvider不会立即实例化Bean只有在调用其方法时才会加载或创建BeanT ObjectProviderT getBeanProvider(ClassT requiredType);// 通过ResolvableType可以获取复杂类型或泛型Bean// 可以定义复杂的泛型结构如 ListMyBean、MapString, MyBean 等T ObjectProviderT getBeanProvider(ResolvableType requiredType);// 检查容器中是否存在指定名称的 Beanboolean containsBean(String name);// 检查指定名称的Bean是否为单例一个类只能有一个实例boolean isSingleton(String name) throws NoSuchBeanDefinitionException;// 检查指定名称的Bean是否为原型每次获取返回一个新实例boolean isPrototype(String name) throws NoSuchBeanDefinitionException;// 检查指定名称的Bean是否匹配某个ResolvableType// 例如检查一个Bean是否是ListString类型boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;// 检查指定名称的Bean是否匹配某个Class类型// 这是基础的类型匹配检查不支持泛型但速度更快boolean isTypeMatch(String name, Class? typeToMatch) throws NoSuchBeanDefinitionException;// 返回Bean的Class类型不考虑FactoryBean情况NullableClass? getType(String name) throws NoSuchBeanDefinitionException;// 返回Bean的Class类型// allowFactoryBeanInittrue,初始化FactoryBean返回实际类型NullableClass? getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;// 获取Bean的所有别名String[] getAliases(String name);
}2、HierarchicalBeanFactory支持父子容器 HierarchicalBeanFactory是Spring框架中定义的一个接口它扩展了BeanFactory用于支持Bean工厂的层次化结构管理。它的设计目的是允许一个Bean工厂拥有父级Bean工厂并能够在当前Bean工厂和父级工厂之间协调Bean的管理和查找。
public interface HierarchicalBeanFactory extends BeanFactory {// 返回父级Bean工厂如果没有父级则返回nullNullableBeanFactory getParentBeanFactory();// 判断本地 Bean 工厂是否包含指定名称的 Bean忽略父级上下文中定义的 Beanboolean containsLocalBean(String name);
}
3、ListableBeanFactory批量获取Bean ListableBeanFactory是Spring框架中的一个接口它扩展了BeanFactory提供了按照类型、名称等多种方式列出Bean的功能。它是Spring应用上下文中一个核心接口用于管理和访问Bean。
// 只考虑当前工厂检查范围限定为当前工厂的直接定义部分
// 不考虑层次结构不会递归查询父工厂或祖先工厂中的定义
public interface ListableBeanFactory extends BeanFactory { // 检查此 Bean 工厂是否包含具有给定名称的 Bean 定义boolean containsBeanDefinition(String beanName);// 返回工厂中定义的 Bean 数量int getBeanDefinitionCount();// 返回此工厂中定义的所有 Bean 的名称String[] getBeanDefinitionNames();// 返回一个可以提供指定类型Bean的ObjectProvider对象可选择是否延迟初始化T ObjectProviderT getBeanProvider(ClassT requiredType, boolean allowEagerInit);// 返回一个可以提供复杂指定类型Bean的ObjectProvider对象可选择是否延迟初始化T ObjectProviderT getBeanProvider(ResolvableType requiredType, boolean allowEagerInit);// 返回与给定类型包括给定类型子类匹配的 Bean 名称String[] getBeanNamesForType(ResolvableType type);// 返回与给定复杂类型包括给定子类匹配的 Bean 名称// 并允许对非单例 Bean 和延迟加载 Bean 进行控制String[] getBeanNamesForType(ResolvableType type, boolean includeNonSingletons, boolean allowEagerInit);// 返回与给定类型包括子类匹配的 Bean 名称String[] getBeanNamesForType(Nullable Class? type);// 返回与给定类型包括子类匹配的 Bean 名称// 并允许对非单例 Bean 和延迟加载 Bean 进行控制String[] getBeanNamesForType(Nullable Class? type, boolean includeNonSingletons, boolean allowEagerInit);// 返回一个 Map包含匹配的 Bean 名称和对应的 Bean 实例T MapString, T getBeansOfType(Nullable ClassT type) throws BeansException;// 返回一个 Map包含匹配的 Bean 名称和对应的 Bean 实例// 并允许对非单例 Bean 和延迟加载 Bean 进行控制T MapString, T getBeansOfType(Nullable ClassT type, boolean includeNonSingletons, boolean allowEagerInit)throws BeansException;// 查找带有指定注解的所有 Bean 名称String[] getBeanNamesForAnnotation(Class? extends Annotation annotationType);// 一个 Map包含匹配的 Bean 名称和对应带指定注解的Bean实例MapString, Object getBeansWithAnnotation(Class? extends Annotation annotationType) throws BeansException;// 用于查找指定 Bean 上的特定类型注解并返回该注解的实例NullableA extends Annotation A findAnnotationOnBean(String beanName, ClassA annotationType)throws NoSuchBeanDefinitionException;// 用于查找指定 Bean 上的特定注解并提供一个参数来控制是否允许初始化 FactoryBeanNullableA extends Annotation A findAnnotationOnBean(String beanName, ClassA annotationType, boolean allowFactoryBeanInit)throws NoSuchBeanDefinitionException;
}4、MessageSource国际化消息支持 MessageSource是SpringFramework中用于国际化的接口主要用来处理应用程序中的多语言消息。它允许你根据用户的语言环境Locale来动态加载和显示相应的消息。这对于支持多语言的应用程序非常重要。
// 消息解析的策略接口支持消息的参数化和国际化
public interface MessageSource {// 尝试解析指定代码的消息如果找不到则返回默认消息NullableString getMessage(String code, Nullable Object[] args, Nullable String defaultMessage, Locale locale);// 尝试解析消息。如果未找到消息视为错误并抛出异常String getMessage(String code, Nullable Object[] args, Locale locale) throws NoSuchMessageException;// 根据传入的 MessageSourceResolvable 参数解析消息若未找到对应消息抛出异常String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;
}5、EnvironmentCapable环境变量访问能力 EnvironmentCapable是SpringFramework中的一个接口它定义了获取Environment的能力。Environment是Spring的核心抽象之一用于表示当前应用程序的环境信息比如操作系统属性、配置属性、环境变量等。
public interface EnvironmentCapable {// 返回一个 Environment 对象Environment 提供了多个方法来获取配置信息Environment getEnvironment();
}6、ResourcePatternResolver资源路径解析器 ResourcePatternResolver是Spring框架中的一个接口用于将路径模式如通配符 * 和 **解析为资源Resource对象。简单来说它提供了一种机制可以通过路径模式加载符合条件的资源文件比如从类路径、文件系统或 JAR 文件中加载多个资源。
public interface ResourcePatternResolver extends ResourceLoader {// 用于从类路径中匹配所有资源的伪 URL 前缀classpath*:String CLASSPATH_ALL_URL_PREFIX classpath*:;// 解析给定路径的资源解析为Resource对象Resource[] getResources(String locationPattern) throws IOException;
}7、ApplicationEventPublisher发布事件 ApplicationEventPublisher是SpringFramework中的一个接口用于将事件发布给监听器。它是Spring事件驱动编程模型的核心组件之一能够实现组件之间的解耦通信。之前文章Spring发布-订阅模式解耦与异步通信的高效实现对于此类有详细介绍
// 一个封装事件发布功能的接口
FunctionalInterface
public interface ApplicationEventPublisher {// 默认方法最终还是调用publishEvent(Object event)方法default void publishEvent(ApplicationEvent event) {publishEvent((Object) event);}// 发布事件void publishEvent(Object event);
}8、ApplicationContext应用上下文核心接口 ApplicationContext是Spring框架中的一个中央接口它提供了对Bean工厂、事件发布、消息解析等核心功能的统一访问。
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,MessageSource, ApplicationEventPublisher, ResourcePatternResolver {// 返回此应用程序上下文的唯一标识符没有返回nullNullableString getId();// 返回该上下文所属的已部署应用程序的名称默认为空字符串String getApplicationName();// 返回此上下文的友好名称显示名称不会为nullString getDisplayName();// 返回此上下文第一次加载时的时间戳以毫秒为单位long getStartupDate();// 父上下文如果没有则返回nullNullableApplicationContext getParent();// 这个方法的作用是让开发者能够访问底层的 BeanFactory从而手动管理和操作 Bean 的生命周期和依赖注入AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}9、LifecycleBean生命周期管理接口 Lifecycle是一个通用的生命周期接口定义了组件的启动、停止和运行状态检查方法通常用于控制具有生命周期管理能力的组件如线程、定时任务、消息监听器等。
public interface Lifecycle {// 启动组件对于容器它会将启动信号传播到容器内所有相关的子组件void start();// 停止组件通常是同步操作确保组件在方法返回时完全停止void stop();// 检查组件是否正在运行只有当所有相关的子组件都运行时才返回 trueboolean isRunning();
}10、ConfigurableApplicationContext可配置应用上下文 ConfigurableApplicationContext是Spring应用上下文接口的扩展定义了可配置的应用上下文主要用于管理、配置和控制Spring 应用上下文的生命周期。它在 ApplicationContext 的基础上增加了许多高级功能例如上下文刷新、关闭、父上下文设置等。
public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable {// 配置路径中多个配置路径之间的分隔符字符// 可以是逗号 (,)、分号 (;)、空格 ( )、制表符 (\t) 或换行符 (\n)String CONFIG_LOCATION_DELIMITERS ,; \t\n;// BeanFactory 中 ConversionService bean 的名称String CONVERSION_SERVICE_BEAN_NAME conversionService;// BeanFactory 中 LoadTimeWeaver bean 的名称String LOAD_TIME_WEAVER_BEAN_NAME loadTimeWeaver;// BeanFactory 中 Environment bean 的名称String ENVIRONMENT_BEAN_NAME environment;// BeanFactory 中系统属性的 Bean 名称String SYSTEM_PROPERTIES_BEAN_NAME systemProperties;// BeanFactory 中系统环境变量的 Bean 名称String SYSTEM_ENVIRONMENT_BEAN_NAME systemEnvironment;// BeanFactory 中 ApplicationStartup bean 的名称// 收集和记录应用程序启动过程中的性能指标省略不细讲String APPLICATION_STARTUP_BEAN_NAME applicationStartup;// JVM 中关闭钩子线程的默认名称String SHUTDOWN_HOOK_THREAD_NAME SpringContextShutdownHook;// 设置此应用程序上下文的唯一 IDvoid setId(String id);// 设置此应用程序上下文的父上下文void setParent(Nullable ApplicationContext parent);// 设置此应用程序上下文的Environmentvoid setEnvironment(ConfigurableEnvironment environment);// 返回此应用程序上下文的EnvironmentOverrideConfigurableEnvironment getEnvironment();// 添加一个工厂处理器BeanFactoryPostProcessor该处理器将在刷新时应用于内部 bean 工厂void addBeanFactoryPostProcessor(BeanFactoryPostProcessor postProcessor);// 添加一个新的 ApplicationListener该监听器将在上下文事件如刷新或关闭时被通知void addApplicationListener(ApplicationListener? listener);// 加载或刷新配置的持久化表示例如基于 Java 配置、XML 文件、属性文件等void refresh() throws BeansException, IllegalStateException;// 向 JVM 注册一个关闭钩子在 JVM 关闭时关闭此上下文void registerShutdownHook();// 关闭此应用程序上下文释放所有资源并销毁所有缓存的单例 beanOverridevoid close();// 确定此应用程序上下文是否处于活动状态boolean isActive();// 返回此应用程序上下文的内部 BeanFactoryConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;
}11、WebApplicationContextweb应用上下文 WebApplicationContext是Spring框架中专门为Web应用设计的上下文接口。它扩展了ApplicationContext增加了与Servlet API的集成功能例如访问 ServletContext支持Web特定的作用域如request和session并且通过分层结构实现了灵活的上下文管理。
public interface WebApplicationContext extends ApplicationContext {// 常量表示根 WebApplicationContext 在启动过程中绑定到的属性名称// 用于在 Web 应用程序中查找根上下文例如通过 WebApplicationContextUtils 工具类String ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE WebApplicationContext.class.getName() .ROOT;// 分别对应请求范围request、会话范围session、全局应用范围applicationString SCOPE_REQUEST request;String SCOPE_SESSION session;String SCOPE_APPLICATION application;// 定义了 ServletContext 在 Spring 容器中的 Bean 名称String SERVLET_CONTEXT_BEAN_NAME servletContext;// 定义了 ServletContext 初始化参数init-params在 Spring 容器中的 Bean 名称。// 如果参数在 ServletConfig 和 ServletContext 中同名则 ServletConfig 参数优先。String CONTEXT_PARAMETERS_BEAN_NAME contextParameters;// 定义了 ServletContext 属性attributes在 Spring 容器中的 Bean 名称String CONTEXT_ATTRIBUTES_BEAN_NAME contextAttributes;// 返回当前应用程序的 ServletContext 对象。// 可用于直接访问与 Web 应用程序相关的上下文信息NullableServletContext getServletContext();
}12、ConfigurableWebApplicationContext可配置web应用上下文 ConfigurableWebApplicationContext是一个用于管理和配置Web应用上下文的接口支持与Servlet环境集成、动态加载配置文件以及命名空间管理。
// 此接口主要用于管理基于 Web 的应用程序上下文并提供特定于 Web 环境的配置方法
public interface ConfigurableWebApplicationContext extends WebApplicationContext, ConfigurableApplicationContext {// 用于引用上下文路径和/或 Servlet 名称的 ApplicationContext id 前缀String APPLICATION_CONTEXT_ID_PREFIX WebApplicationContext.class.getName() :;// 在工厂中表示 ServletConfig 环境 Bean 的名称String SERVLET_CONFIG_BEAN_NAME servletConfig;// 设置此 Web 应用程序上下文的 ServletContextvoid setServletContext(Nullable ServletContext servletContext);// 设置此 Web 应用程序上下文的 ServletConfigvoid setServletConfig(Nullable ServletConfig servletConfig);// 返回此 Web 应用程序上下文的 ServletConfig如果有NullableServletConfig getServletConfig();// 设置此 Web 应用程序上下文的命名空间void setNamespace(Nullable String namespace);// 返回此 Web 应用程序上下文的命名空间如果有NullableString getNamespace();// 以 init-param 样式设置此 Web 应用程序上下文的配置位置void setConfigLocation(String configLocation);// 设置此 Web 应用程序上下文的配置位置void setConfigLocations(String... configLocations);// 返回此 Web 应用程序上下文的配置位置NullableString[] getConfigLocations();
}13、WebServerApplicationContextweb服务应用上下文 WebServerApplicationContext专门用于管理嵌入式Web服务器如Tomcat、Jetty 或 Undertow的生命周期。它提供了与Web服务器交互的抽象支持启动、停止和运行时管理Web服务器的状态。
public interface WebServerApplicationContext extends ApplicationContext {// 返回由上下文创建的内嵌的 Web 服务器实例如果服务器尚未创建则返回nullWebServer getWebServer();// 返回Web服务器应用程序上下文的命名空间如果未设置命名空间则返回nullString getServerNamespace();// 判断指定的上下文是否为WebServerApplicationContext且具有匹配的服务器命名空间static boolean hasServerNamespace(ApplicationContext context, String serverNamespace) {return (context instanceof WebServerApplicationContext) ObjectUtils.nullSafeEquals(((WebServerApplicationContext) context).getServerNamespace(), serverNamespace);}// 如果指定的上下文是WebServerApplicationContext则返回其服务器命名空间static String getServerNamespace(ApplicationContext context) {return (context instanceof WebServerApplicationContext)? ((WebServerApplicationContext) context).getServerNamespace() : null;}}// 简单的接口表示一个完全配置的 Web 服务器例如 Tomcat、Jetty 或 Netty
public interface WebServer {// 启动 Web 服务器void start() throws WebServerException;// 停止 Web 服务器。void stop() throws WebServerException;// 返回监听的端口号如果未分配端口则返回 -1int getPort();// 允许在不影响现有请求的情况下优雅地关闭服务器// 默认实现是直接返回立即关闭的结果可以被覆盖实现实际的关闭逻辑default void shutDownGracefully(GracefulShutdownCallback callback) {// 默认行为直接调用回调函数立即完成关闭不实际执行关闭逻辑callback.shutdownComplete(GracefulShutdownResult.IMMEDIATE);}
}14、ConfigurableWebServerApplicationContext可配置web服务应用上下文 ConfigurableWebServerApplicationContext是一个用于配置和管理嵌入式Web服务器的Spring应用上下文接口支持动态配置、服务器命名空间设置以及上下文生命周期管理。
// 通过此接口开发者可以在 Web 服务器应用上下文中进行更灵活的配置和管理
public interface ConfigurableWebServerApplicationContextextends ConfigurableApplicationContext, WebServerApplicationContext {// 设置上下文的服务器命名空间。// 服务器命名空间通常用于区分不同的 Web 服务器实例或模块尤其在复杂的微服务架构中非常有用。void setServerNamespace(String serverNamespace);
}15、AbstractApplicationContext抽象应用上下文 AbstractApplicationContext是Spring应用上下文的抽象实现类负责提供通用的上下文生命周期管理、事件发布、资源加载以及BeanFactory的初始化等核心功能。 所有具体的应用上下文如 ClassPathXmlApplicationContext 和 AnnotationConfigApplicationContext都继承自它。
public abstract class AbstractApplicationContext extends DefaultResourceLoaderimplements ConfigurableApplicationContext {... // 内容很多这里只介绍下核心内容/*** 核心属性*/// bean工厂后置处理器// 在容器刷新时允许在 Bean 定义加载完成但 Bean 实例化之前修改 Bean 定义private final ListBeanFactoryPostProcessor beanFactoryPostProcessors new ArrayList();// 生命周期处理器用于管理应用上下文中所有实现了 Lifecycle 接口的组件的启动和停止// 容器刷新时onRefresh() 方法启动所有实现了 Lifecycle 或 SmartLifecycle 接口的 Bean// 容器关闭时onClose() 方法停止所有实现了 Lifecycle 或 SmartLifecycle 接口的 BeanNullableprivate LifecycleProcessor lifecycleProcessor;// 事件广播器负责将发布的事件分发给所有注册的监听器Nullableprivate ApplicationEventMulticaster applicationEventMulticaster;// 用于存储在上下文刷新之前显式注册的 ApplicationListener// 这些监听器在容器初始化时注册并在事件发布时被调用private final SetApplicationListener? applicationListeners new LinkedHashSet();/*** 核心方法*/// 核心方法用于刷新上下文的配置和状态Overridepublic void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// 1、刷新前预处理prepareRefresh();// 2、获取最新的bean工厂ConfigurableListableBeanFactory beanFactory obtainFreshBeanFactory();// 3、注册bean工厂的类加载器和部分后置处理器prepareBeanFactory(beanFactory);try {// 4、bean工厂的后置处理器子类实现postProcessBeanFactory(beanFactory);// 5、执行bean工厂的后置处理器invokeBeanFactoryPostProcessors(beanFactory);// 6、注册所有的后置处理器registerBeanPostProcessors(beanFactory);// 7、初始化国际化组件initMessageSource();// 8、初始化事件多播器用来广播事件initApplicationEventMulticaster();// 9、子类实现扩展其他beanonRefresh();// 10、注册监听器registerListeners();// 11、实例化初始化所有的非懒加载的单例beanfinishBeanFactoryInitialization(beanFactory);// 12、最后刷新发布相应事件finishRefresh();}catch (BeansException ex) {...}}}// 发布事件到所有监听器。如果事件多播器尚未初始化将事件存储以供后续处理// ApplicationEventPublisher接口的实现Overridepublic void publishEvent(ApplicationEvent event) {...}// 注册 JVM 关闭钩子确保上下文在 JVM 关闭时也能被正确关闭Overridepublic void registerShutdownHook() {...}// 关闭上下文销毁所有单例 Bean并发布关闭事件Overridepublic void close() {...}}16、BeanDefinitionRegistryBean定义注册接口 BeanDefinitionRegistry是Spring容器中用于管理Bean定义的核心接口支持动态注册、移除、查询和别名管理常用于扩展和动态操作容器内的 Bean 定义。
// 此接口是 Bean 定义注册的核心用于动态管理 Bean 定义注册、移除、查询等
public interface BeanDefinitionRegistry extends AliasRegistry {// 向注册表中注册一个新的 BeanDefinitionvoid registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException;// 移除给定名称的 BeanDefinitionvoid removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;// 返回给定名称的 BeanDefinitionBeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;// 检查此注册表是否包含具有给定名称的 BeanDefinition。boolean containsBeanDefinition(String beanName);// 返回此注册表中定义的所有 Bean 的名称String[] getBeanDefinitionNames();// 返回注册表中定义的 Bean 的数量。int getBeanDefinitionCount();// 确定给定的 Bean 名称是否已经在此注册表中使用即是否有本地 Bean 或别名注册了此名称boolean isBeanNameInUse(String beanName);
}/*** 管理别名的通用接口提供了注册、删除、查询别名的方法** 别名是一种机制用于为已有的名称提供额外的标识* 通常用于配置中增加灵活性例如为同一个 Bean 定义多个名称*/
public interface AliasRegistry {// 为给定的名称注册一个别名void registerAlias(String name, String alias);// 从注册表中删除指定的别名void removeAlias(String alias);// 确定给定的名称是否被定义为别名而不是实际注册的组件名称boolean isAlias(String name);// 返回给定名称的所有别名如果定义了别名String[] getAliases(String name);
}17、GenericApplicationContext通用应用上下文 GenericApplicationContext是一个通用的Spring应用上下文容器支持以编程方式注册Bean和灵活配置应用上下文 DefaultListableBeanFactory内部组件较为复杂下篇文章将单独对其内部组件进行详细解析。
public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry {... // 内容很多这里只介绍下核心内容// 用于注册、管理和创建 Bean 定义支持依赖注入和动态 Bean 管理private final DefaultListableBeanFactory beanFactory;// 用于统一加载文件、类路径、URL 等各种类型的资源Nullableprivate ResourceLoader resourceLoader;// 根据给定路径加载单个资源支持自定义协议解析和默认资源加载器Overridepublic Resource getResource(String location) {...}// 根据路径模式加载多个资源优先使用资源加载器的路径解析能力Overridepublic Resource[] getResources(String locationPattern) throws IOException {...}Override// 向底层 Bean 工厂注册一个新的 Bean 定义public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException {this.beanFactory.registerBeanDefinition(beanName, beanDefinition);}Override// 从底层 Bean 工厂中移除指定名称的 Bean 定义public void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {this.beanFactory.removeBeanDefinition(beanName);}Override// 获取指定名称的 Bean 定义public BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException {return this.beanFactory.getBeanDefinition(beanName);}// registerBean 方法封装了 Bean 注册的逻辑// 允许通过 Class 类型、可选的实例供应器和自定义器动态注册 Bean// 极大简化了 Bean 定义和注册的过程public T void registerBean(Nullable String beanName, ClassT beanClass,Nullable SupplierT supplier, BeanDefinitionCustomizer... customizers) {...}}18、GenericWebApplicationContextweb通用应用上下文 GenericWebApplicationContext是一个通用的Spring Web应用上下文结合动态Bean注册功能与Web特定特性如ServletContext用于轻量化配置和管理 Web 应用环境
public class GenericWebApplicationContext extends GenericApplicationContextimplements ConfigurableWebApplicationContext, ThemeSource {// ServletContext 是 Web 应用的全局上下文// 用于共享数据、加载资源、解析路径和访问应用及容器的配置信息Nullableprivate ServletContext servletContext;...
}19、ServletWebServerApplicationContextweb服务通用上下文 ServletWebServerApplicationContext是SpringBoot用于启动和管理内嵌Servlet Web服务器如 Tomcat的应用上下文实现Web服务器与Spring容器的无缝集成。
public class ServletWebServerApplicationContext extends GenericWebApplicationContextimplements ConfigurableWebServerApplicationContext {// 表示一个Web服务器例如 Tomcat、Jetty 或 Nettyprivate volatile WebServer webServer;// ServletConfig 是 Servlet 规范中的接口// 用于向 Servlet 提供初始化参数和上下文信息private ServletConfig servletConfig;// 创建和初始化内嵌 Web 服务器private void createWebServer() {...}
}20、AnnotationConfigRegistry注解配置注册器 AnnotationConfigRegistry是一个接口提供通过注册注解配置类或扫描包路径来管理Spring组件的功能。
// 主要功能是提供通过注解方式注册组件类或扫描包的能力
public interface AnnotationConfigRegistry {// 注册一个或多个组件类// 对register方法的调用是幂等的多次添加相同的组件类不会产生额外的效果void register(Class?... componentClasses);// 扫描指定的基础包以查找组件类void scan(String... basePackages);
}21、AnnotationConfigServletWebServerApplicationContext注解驱动web服务应用上下文 AnnotationConfigServletWebServerApplicationContext是一个基于注解配置的 Spring 应用上下文继承自 ServletWebServerApplicationContext并支持通过注解注册组件类和包扫描来配置 Web 应用。
// 一个专门用于基于注解配置的 Servlet Web 服务器应用上下文
public class AnnotationConfigServletWebServerApplicationContext extends ServletWebServerApplicationContextimplements AnnotationConfigRegistry {// 存储已注册的注解配置类的集合这些类通常标注有Configuration注解private final SetClass? annotatedClasses new LinkedHashSet();// 存储要扫描的基础包路径数组通过包路径扫描可以发现并注册 Spring 组件private String[] basePackages;...
}总结
SpringBoot的上下文架构基于Spring的扩展核心是以ApplicationContext 为中心的组件体系 通过BeanFactory提供Bean的注册、管理和依赖注入功能通过ApplicationContext为应用提供高级功能支持包括国际化消息、访问环境变量、事件发布、资源访问等通过WebApplicationContext集成ServletContext管理Web环境中的Bean和特定作用域如request和session通过WebServerApplicationContext管理嵌入式Web服务器如 Tomcat、Jetty的启动、停止和生命周期
我的博客即将同步至腾讯云开发者社区邀请大家一同入驻https://cloud.tencent.com/developer/support-plan?invite_code5dxybut99es