文章目录
Spring源码分析(BeanFactory)
一、BeanFactory
BeanFactory
是最顶层的容器接口,只提供了获取Bean相关的一些方法。
public interface BeanFactory {
// 对FactoryBean的转义定义,因为如果使用bean的名字检索FactoryBean得到的对象是工厂生成的对象
String FACTORY_BEAN_PREFIX = "&";
// 根据bean的名字,在IOC容器中得到bean实例,
Object getBean(String name) throws BeansException;
// 根据bean的名字,在IOC容器中得到bean实例,args:显式参数(必须为非单例模式)
Object getBean(String name, Object... args) throws BeansException;
// 根据bean的名字获得对象,并转换为Class类型(可以不用进行类型转换)
<T> T getBean(String name, Class<T> requiredType);
// 根据bean的类型获得对象(必须是拥有唯一实现类)
<T> T getBean(Class<T> requiredType) throws BeansException;
// 根据bean的类型获得对象,args:显式参数
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
// 判断IOC容器是否有这个名字的bean
boolean containsBean(String name);
// 判断这个bean是不是单例
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
// 判断这个bean是不是多例
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
// 获取bean实例的Class类型
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
// 这里得到bean的别名,如果根据别名检索,那么其原名也会被检索出来
String[] getAliases(String name);
}
二、ApplicationContext 的父系
ApplicationContext
是更高级的容器接口,继承了许多其他接口,提供了更多的功能。
- 获取 Environment(EnvironmentCapable)
- getBean 的扩展(ListableBeanFactory)
- 事件的发布与监听机制(ApplicationEventPublisher)
- 支持父子容器(HierarchicalBeanFactory)
- 国际化(MessageSource)
- 事件的发布与监听机制(ApplicationEventPublisher)
- 资源访问(ResourcePatternResolver)
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
@Nullable
String getId();
String getApplicationName();
String getDisplayName();
long getStartupDate();
@Nullable
ApplicationContext getParent();
// 用于进行手动的 Bean 注入和依赖注入
AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}
1、HierarchicalBeanFactory
HierarchicalBeanFactory
用于表示具有层次结构的 BeanFactory 容器。
-
支持父子容器的关系,一个 BeanFactory 可以有一个或多个父容器。
子容器可以访问父容器中定义的 Bean,但父容器不能访问子容器中定义的 Bean。
-
如果子容器中不存在某个 Bean,则会委托父容器进行查找。
public interface HierarchicalBeanFactory extends BeanFactory {
@Nullable
BeanFactory getParentBeanFactory();
boolean containsLocalBean(String name);
}
2、ListableBeanFactory
ListableBeanFactory
扩展了 BeanFactory 接口,提供了额外的功能来 获取 Bean 及其相关信息