Spring5.3学习——from 官网 day1-2

181 篇文章 3 订阅
24 篇文章 2 订阅

Spring5.3学习——from 官网 day1-2

前言

本系列为系统的spring框架学习系列,源于官方文档5.3.23版本,本系列文章是我第二次对于官网内容学习,也更加细致,所有内容均为自我总结,并非复制官网内容,若有错误的地方敬请指出,本系列并不太适合新生学习,很多都是源码阅读

BeanFactory系列

我们在1-1中已经看了很多BeanFactory相关源码,接下来我们继续
在这里插入图片描述

ListableBeanFactory源码及说明

  • 是BeanFactory接口的扩展,由可以枚举其所有 bean 实例的 bean 工厂实现,而不是按照客户的要求逐个尝试按名称查找 bean
  • 常由基于XML的工厂进行实现(预加载所有Bean)
  • 依然是接口
  • 主要关注 getBeanDefinitionCountcontainsBeanDefinition两个方法
  • 除以上两个方法,此接口其他方法均不为频繁调用设计,运行速度慢
  • 接口忽略任何已通过其他方式注册的单例 bean(例如ConfigurableBeanFactory的registerSingleton方法)(getBeanNamesForType和getBeansOfType除外)
  • 在典型场景中,所有 bean 都将由外部 bean 定义来定义

本接口不考虑该工厂可能参与的任何层次结构,并忽略通过 bean 定义以外的其他方式注册的任何单例 bean

检查传入的Bean是否存在于当前工厂

检查此 bean 工厂是否包含具有给定名称的 bean 定义

boolean containsBeanDefinition(String beanName);

返回工厂中定义的 bean 数量

int getBeanDefinitionCount();

获取工厂中所有定义的Bean的名称

String[] getBeanDefinitionNames();

获取bean的提供者

返回指定 bean 的提供者,允许延迟按需检索实例,包括可用性和唯一性选项。

<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType, boolean allowEagerInit);
<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType, boolean allowEagerInit);

通过类型获取Bean的名称

返回与给定类型(包括子类)匹配的 bean 的名称,从 bean 定义或在 FactoryBeans 的情况下getObjectType的值判断。
注意:此方法仅内省顶级 bean。它不检查也可能与指定类型匹配的嵌套 bean。

String[] getBeanNamesForType(ResolvableType type);

String[] getBeanNamesForType(ResolvableType type, boolean includeNonSingletons, boolean allowEagerInit);

String[] getBeanNamesForType(@Nullable Class<?> type);

String[] getBeanNamesForType(@Nullable Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);

<T> Map<String, T> getBeansOfType(@Nullable Class<T> type) throws BeansException;

<T> Map<String, T> getBeansOfType(@Nullable Class<T> type, boolean includeNonSingletons, boolean allowEagerInit)

通过注解获取bean

查找所有使用提供的Annotation类型注释的 bean 名称,而无需创建相应的 bean 实例

例如我们可以在Bean上自定义一个注解,通过这个注解来获取

String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);

查找使用提供的Annotation类型进行注释的所有 bean,返回 bean 名称和相应 bean 实例的 Map

Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;

在指定的bean上找注解

在指定的 bean 上找到annotationType的Annotation ,如果在给定的类本身上找不到 annotation,则遍历其接口和超类,以及检查 bean 的工厂方法(如果有)。

<A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType)
			throws NoSuchBeanDefinitionException;

<A extends Annotation> A findAnnotationOnBean(
			String beanName, Class<A> annotationType, boolean allowFactoryBeanInit)
			throws NoSuchBeanDefinitionException;

HierarchicalBeanFactory源码及说明

  • 继承BeanFactory
  • 由可以成为层次结构一部分的 bean 工厂实现的子接口

可以在 ConfigurableBeanFactory 接口中找到允许以可配置方式设置父级的 bean 工厂的相应setParentBeanFactory方法。

返回父Bean工厂

返回父 bean 工厂,如果没有,则返回null

BeanFactory getParentBeanFactory();

返回本工厂是否包含某个Bean

返回本地 bean 工厂是否包含给定名称的 bean,忽略祖先上下文中定义的 bean,是containsBean的替代方法

boolean containsLocalBean(String name);

Lifecycle源码及说明

  • 定义启动,停止生命周期的通用接口
  • 主要用于控制异步处理
  • 主要有SmartLifecycl进行更加完整的扩展
  • 可以由组件和容器直接进行实现

请注意,当前的Lifecycle接口仅在顶级单例 bean上受支持。在任何其他组件上, Lifecycle接口将保持未被检测到,因此被忽略。此外,请注意扩展的SmartLifecycle接口提供了与应用程序上下文的启动和关闭阶段的复杂集成

由Lifecycle我们知道了组件的生命周期为:

  1. 启动
  2. 正在运行
  3. 停止

启动

启动这个组件。
如果组件已经在运行,则不应抛出异常。
在容器的情况下,这会将启动信号传播到所有应用的组件
主要去看SmartLifecycle.isAutoStartup()方法

void start();

关闭

停止此组件,通常以同步方式停止,以便组件在此方法返回时完全停止。当需要异步停止行为时,请考虑实施SmartLifecycle及其stop(Runnable)变体。
请注意,此停止通知不能保证在销毁之前出现:在定期关闭时, Lifecycle bean 将在传播一般销毁回调之前首先收到停止通知;但是,在上下文生命周期内的热刷新或中止刷新尝试时,将调用给定 bean 的 destroy 方法,而无需预先考虑停止信号。
如果组件未运行(尚未启动),则不应引发异常。

void stop();

判断是否正在运行

检查此组件当前是否正在运行。
在容器的情况下,仅当所有应用的组件当前都在运行时才会返回true 。

boolean isRunning();

