一.前言
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)
- BeanNameAware { setBeanName}
- BeanClassLoaderAware{ setBeanClassLoader}
- BeanFactoryAware {setBeanFactory}
- EnvironmentAware {setEnvironment}
- EmbeddedValueResolverAware{setEmbeddedValueResolver}
- ResourceLoaderAware{ setResourceLoader} (仅在应用程序上下文中运行时才适用)
- ApplicationEventPublisherAware{setApplicationEventPublisher} (仅在应用程序上下文中运行时才适用)
- MessageSourceAware {setMessageSource} (仅在应用程序上下文中运行时才适用)
- ApplicationContextAware{setApplicationContext} (仅在应用程序上下文中运行时才适用)
- ServletContextAware {setServletContext} (仅在应用程序上下文中运行时才适用)
- BeanPostProcessors {postProcessBeforeInitialization}
- InitializingBean's {afterPropertiesSet}
- a custom init-method definition (自定义初始化方法)
- BeanPostProcessors {postProcessAfterInitialization}
- DestructionAwareBeanPostProcessors {postProcessBeforeDestruction}
- 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。
注意:除了getBeanDefinitionCount
和containsBeanDefinition
之外,此接口中的方法不是为频繁调用而设计的。实施可能很慢。
3.AutowireCapableBeanFactory
继承 BeanFactory 的子接口,使容器具有自动装配的 bean 和创建 bean 的能力,以及调用一系列 bean 生命周期的方法.如:setBeanName,setBeanFactory, postProcessBeforeInitialization 等
其他框架的集成代码可以利用此接口来连接和填充Spring无法控制其生命周期的现有Bean实例.
请注意,此接口不是由 ApplicationContext 外观实现的,因为应用程序代码几乎不使用它。也就是说,它也可以从应用程序上下文中获得,可以通过 ApplicationContext 的
ApplicationContext.getAutowireCapableBeanFactory()
方法访问。
该接口的方法较多,具体可以看源码,
主要方法功能是:
- 创建 bean 实例
- 回调一系列的 bean 生命周期的方法(setBeanName,setBeanFactory, postProcessBeforeInitialization 等).