Spring源码分析:BeanFactory体系详解一(接口分析)

1、BeanFactory接口体系

BeanFactory体系下主要可以分类两类,基础BeanFactory的体系:主要包括BeanFactory、HierarchicalBeanFactory、AutowireCapableBeanFactory、ListableBeanFactory、ConfigurableBeanFactory和ConfigurableListableBeanFactory。
另一类主要是继承自ApplicationContext的应用上下文接口:主要包括ApplicationContext、ConfigurableApplicationContext、WebApplicationContext和ConfigurableWebApplicationContext。

1.1 、基础BeanFactory层级结构

1.1.1、BeanFactory

BeanFactory是Spring Bean容器的根类,是容器最基本客户端试图。实现类应该尽可能地支持生命周期函数。

public interface BeanFactory {
   
	// FactoryBean实例前缀
	String FACTORY_BEAN_PREFIX = "&";

	// 通过bean名称获取bean实例,无论是Singleton还是Prototype。
	// 如果是name是别名,会解析为最终的真实名称。
	// 如果在本BeanFactory没有找到实例,会询问父BeanFactory查找
	// NoSuchBeanDefinitionException、BeansException
	Object getBean(String name) throws BeansException;

	// 与getBean(String name)基本相同,增加强制类型校验,如果类型异常抛出BeanNotOfRequiredTypeException
	<T> T getBean(String name, Class<T> requiredType) throws BeansException;

	// 通过给定的参数匹配构造函数或者工厂方法创建给定名称的实例。
	Object getBean(String name, Object... args) throws BeansException;

	// 按类型获取唯一bean,会涉及primary逻辑,priority逻辑
	<T> T getBean(Class<T> requiredType) throws BeansException;

	// 通过制定类型和参数,选择特定的构造函数或工厂方法,获取唯一对象。会涉及primary逻辑,priority逻辑
	<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

	// 返回指定类型的提供器,允许延迟后台检索实例,包括可用性和唯一性选项。
	<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);

	// 返回匹配类型的实例,可以是泛型类型声明。注意与反射注入点不同,不支持集合类型。
	// 为了以编程方式检索匹配特定类型的bean列表,请在这里指定实际的bean类型作为参数,
	// 然后使用{@link ObjectProvider#orderedStream()}或它的延迟流/迭代选项
	<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);

	// 当前BeanFactory是否包含bean定义或者以给定的name扩展注册的单例
	// 如果给点的name是别名,会通过别名系统还原为最原始的bean名称
	// 如果是HierarchicalBeanFactory,本BeanFactory没有找到,会从父BeanFactory查询
	// 只要BeanDefiniton是定义了的,该方法都会返回ture,无论是concrete or abstract, lazy or eager, in scope or not。
	// 因此,并不是本方法返回true就表示getBean就能成功地获取实例
	boolean containsBean(String name);

	// 如果给点的name是别名,会通过别名系统还原为最原始的bean名称
	// 如果是HierarchicalBeanFactory,本BeanFactory没有找到,会从父BeanFactory查询
	// 判断给定name的bean是否定义为单例
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

	// 如果给点的name是别名,会通过别名系统还原为最原始的bean名称
	// 如果是HierarchicalBeanFactory,本BeanFactory没有找到,会从父BeanFactory查询
	// 判断给定name的bean是否定义为原型
	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

	// 检查具有给定名称的bean是否与指定的类型匹配。
	// 更具体地说,检查给定名称的getBean调用是否会返回一个可分配给指定目标类型的对象。
	// 如果给点的name是别名,会通过别名系统还原为最原始的bean名称
	// 如果是HierarchicalBeanFactory,本BeanFactory没有找到,会从父BeanFactory查询
	boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

	// 检查具有给定名称的bean是否与指定的类型匹配。
	// 更具体地说,检查给定名称的getBean调用是否会返回一个可分配给指定目标类型的对象。
	// 如果给点的name是别名,会通过别名系统还原为最原始的bean名称
	// 如果是HierarchicalBeanFactory,本BeanFactory没有找到,会从父BeanFactory查询
	boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

	// 推断指定name的bean的类型。更具体地说,返回getBean(name)对象的类型。
	// 对于FactoryBean,返回的FactoryBean创建对象的类型,与FactoryBean#getObjectType()的结果相同
	// 可能导致初始化之前为初始化的FactoryBean,参见getType(String, boolean)方法
	// 如果给点的name是别名,会通过别名系统还原为最原始的bean名称
	// 如果是HierarchicalBeanFactory,本BeanFactory没有找到,会从父BeanFactory查询
	@Nullable
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;

	// 与getType(string)相似,只是指定是否允许FactoryBean初始化
	@Nullable
	Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;

	// 返回指定名称的所有别名信息,如果name是别名,返回原始名和其他笔名,原始名在数组的第一个元素
	// 如果是HierarchicalBeanFactory,本BeanFactory没有找到,会从父BeanFactory查询
	String[] getAliases(String name);
	
}

