版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27868061/article/details/82934450
BeanFactory为spring容器的顶级接口,定义了容器的基本操作
package org.springframework.beans.factory;
import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;
/**
* 访问spring容器的根接口,进一步的接口为
* ListableBeanFactory
* org.springframework.beans.factory.config.ConfigurableBeanFactory
*
* 这个接口由包含许多Bean定义的对象实现,每个都有String名称唯一标识
* 根据Bean的定义,工厂将返回指定类的独立实例(prototype模式),或单个共享实例(single模式)
*
* BeanFactory的重点在于应用程序组件的中央注册表,和应用程序组件的集中性配置
*
* 注意,最好是通过setter,constructor依赖注入(推)的方式配置应用程序对象
* 这比通过BeanFactory查找(拉)的方式要好
*
* BeanFactory将加载存储在配置中的bean定义(例如XML文档)
*
* 与ListableBeanFactory相比,接口中所有方法都会见车父工厂,如果这是一个HierarchicalBeanFactory
* 如果在当前BeanFactory实例中没有找到,将会向父工厂查找
* 当前工厂实例暴露的Bean将会覆盖父工厂实例的同名Bean
*
* Bean的初始化顺序为
* BeanNameAware's
* BeanClassLoaderAware
* BeanFactoryAware
* EnvironmentAware's {@code setEnvironment}
* EmbeddedValueResolverAware's {@code setEmbeddedValueResolver}
* ResourceLoaderAware's {@code setResourceLoader}
* ApplicationEventPublisherAware's {@code setApplicationEventPublisher}
* MessageSourceAware's {@code setMessageSource}
* ApplicationContextAware's {@code setApplicationContext}
* ServletContextAware's {@code setServletContext}
* {@code postProcessBeforeInitialization} methods of BeanPostProcessors
* 's {@code afterPropertiesSet}
* {@code postProcessAfterInitialization} methods of BeanPostProcessors
*
* Bean的销毁顺序为
* {@code postProcessBeforeDestruction} methods of DestructionAwareBeanPostProcessors
* DisposableBean's {@code destroy}
* 定制的destroy-method
*/
/**
* spring bean容器的根接口,注意与FactoryBean区分
*/
public interface BeanFactory {
/**
* 前缀,用于获取相应名称bean的FactoryBean
* 当一个Bean由工厂Bean创建时,如果使用指定名称获取Bean,会得到Bean的实例
* 名称前加上前缀,会获取到FactoryBean实例
*/
String FACTORY_BEAN_PREFIX = "&";
/**
* 返回指定名称Bean的实例,可以是共享的或者独立的
* 这个方法允许spring BeanFactory可以被用作单例或原型设计模式
* 调用者可以保留单例模式返回对象的引用
* 转换别名为相应的规范bean名称
* 当在此工厂实例找不到时,会向父工厂请求
*/
Object getBean(String name) throws BeansException;
/**
* 返回指定名称指定类型的Bean实例,如果类型不对,则抛出BeanNotOfRequiredTypeException
*/
<T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException;
/**
* 获取指定名称Bean,允许指定显式构造函数参数/工厂方法参数,覆盖bean定义中指定的默认参数
* 这个Bean必须被标志为原型模式,否则抛出BeanDefinitionStoreException
*/
Object getBean(String name, Object... args) throws BeansException;
/**
* 返回唯一的指定类型对象的Bean实例,如果有多个,抛出异常
* 指定类型可以是接口或者超类
*
*/
<T> T getBean(Class<T> requiredType) throws BeansException;
/**
* 指定类型必须为原型模式
*/
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
/**
* 容器是否包含指定名称的Bean
* 如果给定名称为别名,它将会被转换为相应的规范bean名称
* 如果工厂是分层的,会询问任何父工厂
*/
boolean containsBean(String name);
/**
* 指定名称Bean是否为共享单例Bean
* 如果为别名将会转换为规范bean名称,如果此工厂实例中找不到将询问父工厂
*/
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
/**
* 指定名称Bean为原型模式吗
*/
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
/**
* 检查具有指定名称的Bean是否与指定的类型相匹配
*/
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
/**
* 指定名称的Bean是否与指定类型相匹配
*/
boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
/**
* 获取指定名称Bean的类型
*/
@Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
/**
* 返回给定Bean名称的别名
* 在getBean调用中使用时,所有这些别名都指向同一个Bean
* 如果参数为别名,则返回原始bean名称和其他别名
*/
String[] getAliases(String name);
}
可以看到,BeanFactory主要定义了一些获取Bean,类型匹配,存在查询之类的方法
1.别名系统:一个Bean有一个唯一规范名称,也有一系列别名,在可以使用name的地方都可以使用别名代替,BeanFactory只声明了获取别名方法,没有注册别名方法
2.设计模式:Bean有单例(singleton),原型(prototype)两种模式,单例Bean为所有调用共享,原型模式每次调用返回独立Bean
3.指定参数获取Bean:有两个方法可以指定获取Bean时的构造函数参数/工厂方法参数,而且只有在原型模式时可以使用