AutoCloseable

  • 对于资源进行自动关闭的接口

一共只有一个关闭方法,需要我们好好关注一下

关闭资源

  • 关闭资源,放弃所有基础资源
  • 此方法在由try -with-resources 语句管理的对象上自动调用
  • 真实实现中建议抛出更加具体的异常(不能抛出InterruptedException )
  • 强烈建议只调用一次,否则可能出现问题
void close() throws Exception;

Closeable

  • 继承AutoCloseable
  • Closeable是可以关闭的数据的源或目标。调用 close 方法来释放对象所持有的资源(例如打开的文件)

关闭资源

关闭此流并释放与其关联的任何系统资源。如果流已经关闭,则调用此方法无效。

public void close() throws IOException;

ConfigurableApplicationContext源码及说明

  • 大多数应用程序上下文都将实现 SPI 接口。除了ApplicationContext接口中的应用程序上下文客户端方法之外,还提供了配置应用程序上下文的工具。
  • 配置和生命周期的方法被封装在这个接口中来避免他们暴露在ApplicationContext客户端代码中
  • 这里的方法应该只在启动和关闭的时候使用

常量

 
//任意数量的这些字符都被视为单个字符串值中多个上下文配置路径之间的分隔符
	String CONFIG_LOCATION_DELIMITERS = ",; \t\n";

//工厂中 ConversionService bean 的名称。如果未提供,则应用默认转换规则。
	String CONVERSION_SERVICE_BEAN_NAME = "conversionService";

//工厂中 LoadTimeWeaver bean 的名称。如果提供了这样的 bean,上下文将使用临时 ClassLoader 进行类型匹配,以允许 LoadTimeWeaver 处理所有实际的 bean 类。
	String LOAD_TIME_WEAVER_BEAN_NAME = "loadTimeWeaver";

//工厂中Environment bean 的名称
	String ENVIRONMENT_BEAN_NAME = "environment";

//工厂中系统属性 bean 的名称
	String SYSTEM_PROPERTIES_BEAN_NAME = "systemProperties";

//工厂中系统环境 bean 的名称
	String SYSTEM_ENVIRONMENT_BEAN_NAME = "systemEnvironment";

//工厂中ApplicationStartup bean 的名称
	String APPLICATION_STARTUP_BEAN_NAME = "applicationStartup";

//关闭挂钩线程的名称:“SpringContextShutdownHook”。
	String SHUTDOWN_HOOK_THREAD_NAME = "SpringContextShutdownHook";

设置此应用程序上下文的唯一 ID

void setId(String id);

设置应用程序上下文的父级

设置此应用程序上下文的父级。
请注意,不应更改父级:如果在创建此类的对象时它不可用,则仅应在构造函数外部设置它,例如在 WebApplicationContext 设置的情况下

void setParent(@Nullable ApplicationContext parent);

设置应用程序上下文的环境

为此应用程序上下文设置Environment

void setEnvironment(ConfigurableEnvironment environment);

获取应用程序上下文的环境

以可配置的形式返回此应用程序上下文的Environment ,允许进一步定制

ConfigurableEnvironment getEnvironment();

为此应用程序上下文设置ApplicationStartup

这允许应用程序上下文在启动期间记录指标

void setApplicationStartup(ApplicationStartup applicationStartup);

返回此ApplicationStartup程序上下文的 ApplicationStartup

ApplicationStartup getApplicationStartup();

添加Bean工厂处理器

在刷新时应用于此应用程序上下文的内部 bean 工厂,然后再评估任何 bean 定义。在上下文配置期间调用。

void addBeanFactoryPostProcessor(BeanFactoryPostProcessor postProcessor);

添加应用程序上下文监听器

添加一个新的 ApplicationListener,它将在上下文刷新和上下文关闭等上下文事件上得到通知。
请注意,如果上下文尚未激活,则此处注册的任何 ApplicationListener 都将在刷新时应用,或者在上下文已处于活动状态的情况下与当前事件多播器一起应用

void addApplicationListener(ApplicationListener<?> listener);

设置类加载器

指定 ClassLoader 来加载类路径资源和 bean 类。
这个上下文类加载器将被传递到内部 bean 工厂。

void setClassLoader(ClassLoader classLoader);

添加协议解析器

使用此应用程序上下文注册给定的协议解析器,允许处理其他资源协议。
任何此类解析器都将在此上下文的标准解析规则之前调用。因此,它也可以覆盖任何默认规则。

void addProtocolResolver(ProtocolResolver resolver);

加载/刷新配置

由于这是一种启动方法,它应该在失败时销毁已经创建的单例,以避免悬空资源。换句话说,在调用此方法之后,应该实例化所有或根本不实例化单例。

void refresh() throws BeansException, IllegalStateException;

注册关闭挂钩

向 JVM 运行时注册一个关闭挂钩,在 JVM 关闭时关闭此上下文,除非它当时已经关闭。
该方法可以多次调用。每个上下文实例只会注册一个关闭挂钩(最多)

void registerShutdownHook();

关闭应用程序上下文

关闭此应用程序上下文,释放实现可能持有的所有资源和锁。这包括销毁所有缓存的单例 bean。

void close();

判断应用程序上下文是否存活

判断此应用上下文是否处于活动状态,即是否至少刷新过一次且尚未关闭

boolean isActive();

获取当前应用程序上下文的工厂

返回此应用程序上下文的内部 bean 工厂。可用于访问底层工厂的特定功能。
注意:不要用这个对bean工厂进行后处理;单例之前已经实例化过。使用 BeanFactoryPostProcessor 在接触 bean 之前拦截 BeanFactory 设置过程。
通常,只有在上下文处于活动状态时才能访问此内部工厂,即在refresh()和close()之间。isActive()标志可用于检查上下文是否处于适当的状态。

ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值