1.1.2、HierarchicalBeanFactory

HierarchicalBeanFactory扩展自BeanFactory,增加了层级结构管理的功能。通过ConfigurableBeanFactory接口中的setParentBeanFactory,允许配置父BeanFactory。

public interface HierarchicalBeanFactory extends BeanFactory {
   

	// 返回当前BeanFactory的父BeanFactory,如果没有返回null
	@Nullable
	BeanFactory getParentBeanFactory();
	
	// 返回本BeanFactory是否包含指定namne的bean,不考虑祖先BeanFactory
	boolean containsLocalBean(String name);
	
}

1.1.3、AutowireCapableBeanFactory

AutowireCapableBeanFactory是对BeanFactory的扩展,主要增加了自动装配Bean属性依赖的能力。提供多种自动装配策略和细粒度控制装配过程的方法。

// 扩展自动装配功能,常引用与框架集成代码中,用于控制Spring无法控制的现有Bean。
// 注意ApplicationContext未实现该接口,因为应用程序极少用到该类。
// 可以通过ApplicationContext的getAutowireCapableBeanFactory获取到该类实例
// 也可以通过BeanFactoryAware来访问,通过将BeanFactory转换
public interface AutowireCapableBeanFactory extends BeanFactory {
   

	// 常量,指示没有外部定义的自动装配。
	// 请注意,BeanFactoryAware等和注释驱动的注入仍然会被应用。 
	int AUTOWIRE_NO = 0;

	// 常量,表示通过name注入bean属性 
	int AUTOWIRE_BY_NAME = 1;
	
	// 常量,表示通过type注入bean属性 
	int AUTOWIRE_BY_TYPE = 2;

	// 常量,表示通过满足最贪婪构造函数的方式注入(包括解析适当的构造函数) 
	int AUTOWIRE_CONSTRUCTOR = 3;

	// 弃用常量,表明通过bean的类自省推断适当的注入策略
	@Deprecated
	int AUTOWIRE_AUTODETECT = 4;

	// 该属性是一种约定俗成的用法:以类全限定名+.ORIGINAL 作为Bean Name
	// 用于告诉Spring,在初始化的时候,需要返回原始给定实例,而别返回代理对象
	// initializeBean(Object, String)
	// applyBeanPostProcessorsBeforeInitialization(Object, String)
	// applyBeanPostProcessorsAfterInitialization(Object, String)
	String ORIGINAL_INSTANCE_SUFFIX = ".ORIGINAL";
	
	//-----------------------------------------------
	// 用于创建和填充外部bean实例的典型方法
	//-----------------------------------------------

	// 完全创建一个值得类的新实例。并执行完的全部初始化,包括所有可用的BeanPostProcessor
	// 注意: 这个方法的目的是创建实例,填充注解的字段和方法,以及执行所有的初始化回调。
	// 	但是并不会执行按name和按类型装配的属性,要达到此目的可以使用createBean(Class, int, boolean)
	<T> T createBean(Class<T> beanClass) throws BeansException;

	// 通过应用初始化后置回调和bean属性后置处理来填充给定的bean实例。
	// 注意:这本质上是为了重新填充注解字段和方法,无论是创建新实例还是反序列化实例。
	// 它并不意味着传统的按名称或按类型自动装配属性;使用autowireBeanProperties实现这些目的。
	void autowireBean(Object existingBean) throws BeansException;

	// 配置给定的原始bean:自动装配bean属性、应用bean属性值、应用setBeanName和setBeanFactory等工厂回调,
	// 还应用所有BeanPostProcessor(包括包装给定生bean的处理器)。
	// 是initializeBean方法的超集,完全应用了相应Bea
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值