ConfigurableBeanFactory
接口包含了一些用于配置 bean 工厂的方法,使开发人员能够更好地控制 bean 的创建和初始化等行为。它继承自 HierarchicalBeanFactory
和 SingletonBeanRegistry
接口,并添加了一些扩展方法。
这是一个配置接口,大多数工厂类应该来实现此接口。除了包含在 {@link org.springframework.beans.factory.BeanFactory} 接口中的 bean 工厂客户端方法外,该接口还提供了一些用于配置 bean 工厂的功能。
这个 bean 工厂接口不适用于普通的应用程序代码使用:请在典型的场景中使用{@link org.springframework.beans.factory.BeanFactory}或 {@link org.springframework.beans.factory.ListableBeanFactory}。该扩展接口主要用于允许内部框架的插件和特殊访问 bean 工厂的配置方法。
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {}
标准单例作用域的范围标识符:{@value}。
可以通过`registerScope`方法添加自定义作用域。 参见:{@link #registerScope}。
String SCOPE_SINGLETON = "singleton";
标准原型作用域的范围标识符:{@value}。
可以通过`registerScope`方法添加自定义作用域。 参见:{@link #registerScope}。
String SCOPE_PROTOTYPE = "prototype";
设置这个Bean工厂的父级。
请注意,父级一旦设置就不能更改:如果该父级无法在工厂实例化时使用,则只能在构造函数之外设置。
void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;
设置用于加载bean类的类加载器。 默认值为线程上下文类加载器。 请注意,该类加载器仅适用于尚未解析的Bean定义的加载。从Spring 2.0版本开始,默认情况下,Bean定义仅包含Bean类名称,在工厂处理Bean定义时才解析。
void setBeanClassLoader(@Nullable ClassLoader beanClassLoader);
返回此工厂用于加载bean类的类加载器(如果连系统的ClassLoader都无法访问,只返回null)。
@Nullable
ClassLoader getBeanClassLoader();
设置是否缓存bean元数据,如给定的bean定义(以合并方式)和已解析的bean类。默认值为开启。
关闭此标志以启用对Bean定义对象的热刷新,特别是对于Bean类。如果该标志关闭,任何创建bean实例的操作将重新查询bean类加载器以获取新解析的类。
void setCacheBeanMetadata(boolean cacheBeanMetadata);
返回是否缓存bean元数据,例如给定的bean定义(以合并方式)和已解析的bean类。
boolean isCacheBeanMetadata();
添加一个PropertyEditorRegistrar到所有bean创建过程中,该注册器会为每个bean创建尝试创建新的PropertyEditor实例并在给定的注册表上进行注册。通过这种方式避免了在自定义编辑器上进行同步的需求,因此通常建议使用这种方法来代替registerCustomEditor方法。
void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);
设置一个自定义类型转换器,用于在该BeanFactory中进行bean属性值、构造函数参数值等的转换。 此操作将覆盖默认的PropertyEditor机制,因此任何自定义编辑器或自定义编辑器注册器将变得无关紧要。
void setTypeConverter(TypeConverter typeConverter);
获取由这个BeanFactory使用的类型转换器。由于TypeConverter通常并不是线程安全的,因此每次调用此方法时可能会返回一个新的实例。
如果默认的PropertyEditor机制处于活动状态,则返回的TypeConverter将了解已注册的所有自定义编辑器。
TypeConverter getTypeConverter();
添加一个String解析器,用于解析嵌入值,例如注解属性中的值。
void addEmbeddedValueResolver(StringValueResolver valueResolver);
判断是否已在此Bean工厂中注册了一个解析嵌入值的解析器,可以通过 resolveEmbeddedValue(String)方法应用。
boolean hasEmbeddedValueResolver();
解析给定的嵌入值,例如注解属性。
@Nullable
String resolveEmbeddedValue(String value);
添加一个新的BeanPostProcessor,将应用于由此工厂创建的bean。在工厂配置期间调用。 注意:在此处提交的后处理器将按照注册顺序应用;通过实现org.springframework.core.Ordered接口表达的任何排序语义将被忽略。注意,在自动检测到的后处理器(例如,ApplicationContext中的bean)之后,始终会应用在程序上注册的后处理器。
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
返回当前注册的BeanPostProcessors的数量(如果有的话)。
int getBeanPostProcessorCount();
注册给定的作用域,由给定的作用域实现支持。
void registerScope(String scopeName, Scope scope);
返回当前所有注册的作用域的名称。 这只会返回显式注册的作用域的名称。 内置的作用域,如"singleton"和"prototype",将不会显示。 如果没有任何作用域,则返回一个空数组。
String[] getRegisteredScopeNames();
返回给定作用域名称的作用域实现,如果有的话。 这只会返回显式注册的作用域。 内置的作用域,如"singleton"和"prototype",将不会暴露。 如果没有注册该作用域,则返回{@code null}。
@Nullable
Scope getRegisteredScope(String scopeName);
设置此bean工厂的 ApplicationStartup
。 这允许应用程序上下文在应用程序启动期间记录指标。
void setApplicationStartup(ApplicationStartup applicationStartup);
提供与此工厂相关的安全访问控制上下文。 返回适用的AccessControlContext(永远不会为 null
)。
AccessControlContext getAccessControlContext();
从另一个Bean工厂中拷贝所有相关的配置。 应包括所有标准配置设置,以及BeanPostProcessors、Scopes和特定于工厂的内部设置。 不应包括任何实际bean定义的元数据,例如BeanDefinition对象和bean名称别名。
void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);
给定一个bean名称,创建一个别名。通常我们使用这个方法来支持在XML id中是非法的名称(用于bean名称)。 通常在工厂配置期间调用,但也可用于运行时注册别名。因此,工厂实现应该同步别名访问。
void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;
解析此工厂中注册的所有别名目标名称和别名,应用给定的StringValueResolver对它们进行解析。 例如,该值解析器可以解析目标bean名称和别名名称中的占位符。
void resolveAliases(StringValueResolver valueResolver);
根据给定的bean名称返回合并的BeanDefinition, 如果有必要,则将子bean定义与其父bean定义合并。考虑祖先工厂中的bean定义。
BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
确定具有给定名称的bean是否为FactoryBean。
boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;
显式控制指定bean的当前创建状态。仅供容器内部使用。
void setCurrentlyInCreation(String beanName, boolean inCreation);
注册一个依赖于给定bean的依赖bean,在给定bean销毁之前销毁。
void registerDependentBean(String beanName, String dependentBeanName);
返回所有依赖于指定bean的bean的名称(如果有的话)。
String[] getDependentBeans(String beanName);
根据bean定义销毁给定的bean实例(通常是从此工厂获取的原型实例)。 在销毁过程中,对于任何异常,应该捕获并记录它们,而不是传播给该方法的调用者。
void destroyBean(String beanName, Object beanInstance);
在当前目标作用域中销毁指定的作用域bean(如果存在)。 在销毁过程中,对于任何异常,应该捕获并记录它们,而不是传播给该方法的调用者。
void destroyScopedBean(String beanName);
销毁此工厂中的所有单例bean,包括已被注册处理的内部bean。 通常在工厂关闭时调用。
在销毁过程中,对于任何异常,应该捕获并记录它们,而不是传播给该方法的调用者。
void destroySingletons();