Spring IOC 源码解析(二) BeanFactory

一.前言

Spring IOC 容器顶级接口 BeanFactory 描述:

定义了最基本的 ioc 容器规范,定义了 ioc 容器具有最基础的方法

二.方法:

BeanFactory 的所有方法:

boolean	containsBean(java.lang.String name)
    此bean工厂是否包含具有给定名称的bean定义或外部注册的单例实例?
java.lang.String[]	getAliases(java.lang.String name)
    返回给定bean名称的别名(如果有)。
<T> T	getBean(java.lang.Class<T> requiredType)
    返回唯一匹配给定对象类型的bean实例(如果有)。
<T> T	getBean(java.lang.Class<T> requiredType, java.lang.Object... args)
    返回指定bean的实例,该实例可以是共享的或独立的。
java.lang.Object	getBean(java.lang.String name)
    返回指定bean的实例,该实例可以是共享的或独立的。
<T> T	getBean(java.lang.String name, java.lang.Class<T> requiredType)
    返回指定bean的实例,该实例可以是共享的或独立的。
java.lang.Object	getBean(java.lang.String name, java.lang.Object... args)
    返回指定bean的实例,该实例可以是共享的或独立的。
<T> ObjectProvider<T>	getBeanProvider(java.lang.Class<T> requiredType)
    返回指定bean的提供程序,允许对实例进行惰性按需检索,包括可用性和唯一性选项。
<T> ObjectProvider<T>	getBeanProvider(ResolvableType requiredType)
    返回指定bean的提供程序,允许对实例进行惰性按需检索,包括可用性和唯一性选项。
java.lang.Class<?>	getType(java.lang.String name)
    确定具有给定名称的bean的类型。
boolean	isPrototype(java.lang.String name)
    这个bean是否是原型
boolean	isSingleton(java.lang.String name)
    这个bean是否是共享单例
boolean	isTypeMatch(java.lang.String name, java.lang.Class<?> typeToMatch)
    检查具有给定名称的bean是否与指定的类型匹配。
boolean	isTypeMatch(java.lang.String name, ResolvableType typeToMatch)
    检查具有给定名称的bean是否与指定的类型匹配。

可以看出来,所有的方法都是围绕着注册的 bean .这也是我们 ioc 容器的核心方法

三.BeanFactory 生命周期接口(简述)

Bean工厂实现应尽可能支持标准 bean 生命周期接口。完整的初始化方法及其标准顺序是:

前面是调用实现指定的接口的 bean,{} 中是调用的方法.
对于 (仅在应用程序上下文中运行时才适用) 表示的过程,只有使用了 ApplicationContext (简单容器的高级封装,即应用上下文) ,才会调用实现了该接口的 bean 的指定方法.(细节后期会讲,这里主要讲 BeanFactory)

  1. BeanNameAware { setBeanName}
  2. BeanClassLoaderAware{ setBeanClassLoader}
  3. BeanFactoryAware {setBeanFactory}
  4. EnvironmentAware {setEnvironment}
  5. EmbeddedValueResolverAware{setEmbeddedValueResolver}
  6. ResourceLoaderAware{ setResourceLoader} (仅在应用程序上下文中运行时才适用)
  7. ApplicationEventPublisherAware{setApplicationEventPublisher} (仅在应用程序上下文中运行时才适用)
  8. MessageSourceAware {setMessageSource} (仅在应用程序上下文中运行时才适用)
  9. ApplicationContextAware{setApplicationContext} (仅在应用程序上下文中运行时才适用)
  10. ServletContextAware {setServletContext} (仅在应用程序上下文中运行时才适用)
  11. BeanPostProcessors {postProcessBeforeInitialization}
  12. InitializingBean's {afterPropertiesSet}
  13. a custom init-method definition (自定义初始化方法)
  14. BeanPostProcessors {postProcessAfterInitialization}
  15. DestructionAwareBeanPostProcessors {postProcessBeforeDestruction}
  16. DisposableBean's {destroy}

四. BeanFactory 一级子接口 HierarchicalBeanFactory & ListableBeanFactory & AutowireCapableBeanFactory

1.HierarchicalBeanFactory

