Spring BeanFactory源码解析
来源:互联网 发布:南京邮电大学网络信息 编辑:程序博客网 时间:2024/05/22 17:14
一、BeanFactory接口
1. BeanFactory接口是工厂方法的实现机制,具体定义了以下几个方法:
public interface BeanFactory { // 对于FactoryBean,该前缀用于取出FactoryBean,而非getObject对应的方法 String FACTORY_BEAN_PREFIX = "&"; // 返回bean实例,如果当前bean工厂不存在该bean,则从父BeanFactory获取bean实例 Object getBean(String name) throws BeansException; // 获取到bean实例,并转化为对应类型的实例,不存在时同样从父进程查找,其中requiredType可能是接口或者超类 <T> T getBean(String name, Class<T> requiredType) throws BeansException; // 返回唯一匹配该类型的bean,注意多个同类型的bean实例会抛出异常 <T> T getBean(Class<T> requiredType) throws BeansException; // 获取bean,并且给定构造参数 Object getBean(String name, Object... args) throws BeansException; <T> T getBean(Class<T> requiredType, Object... args) throws BeansException; // 判断当前BeanFactory是否含有该bean的定义,不存在时从父beanFactory寻找,未必能生成实例 boolean containsBean(String name); // 判断bean是否是单例的 boolean isSingleton(String name) throws NoSuchBeanDefinitionException; // 判断是否每次都会取得一个独立的bean boolean isPrototype(String name) throws NoSuchBeanDefinitionException; // 获取到的bean是否是typeMatch类型 boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException; // 返回给定的bean是否可以赋值给typeToMatch boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException; // 返回给定bean的所属类型,对于FactoryBean返回getObjectType Class<?> getType(String name) throws NoSuchBeanDefinitionException; // 返回给定bean的所有别名,bean的原始名称放在第一位,如果不存在,则返回空数组 String[] getAliases(String name);}
2. 继承自BeanFactory的子接口:HierarchicalBeanFactory,该实例使得具有BeanFactory具有父子关系。
public interface HierarchicalBeanFactory extends BeanFactory { // 获取父beanFactory BeanFactory getParentBeanFactory(); // 判断当前beanFacoty实例是否含有该bean,只判断当前beanFactory boolean containsLocalBean(String name);}
3. SingletonBeanRegistry提供注册单例bean的功能。
public interface SingletonBeanRegistry { // 注册单例bean,该单例必须已经经过初始化 void registerSingleton(String beanName, Object singletonObject); // 获取单例的bean,注意该单例已经初始化完成 Object getSingleton(String beanName); // 注意此方法不识别bean别名或者FactoryBean的前缀&,必须是bean的原始名字。 boolean containsSingleton(String beanName); // 返回单例的bean名称,永远不会返回null String[] getSingletonNames(); // 获取已经初始化的单例的个数 int getSingletonCount(); Object getSingletonMutex();}
4. 可配置的ConfigurableBeanFactory,注意应用代码中不应使用这个接口,而应使用BeanFactory或则ListableBeanFactory。这个接口可以操作beanfactory,仅供内部使用。
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry { String SCOPE_SINGLETON = "singleton"; String SCOPE_PROTOTYPE = "prototype"; void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException; void setBeanClassLoader(ClassLoader beanClassLoader); ClassLoader getBeanClassLoader(); void setTempClassLoader(ClassLoader tempClassLoader); ClassLoader getTempClassLoader(); void setCacheBeanMetadata(boolean cacheBeanMetadata); boolean isCacheBeanMetadata(); // 设置表达式解析测试 void setBeanExpressionResolver(BeanExpressionResolver resolver); BeanExpressionResolver getBeanExpressionResolver(); // 设置ConversionService,替代PropertyEditor,从3.0开始 void setConversionService(ConversionService conversionService); ConversionService getConversionService(); // 添加属性管家,用于整个bean的创建过程 void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar); // 注册属性编辑器,注意属性编辑器实例是线程安全的,推荐使用conversionService void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass); // 用beanfactoy中的自定义属性编辑器初始化给定的注册表项 void copyRegisteredEditorsTo(PropertyEditorRegistry registry); // 设定属性转化器,用于转化属性值和构造函数入参等。 void setTypeConverter(TypeConverter typeConverter); // 可能每次都得到一个新的值,因为TypeConverter不是线程安全的 TypeConverter getTypeConverter(); // 添加值解析器用于解析嵌入的值,如注解中的值 void addEmbeddedValueResolver(StringValueResolver valueResolver); // 解析嵌入的值,如注解中的值,返回解析后的值 String resolveEmbeddedValue(String value); // 注册BeanPostProcessor,这部分先于配置的BeanPostProcessor,且按照注册的顺序执行,与Ordered接口无关。 void addBeanPostProcessor(BeanPostProcessor beanPostProcessor); // 获取当前已经注册的BeanPostProcessor个数 int getBeanPostProcessorCount(); // 注册指定的Scope void registerScope(String scopeName, Scope scope); String[] getRegisteredScopeNames(); Scope getRegisteredScope(String scopeName); AccessControlContext getAccessControlContext(); // 从给定的beanFacoty复制后处理器等到当前的beanfactory,不能复制任何和BeanDefinition相关的属性,包括bean别名等 void copyConfigurationFrom(ConfigurableBeanFactory otherFactory); // 注册给定bean的别名,如果别名已经被使用,将抛出异常 void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException; // 使用valueResolver解析注册在当前beanfactory的所有别名 void resolveAliases(StringValueResolver valueResolver); // 返回指定的bean和父bean合并的BeanDefinition BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; // 判断给定的bean是否为FactoryBean,注意name对应的bean必须存在,不存在将抛出NoSuchBeanDefinitionException。 boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException; // 该方法由容器内部使用 void setCurrentlyInCreation(String beanName, boolean inCreation); // 判断beanName是否正在创建中 boolean isCurrentlyInCreation(String beanName); // 注册beanName依赖的bean,这些被依赖的bean会被先销毁。 void registerDependentBean(String beanName, String dependentBeanName); // 获取所有依赖beanName的bean的名称 String[] getDependentBeans(String beanName); // 获得指定bean依赖的bean的名称 String[] getDependenciesForBean(String beanName); void destroyBean(String beanName, Object beanInstance); void destroyScopedBean(String beanName); // 在beanfactory销毁时调用,该方法本身必须捕获异常,而不是抛给调用者 void destroySingletons();}
阅读全文
0 0
- Spring源码解析-beanfactory
- Spring BeanFactory源码解析
- Spring源码分析-beanFactory
- Spring之BeanFactory解析
- 【第二章:源码解析】Spring的BeanFactory的接口注解
- Spring源码解析——start from BeanFactory(一)
- Spring IoC源码解析(1):BeanFactory和ApplicationContext
- spring 核心与源码解析(1):IoC之BeanFactory
- Spring 源码阅读之BeanFactory
- Spring IoC源码之BeanFactory
- spring源码阅读之BeanFactory
- Spring BeanFactory getBean 源码剖析
- spring源码分析—BeanFactory
- spring源码解读:BeanFactory接口
- spring中BeanFactory源码解读
- 【Spring】BeanFactory解析bean详解
- Spring源码阅读——BeanFactory体系结构
- Spring源码由浅入深系列四 创建BeanFactory
- 二叉树非递归遍历(前中后)
- openCV中查找表的作用
- 黑马商城项目_商城主页底部导航
- 【云星数据---Apache Flink实战系列(精品版)】:Apache Flink高级特性与高级应用004-Flink的作业调度情况001
- 图像处理(六):二值化
- Spring BeanFactory源码解析
- IHS Kingdom Suite Advanced(地震解释软件) v2016.1官方版下载
- leetcode-16-3Sum Closest
- PAT乙级1064
- C语言常用排序
- 一. FragmentLayout 加上 TabLayout 进行嵌套碎片
- 网络协议-TCP和UDP最完整的区别介绍
- React Native基于webstorm开发出更快速的模板
- 求职经历