本系列为系统的spring框架学习系列,源于官方文档5.3.23版本,本系列文章是我第二次对于官网内容学习,也更加细致,所有内容均为自我总结,并非复制官网内容,若有错误的地方敬请指出,本系列并不太适合新生学习,很多都是源码阅读
我们在1-1中已经看了很多BeanFactory相关源码,接下来我们继续
getBeanDefinitionCount
和containsBeanDefinition
两个方法ConfigurableBeanFactory
的registerSingleton方法)(getBeanNamesForType和getBeansOfType除外)本接口不考虑该工厂可能参与的任何层次结构,并忽略通过 bean 定义以外的其他方式注册的任何单例 bean
检查此 bean 工厂是否包含具有给定名称的 bean 定义
boolean containsBeanDefinition(String beanName);
int getBeanDefinitionCount();
String[] getBeanDefinitionNames();
返回指定 bean 的提供者,允许延迟按需检索实例,包括可用性和唯一性选项。
<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType, boolean allowEagerInit);
<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType, boolean allowEagerInit);
返回与给定类型(包括子类)匹配的 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)
查找所有使用提供的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 上找到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;
可以在 ConfigurableBeanFactory 接口中找到允许以可配置方式设置父级的 bean 工厂的相应setParentBeanFactory方法。
返回父 bean 工厂,如果没有,则返回null
BeanFactory getParentBeanFactory();
返回本地 bean 工厂是否包含给定名称的 bean,忽略祖先上下文中定义的 bean,是containsBean的替代方法
boolean containsLocalBean(String name);
SmartLifecycl
进行更加完整的扩展请注意,当前的Lifecycle接口仅在顶级单例 bean上受支持。在任何其他组件上, Lifecycle接口将保持未被检测到,因此被忽略。此外,请注意扩展的SmartLifecycle接口提供了与应用程序上下文的启动和关闭阶段的复杂集成
由Lifecycle我们知道了组件的生命周期为:
启动这个组件。
如果组件已经在运行,则不应抛出异常。
在容器的情况下,这会将启动信号传播到所有应用的组件
主要去看SmartLifecycle.isAutoStartup()方法
void start();
停止此组件,通常以同步方式停止,以便组件在此方法返回时完全停止。当需要异步停止行为时,请考虑实施SmartLifecycle及其stop(Runnable)变体。
请注意,此停止通知不能保证在销毁之前出现:在定期关闭时, Lifecycle bean 将在传播一般销毁回调之前首先收到停止通知;但是,在上下文生命周期内的热刷新或中止刷新尝试时,将调用给定 bean 的 destroy 方法,而无需预先考虑停止信号。
如果组件未运行(尚未启动),则不应引发异常。
void stop();
检查此组件当前是否正在运行。
在容器的情况下,仅当所有应用的组件当前都在运行时才会返回true 。
boolean isRunning();
一共只有一个关闭方法,需要我们好好关注一下
void close() throws Exception;
关闭此流并释放与其关联的任何系统资源。如果流已经关闭,则调用此方法无效。
public void close() throws IOException;
//任意数量的这些字符都被视为单个字符串值中多个上下文配置路径之间的分隔符
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";
void setId(String id);
设置此应用程序上下文的父级。
请注意,不应更改父级:如果在创建此类的对象时它不可用,则仅应在构造函数外部设置它,例如在 WebApplicationContext 设置的情况下
void setParent(@Nullable ApplicationContext parent);
为此应用程序上下文设置Environment
void setEnvironment(ConfigurableEnvironment environment);
以可配置的形式返回此应用程序上下文的Environment ,允许进一步定制
ConfigurableEnvironment getEnvironment();
这允许应用程序上下文在启动期间记录指标
void setApplicationStartup(ApplicationStartup applicationStartup);
ApplicationStartup getApplicationStartup();
在刷新时应用于此应用程序上下文的内部 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;