文章预览
Spring IOC(3)BeanFactory概览
里面分享了BeanFactory的接口定义,主要提及
ListableBeanFactory
。
DefaultListableBeanFactory继承关系
ConfigurableListableBeanFactory是继承于ListableBeanFactory、ConfigurableBeanFactory、AutowireCapableBeanFactory
。
ConfigurableBeanFactory
ConfigurableBeanFactory同时继承了HierarchicalBeanFactory 和 SingletonBeanRegistry 这两个接口,即同时继承了分层和单例类注册的功能。
简单介绍一下SingletonBeanRegistry接口,是专门针对Spring中的单例Bean设计的,提供了统一访问单例Bean的功能,类中定义了以下方法(后续再研究):
public interface SingletonBeanRegistry {
//注册单例bean
void registerSingleton(String beanName, Object singletonObject);
//获取单例bean
Object getSingleton(String beanName);
boolean containsSingleton(String beanName);
String[] getSingletonNames();
Object getSingletonMutex();
}
回到ConfigurableBeanFactory这个接口,它是spring框架中非常重要的一个接口,定义了非常多的方法:
-
对父接口中HierarchicalBeanFactory得获取父beanfactory的方法进行set
-
对类的加载器ClassLoader进行set和get
-
属性的编辑器PropertyEditorRegistrar,类的转换器TypeConverter进行注册
-
添加处理bean的后处理器的方法addBeanPostProcessor
-
2个跟Bean别名相关的方法、1个返回合并后的Bean定义的方法。
-
对指定的Bean注册依赖并进行返回registerDependentBean
-
3个销毁bean的方法
-
1个安全访问上下文的方法AccessControlContext
String SCOPE_SINGLETON = "singleton";//单例
String SCOPE_PROTOTYPE = "prototype";//原型
//设置容器的父容器,获取父容器方法在父接口HierarchicalBeanFactory里
void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;
//设置和获取类加载器,主要用于加载Bean,默认是线上上下文的loader
void setBeanClassLoader(@Nullable ClassLoader beanClassLoader);
ClassLoader getBeanClassLoader();
//设置获取临时类加载器
void setTempClassLoader(@Nullable ClassLoader tempClassLoader);
ClassLoader getTempClassLoader();
//设置是否缓存给定BeanDefinition和确定Bean类型的元数据,默认是开启状态.
void setCacheBeanMetadata(boolean cacheBeanMetadata);
boolean isCacheBeanMetadata();
//为beanDefinition值中的表达式提供解决策略.默认的BeanFactory里是没有激活的表达式支持的.
void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver);
BeanExpressionResolver getBeanExpressionResolver();
//设置和获取ConversionService接口,进行数据类型转换
void setConversionService(@Nullable ConversionService conversionService);
ConversionService getConversionService();
//添加一个PropertyEditorRegistrar应用于所有bean的创建过程.
void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);
//为所有给定类型的属性注册一个给定的自定义属性编辑器.通常在factory配置期间被调用.
void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass);
//使用一个已经在BeanFactory里注册过的自定义属性编辑器来初始化给定的PropertyEditorRegistry.
void copyRegisteredEditorsTo(PropertyEditorRegistry registry);
//设置或获取自定义的类型转换器,BeanFactory用它来对Bean的属性值,构造参数等进行转换.这将会覆盖默认的PropertyEditor机制,
void setTypeConverter(TypeConverter typeConverter);
TypeConverter getTypeConverter();
//用来增加一个嵌入式的StringValueResolver,比如说注解的属性.可以参考SpringMVC中的ArgumentResolver.
void addEmbeddedValueResolver(StringValueResolver valueResolver);
//确定是否有一个嵌入式的value resolver已经在这个bean factory中注册了,并且可以通过resolveEmbeddedValue函数来应用.
boolean hasEmbeddedValueResolver();
//决定一个给定的嵌入式的值,例如注解中的属性
String resolveEmbeddedValue(String value);
//添加一个新的BeanPostProcessor,通过这个工厂所创建的beans将会应用这个后置处理器.
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
//获取已经注册的Bean后置处理器的个数
int getBeanPostProcessorCount();
//注册一个给定的scope,支持Scope的实现类.
void registerScope(String scopeName, Scope scope);
//返回所有当前注册过的scope的名字.这个方法只返回明确注册过的scope的名字
String[] getRegisteredScopeNames();
//如果有的话,返回给定名字的Scope实现.和上一个函数一样,将只返回明确注册过的scope
Scope getRegisteredScope(String scopeName);
//提供一个与这个工厂相关的安全的访问控制上下文.这个绝不会为空.
AccessControlContext getAccessControlContext();
//从给定的工厂中拷贝所有相关的配置信息.应该包括了所有标准的配置,也包括了BeanPostProcessor,Scopes和factory-specific内置的一些配置.
void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);
// 给定一个bean的名字,创建它的别名.这个方法的典型应用是支持那些在XML的ids里是无效的名字(被用于Bean的命名).
void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;
//处理所有目标名称的别名和在这个工厂注册过的别名,然后为它们应用给定的StringValueResolver.
void resolveAliases(StringValueResolver valueResolver);
//返回一个给定名字的合并后的BeanDefinition,如果有必要会将子BeanDefinition和父BeanDefinition进行合并.
BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
//判断给定名字的Bean是否是一个FactoryBean.
boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;
//设置Bean的当前创建状态
void setCurrentlyInCreation(String beanName, boolean inCreation);
boolean isCurrentlyInCreation(String beanName);
//为给定名称的Bean注册一个依赖Bean,并且该依赖Bean会在给定的Bean被销毁之前进行销毁
void registerDependentBean(String beanName, String dependentBeanName);
//如果有的话,返回依赖于给定名字Bean的所有Bean名称.
String[] getDependentBeans(String beanName);
//如果有的话,返回给定名字Bean所依赖的所有Bean名称.
String[] getDependenciesForBean(String beanName);
//依据BeanDefinition,销毁给定Bean的实例,(通常会从这个工厂中获取一个原型实例).
void destroyBean(String beanName, Object beanInstance);
//如果有的话,在当前目标Scope中销毁指定的ScopeBean.
void destroyScopedBean(String beanName);
//销毁这个工厂中所有的singleton bean,包括一次性的已经注册的内嵌Bean.在工厂关闭的时候会被调用.
void destroySingletons();
AutowireCapableBeanFactory
提供了
自动装配Bean的实现
,提供bean创建(带有构造函数解析)、属性填充、连接(包括自动装配)和初始化。处理运行时bean引用、解析托管集合、调用初始化方法等。支持自动装配构造函数、按名称的属性和按类型的属性。
bean创建过程中,主要的方法比如createBean(), initializeBean(), applyBeanPostProcessorsBeforeInitialization(), applyBeanPostProcessorsAfterInitialization()。
需要注意的是AutowireCapableBeanFactory并不打算给普通的应用程序直接使用,典型的使用场景还是建议使用BeanFactory或者ListableBeanFactory。
public interface AutowireCapableBeanFactory extends BeanFactory {
int AUTOWIRE_NO = 0;
int AUTOWIRE_BY_NAME = 1;
int AUTOWIRE_BY_TYPE = 2;
int AUTOWIRE_CONSTRUCTOR = 3;
int AUTOWIRE_AUTODETECT = 4;//已经过期
String ORIGINAL_INSTANCE_SUFFIX = ".ORIGINAL";
//完整初始化所创建bean,包含所有可应用的BeanPostProcessor BeanPostProcessors
<T> T createBean(Class<T> beanClass) throws BeansException;
//通过应用初始化之后(after-instantiation)的回调以及bean属性的后置处理(post-processing)
// 来对给定Bean内部的属性进行装配(e.g. 注解注入).
void autowireBean(Object existingBean) throws BeansException;
//配置给定的未加工的bean:自动注入bean的属性,应用bean的属性值,
Object configureBean(Object existingBean, String beanName) throws BeansException;
// 依据指定的自动注入策略创建给定class对象的新的bean实例。
Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
//使用指定的装配策略来为指定的类型实例化一个新的Bean实例
Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
//自动注入给定的bean实例的属性,通过by name 或者 type的方式,
// 也可以通过AUTOWIRE_NO以实现仅仅对实例化后回调的调用(例如注解驱动的注入)。
void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
throws BeansException;
//应用给定bean名字的bean定义的属性值到给定的bean实例
void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;
//初始化指定的原始bean
Object initializeBean(Object existingBean, String beanName) throws BeansException;
//应用后置处理器(BeanPostProcessor BeanPostProcessors)于指定的已存在的bean实例
//返回的对象可能是一个原始对象的包装对象
Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException;
//应用后置处理器(BeanPostProcessor BeanPostProcessors)于指定的已存在的bean实例
//返回的对象可能是一个原始对象的包装对象
Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException;
//销毁指定的bean实例
void destroyBean(Object existingBean);
//解决惟一匹配指定类型的实例,包括实例的bean名称。
<T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException;
//解决此bean工厂中定义的指定的bean依赖。
Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException;
Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,
@Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException;
}
ConfigurableListableBeanFactory
ConfigurableListableBeanFactory提供bean definition的解析,注册功能,以及singleton的预实例化(解决循环依赖问题)
public interface ConfigurableListableBeanFactory
extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
//在装配的时候忽略指定的依赖类型
void ignoreDependencyType(Class<?> type);
//在装配的时候忽略指定的依赖接口
void ignoreDependencyInterface(Class<?> ifc);
//注册一个指定的依赖类型并放入可供注入的值
void registerResolvableDependency(Class<?> dependencyType, @Nullable Object autowiredValue);
//确定一个指定的Bean是否有资格作为自动注入的候选,如果有的话,
// 它将可能会被注入到那些声明了匹配类型依赖的其它Bean中,这个方法也会检查父级的factory
boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor)
throws NoSuchBeanDefinitionException;
//获取bean定义 (可以访问属性值跟构造方法的参数值)
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
//为所有被这个工厂所管理的Bean的名称返回一个统一的视图
Iterator<String> getBeanNamesIterator();
//清理被合并的BeanDefinition缓存,也会移除那些元数据缓存不完整的那些Bean的实体
void clearMetadataCache();
//锁定配置信息.在调用refresh时会使用到.
void freezeConfiguration();
//判断本工厂配置是否被冻结
boolean isConfigurationFrozen();
//确保所有non-lazy-init的单例被实例化,也包括FactoryBeans.
// 如果有需求的话,通常是在factory启动的最后调用这个方法,refresh的主要方法
void preInstantiateSingletons() throws BeansException;
}
………………………………