Spring源码之路-DefaulListableBeanFactory
总结
- 此接口的方法看起来比较多,主要是提供给框架设计者使用的
- 此接口基于支持父子关系的BeanFactory,同时支持单例Bean的注册接口
主要是用于配置时需要的功能。 - 有一个方法
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
主要是添加Bean的后置处理器,用于在Bean初始化前后对Bean进行一些特殊的处理 - 指定了默认的两个作用域
singleton
和prototype
,如果需要其他的作用域可以通过void registerScope(String scopeName, Scope scope);
方法来进行注册新的作用域范围
源码注释的大概翻译
/**
* 由大多数bean工厂实现的配置接口.
* 除了{@link org.springframework.beans.factory.BeanFactory} 接口中的bean工厂
* 客户端方法之外,还提供了配置bean工厂的设施。
*
* 此bean工厂接口不适合在常规应用程序中使用
* 代码:坚持使用{@link org.springframework.beans.factory.BeanFactory}或
* {@link org.springframework.beans.factory.ListableBeanFactory }用于典型的
* 需求。此扩展接口仅用于允许框架内部即插即用,并允许对bean工厂配置方
* 法的特殊访问。
*
* @author Juergen Hoeller
* @since 03.11.2003
* @see org.springframework.beans.factory.BeanFactory
* @see org.springframework.beans.factory.ListableBeanFactory
* @see ConfigurableListableBeanFactory
*/
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {
/**
* 标准单例作用域的作用域标识符:{@value}。
* 可以通过{@code registerScope}添加自定义范围。
* @see #registerScope
*/
String SCOPE_SINGLETON = "singleton";
/**
* 标准原型范围的范围标识符:{@ value}。
* 可以通过{@code registerScope}添加自定义范围。
* @see #registerScope
*/
String SCOPE_PROTOTYPE = "prototype";
/**
* 设置此beanFactory的父级。
* 请注意,父级不能更改:如果在工厂实例化时不可用,则只能在
* 构造函数外部设置。
* @param parentBeanFactory 父BeanFactory
* @throws IllegalStateException 如果此工厂已经与父BeanFactory关联
* @see #getParentBeanFactory()
*/
void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;
/**
* 设置用于加载Bean类的类加载器。
* 默认为线程上下文类加载器。
* 请注意,此类加载器仅适用于尚不包含已解析的bean类的bean定义。
* 在默认情况下,从Spring 2.0开始就是这种情况:Bean定义仅带有Bean类名,
* 在工厂处理Bean定义后即可解决。
* @param beanClassLoader 要使用的类加载器,或{@code null}建议默认的类加载器
*/
void setBeanClassLoader(@Nullable ClassLoader beanClassLoader);
/**
* 返回此工厂的类加载器以加载Bean类
* (即使无法访问系统ClassLoader,也仅{@code null})。
* @see org.springframework.util.ClassUtils#forName(String, ClassLoader)
*/
@Nullable
ClassLoader getBeanClassLoader();
/**
* 指定用于类型匹配目的的临时ClassLoader。
* 默认为无,只需使用标准bean ClassLoader。
* 如果涉及到加载时编织,通常仅指定一个临时的ClassLoader,
* 以确保尽可能延迟地加载实际的bean类。
* 一旦BeanFactory完成其引导阶段,便将临时加载器删除。
* @since 2.5
*/
void setTempClassLoader(@Nullable ClassLoader tempClassLoader);
/**
* 如果有的话,返回临时ClassLoader以用于类型匹配。
* @since 2.5
*/
@Nullable
ClassLoader getTempClassLoader();
/**
* 设置是否缓存bean元数据,例如给定的BeanDefinition
* (以合并方式)和已解析的bean类。默认为开。
* 关闭此标志以启用BeanDefinition对象(特别是Bean Class)的热刷新。
* 如果关闭此标志,则任何bean实例的创建都将重新查询bean类加载器
* 以获取新解析的类。
*/
void setCacheBeanMetadata(boolean cacheBeanMetadata);
/**
* 返回是否缓存Bean元数据,例如给定的Bean定义(以合并方式)
* 和已解析的Bean Class。
*/
boolean isCacheBeanMetadata();
/**
* 为bean定义值中的表达式指定解析策略。
* 默认情况下,BeanFactory中不支持任何表达式支持。
* ApplicationContext通常会在此处设置标准的表达式策略
* 以统一EL兼容样式支持“#{...}”表达式。
* @since 3.0
*/
void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver);
/**
* 返回bean定义值中表达式的解析策略。
* @since 3.0
*/
@Nullable
BeanExpressionResolver getBeanExpressionResolver();
/**
* 指定一个ConversionService用于转换属性值,以替代JavaBeans PropertyEditors。
* @since 3.0
*/
void setConversionService(@Nullable ConversionService conversionService);
/**
* 如果有,返回关联的ConversionService。
* @since 3.0
*/
@Nullable
ConversionService getConversionService();
/**
* 添加一个PropertyEditorRegistrar应用于所有bean创建过程。
* 这样的注册服务商会创建新的PropertyEditor实例,并在给定的注册表中注册它们,
* 对于每次创建bean的尝试都是新鲜的。这避免了在定制编辑器上进行同步的需要;
* 因此,通常最好使用此方法代替{@link #registerCustomEditor}。
* @param registrar 被添加的PropertyEditorRegistrar对象
*/
void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);
/**
* 为给定类型的所有属性注册给定的定制属性编辑器。在出厂配置期间调用。
* 请注意,此方法将注册一个共享的自定义编辑器实例;
* 为了线程安全,对该实例的访问将被同步。
* 通常最好使用{@link #addPropertyEditorRegistrar}代替
* 此方法,以避免需要在自定义编辑器上进行同步。
* @param requiredType 属性的类型
* @param propertyEditorClass 要注册的{@link PropertyEditor}类
*/
void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass);
/**
* 使用已在此BeanFactory中注册的自定义编辑器
* t初始化给定的PropertyEditorRegistry。
* @param registry 使用PropertyEditorRegistry来初始化
*/
void copyRegisteredEditorsTo(PropertyEditorRegistry registry);
/**
* 设置此BeanFactory用于转换bean属性值,构造函数参数值等的自定义类型转换器。
* 这将覆盖默认的PropertyEditor机制,因此使任何自定义编辑器或自定义编辑器注册
* 器均不起作用。
* @since 2.5
* @see #addPropertyEditorRegistrar
* @see #registerCustomEditor
*/
void setTypeConverter(TypeConverter typeConverter);
/**
* 获取此BeanFactory使用的类型转换器。这可能是新的
* 实例,因为TypeConverters通常不是线程安全的。
* 如果默认的PropertyEditor机制处于活动状态,则返回的TypeConverter将知道已
* 注册的所有自定义编辑器。
* @since 2.5
*/
TypeConverter getTypeConverter();
/**
* 为嵌入的值(例如注释属性)添加字符串解析器。
* @param valueResolver 字符串解析器应用于嵌入值
* @since 3.0
*/
void addEmbeddedValueResolver(StringValueResolver valueResolver);
/**
* 确定是否已通过{@link #resolveEmbeddedValue(String)}
* 应用此bean工厂注册了嵌入式值解析器。
* @since 4.3
*/
boolean hasEmbeddedValueResolver();
/**
* 解析给定的嵌入值,例如注释属性。
* @param value 要解析的值
* @return 返回解析的值(可能是原始值)
* @since 3.0
*/
@Nullable
String resolveEmbeddedValue(String value);
/**
* 添加一个新的BeanPostProcessor,它将应用于该工厂创建的bean。
* 在出厂配置期间调用。 注意:此处提交的后处理器将按照注册的顺序应用;
* 通过实现{@link org.springframework.core.Ordered}接口表示的任何排序语义
* 都将被忽略。请注意自动检测到的后处理器(例如,作为ApplicationContext
* 中的bean)将始终以编程方式注册后的处理器。
* @param beanPostProcessor 用于注册后处理器
*/
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
/**
* 如果有,返回当前已注册的BeanPostProcessor的数量。
*/
int getBeanPostProcessorCount();
/**
* 注册由给定范围实现支持的给定范围。
* @param scopeName 范围标识符
* @param scope 支持的Scope实现
*/
void registerScope(String scopeName, Scope scope);
/**
* 返回所有当前注册范围的名称。
* 这将仅返回显式注册的作用域的名称。
* 内置作用域(例如“ singleton”和“ prototype”)不会公开。
* @return 返回作用域名称的数组,如果没有则返回空数组
* @see #registerScope
*/
String[] getRegisteredScopeNames();
/**
* 如果有,返回给定作用域名称的作用域实现。
* 这将仅返回显式注册的范围。
* 内置作用域(例如“ singleton”和“ prototype”)不会公开。
* @param scopeName 作用域的名称
* @return 返回注册的作用域实现,如果没有则返回{@code null}
* @see #registerScope
*/
@Nullable
Scope getRegisteredScope(String scopeName);
/**
* 提供与此工厂有关的安全访问控制上下文。
* @return 返回适用的AccessControlContext(从不{@code null})
* @since 3.0
*/
AccessControlContext getAccessControlContext();
/**
* 从给定的其他工厂复制所有相关配置。
* 应包括所有标准配置设置以及BeanPostProcessor,范围和工厂特定的内部设置。
* 不应包含任何实际bean定义的元数据,例如BeanDefinition对象和bean名称别名。
* @param otherFactory 要从复制的另一个BeanFactory
*/
void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);
/**
* 给定一个bean名称,创建一个别名。我们通常使用此方法
* 支持XML ID(用于bean名称)中非法的名称。
* 通常在出厂配置期间调用,但也可以用于别名的运行时注册。因此,factory
* 实现应同步别名访问。
* @param beanName 目标bean的规范名称
* @param alias 是要为该bean注册的别名
* @throws BeanDefinitionStoreException 如果别名已经在使用中
*/
void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;
/**
* 解析所有别名目标名称和在该工厂中注册的别名,
* 将给定的StringValueResolver应用于它们。
* 例如,值解析器可以解析目标bean名称甚至别名中的占位符
* @param valueResolver 要应用的StringValueResolver
* @since 2.5
*/
void resolveAliases(StringValueResolver valueResolver);
/**
* 返回给定bean名称的合并BeanDefinition,
* 如有必要,将子bean定义与其父级合并。
* 还要考虑祖先工厂中的bean定义。
* @param beanName 要检索给定bean的合并定义的bean的名称
* @return 返回给定bean的(可能合并的)BeanDefinition
* @throws NoSuchBeanDefinitionException 如果没有给定名称的bean定义
* @since 2.5
*/
BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
/**
* 确定具有给定名称的Bean是否为FactoryBean。
* @param name 要检查的bean的名称
* @return 返回bean是否为FactoryBean
*({@ code false}表示该bean存在,但不是FactoryBean)
* @throws NoSuchBeanDefinitionException 如果没有给定名称的bean
* @since 2.5
*/
boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;
/**
* 明确控制指定bean的当前增量状态。 仅供容器内部使用。
* @param beanName Bean的名称
* @param inCreation 是否当前正在创建该bean
* @since 3.1
*/
void setCurrentlyInCreation(String beanName, boolean inCreation);
/**
* 确定当前是否正在创建指定的bean。
* @param beanName bean的名称
* @return 返回当前是否正在创建bean
* @since 2.5
*/
boolean isCurrentlyInCreation(String beanName);
/**
* 为给定的bean注册一个依赖的bean,
* 在给定的bean被销毁之前被销毁。
* @param beanName bean的名称
* @param dependentBeanName 依赖的bean的名称
* @since 2.5
*/
void registerDependentBean(String beanName, String dependentBeanName);
/**
* 返回依赖于指定bean的所有bean的名称(如果有)。
* @param beanName bean的名称
* @return 返回相关bean名称的数组,如果没有则返回一个空数组
* @since 2.5
*/
String[] getDependentBeans(String beanName);
/**
* 返回指定bean所依赖的所有bean的名称(如果有)。
* @param beanName bean的名称
* @return 返回bean所依赖的bean的名称数组,或如果没有则返回一个空数组
* or an empty array if none
* @since 2.5
*/
String[] getDependenciesForBean(String beanName);
/**
* 根据其bean定义销毁给定的bean实例(通常是从该工厂获得的原型实例)。
* 应该捕获并销毁在销毁过程中出现的任何异常,而不是传播给此方法的调用者。
* @param beanName bean定义的名称
* @param beanInstance 要销毁的bean实例
*/
void destroyBean(String beanName, Object beanInstance);
/**
* 销毁当前目标范围中的指定范围的bean(如果有)。
* 应该捕获并销毁在销毁过程中出现的任何异常,而不是传播给此方法的调用者。
* @param beanName 作用域bean的名称
*/
void destroyScopedBean(String beanName);
/**
* 销毁该工厂中的所有单例Bean,包括已注册为一次性的inner Bean。
* 在工厂关闭时被调用。
* 应该捕获并销毁在销毁过程中出现的任何异常,而不是传播给此方法的调用者。
*/
void destroySingletons();
}