BeanFactory体系结构 (2)

ConfigurableBeanFactory提供了bean工厂的配置机制(除了BeanFactory接口中的bean的工厂的客户端方法)。该BeanFactory接口不适应一般的应用代码中,应该使用BeanFactory和ListableBeanFactory。该扩展接口仅仅用于内部框架的使用,并且是对bean工厂配置方法的特殊访问。

ConfigurableBeanFactory继承自HierarchicalBeanFactory和SingletonBeanRegistry,下面先看下SingletonBeanRegistry:

SingletonBeanRegistry是为了共享的bean的实例而定义的注册器,以统一的方式暴露单例管理机制。下面是在此接口中定义的方法:

// 在bean的注册器中以给定的bean的名字将给定的现存对象注册为单例 void registerSingleton(String beanName, Object singletonObject); // 根据给定的bean的名字来获取单例bean,可能为null Object getSingleton(String beanName); // 是否包含给定名字的单例bean boolean containsSingleton(String beanName); // 获取所有在注册器中注册的单例bean的名字 String[] getSingletonNames(); // 获取所有在注册器中注册的单例bean的数量 int getSingletonCount(); // 获取在这个注册器中使用的单例的mutex(用于外部协同) Object getSingletonMutex();

需要注意的是使用registerSingleton方法注册的单例bean,不会执行任何的初始化回调函数(尤其不会调用InitializingBean的afterPropertiesSet方法),同样也不会接收任何的摧毁回调函数。如果需要接收初始化和摧毁回调函数,请注册bean的定义而不是现存的实例对象。

接下来看下ConfigurableBeanFactory中定义的方法:

// 作用域 String SCOPE_SINGLETON = "singleton"; // 单例作用域 String SCOPE_PROTOTYPE = "prototype"; // 原型作用域 // 设置父级bean工厂 void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException; // 设置bean的类加载器,默认为线程上下文类加载器 void setBeanClassLoader(@Nullable ClassLoader beanClassLoader); // 获取bean的类加载器 @Nullable ClassLoader getBeanClassLoader(); // 设置临时的类加载器 void setTempClassLoader(@Nullable ClassLoader tempClassLoader); // 获取临时的类加载器 @Nullable ClassLoader getTempClassLoader(); // 设置是否缓存bean的元数据 void setCacheBeanMetadata(boolean cacheBeanMetadata); // 是否缓存bean的元数据 boolean isCacheBeanMetadata(); // 设置bean的表达式解析器,以统一的EL兼容样式支持#{...}这样的表达式 void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver); // 获取bean的表达式解析器 @Nullable BeanExpressionResolver getBeanExpressionResolver(); // 设置转换服务,用于转换属性值 void setConversionService(@Nullable ConversionService conversionService); // 获取转换服务 @Nullable ConversionService getConversionService(); // 添加属性编辑器注册者 void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar); // 为所有给定的属性注册自定义属性编辑器 void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass); // 使用在BeanFactory中注册的自定义编辑器来初始哈给定的属性编辑器注册者 void copyRegisteredEditorsTo(PropertyEditorRegistry registry); // 设置类型转换器 void setTypeConverter(TypeConverter typeConverter); // 获取类型转换器 TypeConverter getTypeConverter(); // 添加嵌入值解析器,例如注册属性 void addEmbeddedValueResolver(StringValueResolver valueResolver); // 在BeanFactory是否有注册嵌入值解析器 boolean hasEmbeddedValueResolver(); // 解析给定的嵌入的值 @Nullable String resolveEmbeddedValue(String value); // 添加bean的后置处理器 void addBeanPostProcessor(BeanPostProcessor beanPostProcessor); // 获取bean的后置处理器个数 int getBeanPostProcessorCount(); // 注册作用域 void registerScope(String scopeName, Scope scope); // 获取注册的作用域的名字 String[] getRegisteredScopeNames(); // 获取作用域 @Nullable Scope getRegisteredScope(String scopeName); // 提供一个与这个工厂有关的安全访问控制上下文 AccessControlContext getAccessControlContext(); // 从给定的其他的工厂拷贝所有相关的配置。不应该包含任何bean的定义元数据 void copyConfigurationFrom(ConfigurableBeanFactory otherFactory); // 注册别名 void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException; // 解析所有别名的目标名称和在工厂中注册的别名,将给定的StringValueResolver应用于它们 void resolveAliases(StringValueResolver valueResolver); // 获取合并的bean的定义 BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; // 给定名字的bean是否为FactoryBean boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException; // 显式的设置指定bean的目前在创建状态 void setCurrentlyInCreation(String beanName, boolean inCreation); // 指定的bean目前是否为在建状态 boolean isCurrentlyInCreation(String beanName); // 注册给定bean所依赖的bean void registerDependentBean(String beanName, String dependentBeanName); // 获取所有依赖于指定bean的bean的名字 String[] getDependentBeans(String beanName); // 获取所有指定bean所依赖的bean的名字 String[] getDependenciesForBean(String beanName); // 根据bean的定义来摧毁给定的bean的实例(通常是从工厂中获取到的原型实例) void destroyBean(String beanName, Object beanInstance); // 在当前目标作用域中摧毁指定的作用域中的bean void destroyScopedBean(String beanName); // 摧毁在工厂中的所有单例bean void destroySingletons();

上面的大部分方法都是获取或者设置一些配置的信息,以便协同来完成BeanFactory的配置。

ConfigurableListableBeanFactory

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppjdx.html