9.Spring源码之路-DefaulListableBeanFactory - ConfigurableBeanFactory

Spring源码之路-DefaulListableBeanFactory

  • 总结
  • 源码注释的大概翻译

总结

  1. 此接口的方法看起来比较多,主要是提供给框架设计者使用的
  2. 此接口基于支持父子关系的BeanFactory,同时支持单例Bean的注册接口
    主要是用于配置时需要的功能。
  3. 有一个方法void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);主要是添加Bean的后置处理器,用于在Bean初始化前后对Bean进行一些特殊的处理
  4. 指定了默认的两个作用域 singletonprototype,如果需要其他的作用域可以通过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 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();

}

你可能感兴趣的:(spring源码)