继承 BeanFactory 的子接口,使 BeanFactory 具有层次结构(父容器)。
可以在 ConfigurableBeanFactory (HierarchicalBeanFactory 的一级子接口) 接口中找到允许以可配置方式设置父级的bean工厂的相应 setParentBeanFactory 方法。

唯一的两个方法:

boolean	containsLocalBean(java.lang.String name)
    返回本地 beanFactory 是否包含给定名称的bean,忽略在祖先上下文中定义的bean
BeanFactory	getParentBeanFactory()
    返回父bean工厂,如果没有,则返回 null

2.ListableBeanFactory

继承 BeanFactory 的子接口,可以列举出 bean 的列表,使容器不仅限于每次只获取一个 bean ,可以通过指定 Class 获取这个 Class 的所有实现 bean .

如果也继承了 HierarchicalBeanFactory,则返回值不会考虑 BeanFactory 层次结构,而只涉及当前工厂中定义的bean。使用 BeanFactoryUtils 也可以获取祖先工厂中的 bean。

boolean	containsBeanDefinition(java.lang.String beanName)
    检查此bean工厂是否包含具有给定名称的bean定义。
<A extends java.lang.annotation.Annotation>
A	findAnnotationOnBean(java.lang.String beanName, java.lang.Class<A> annotationType)
    如果在给定的类本身上找不到注释,则在指定的bean上查找annotationType的注释,遍历其接口和超类。
int	getBeanDefinitionCount()
    返回工厂中定义的bean数。
java.lang.String[]	getBeanDefinitionNames()
    返回此工厂中定义的所有bean的名称。
java.lang.String[]	getBeanNamesForAnnotation(java.lang.Class<? extends java.lang.annotation.Annotation> annotationType)
    查找Class具有提供Annotation 类型的bean的所有名称,而不创建相应的bean实例。
java.lang.String[]	getBeanNamesForType(java.lang.Class<?> type)
    返回与给定类型(包括子类)匹配的bean的名称,从bean定义或getObjectType FactoryBeans 的值判断。
java.lang.String[]	getBeanNamesForType(java.lang.Class<?> type, boolean includeNonSingletons, boolean allowEagerInit)
    返回与给定类型(包括子类)匹配的bean的名称,从bean定义或getObjectType FactoryBeans 的值判断。
java.lang.String[]	getBeanNamesForType(ResolvableType type)
    返回与给定类型(包括子类)匹配的bean的名称,从bean定义或getObjectType FactoryBeans 的值判断。
<T> java.util.Map<java.lang.String,T>	getBeansOfType(java.lang.Class<T> type)
    返回与给定对象类型(包括子类)匹配的bean实例,从bean定义或getObjectTypeFactoryBeans 的值 判断。
<T> java.util.Map<java.lang.String,T>	getBeansOfType(java.lang.Class<T> type, boolean includeNonSingletons, boolean allowEagerInit)
    返回与给定对象类型(包括子类)匹配的bean实例,从bean定义或getObjectTypeFactoryBeans 的值 判断。
java.util.Map<java.lang.String,java.lang.Object>	getBeansWithAnnotation(java.lang.Class<? extends java.lang.annotation.Annotation> annotationType)
    找到所有Class提供Annotation类型的bean,返回带有相应bean实例的bean名称Map。

注意:除了getBeanDefinitionCountcontainsBeanDefinition之外,此接口中的方法不是为频繁调用而设计的。实施可能很慢。

3.AutowireCapableBeanFactory

继承 BeanFactory 的子接口,使容器具有自动装配的 bean 和创建 bean 的能力,以及调用一系列 bean 生命周期的方法.如:setBeanName,setBeanFactory, postProcessBeforeInitialization 等

其他框架的集成代码可以利用此接口来连接和填充Spring无法控制其生命周期的现有Bean实例.

请注意,此接口不是由 ApplicationContext 外观实现的,因为应用程序代码几乎不使用它。也就是说,它也可以从应用程序上下文中获得,可以通过 ApplicationContext 的ApplicationContext.getAutowireCapableBeanFactory() 方法访问。

该接口的方法较多,具体可以看源码,
主要方法功能是:

  1. 创建 bean 实例
  2. 回调一系列的 bean 生命周期的方法(setBeanName,setBeanFactory, postProcessBeforeInitialization 等).

Spring IOC 源码解析(三) DefaultListableBeanFactory

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值