目录
概述
BeanFactory是容器的顶层接口,也是spring最核心的容器,管理bean的核心方法都在BeanFactory接口中定义。像ApplicationContext接口,ConfigurableApplicationContext接口都间接继承BeanFactory接口,既ApplicationContext调用getBean()方法都是BeanFactory提供的。
接口方法
获取bean的重载方法▼
Object getBean(String var1) throws BeansException;
<T> T getBean(String var1, Class<T> var2) throws BeansException;
Object getBean(String var1, Object... var2) throws BeansException;
<T> T getBean(Class<T> var1) throws BeansException;
<T> T getBean(Class<T> var1, Object... var2) throws BeansException;
获取bean的ObjectProvider▼
<T> ObjectProvider<T> getBeanProvider(Class<T> var1);
<T> ObjectProvider<T> getBeanProvider(ResolvableType var1);
是否含有bean,按照bean的名称或别名查找▼
boolean containsBean(String var1);
是否是单例作用域▼
boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
是否是原型作用域▼
boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
检查具有给定信息的Bean是否与指定的类型匹配。更具体地说,检查对给定名称的getBean调用是否将返回可分配给指定目标类型的对象。将别名转换回相应的规范bean名称。将询问父工厂是否在该工厂实例中找不到该bean。▼
boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException;
获取bean对应的class▼
@Nullable
Class<?> getType(String var1) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String var1, boolean var2) throws NoSuchBeanDefinitionException;
获取bean所有的别名▼
String[] getAliases(String var1);
BeanFactory重要的子类
DefaultListableBeanFactory
DefaultListableBeanFactory是一个成熟的,可以独立使用的容器。是整个bean加载的核心,也是spring注册及加载bean的默认实现。如上uml图所示拥有以下能力
- AliasRegistry:AliasRegistry是制定别名的管理规则,定义了对alias的简单的简单增改删等操作。
- SimpleAlliasRegistry:主要是用map作为alias的缓存,并对接口AliasRegistry进行实现。
- SingletonBeanRegistry:定义对单例的注册及获取。
- BeanFactory:定义获取bean及bean的各种属性
- DefaultSingletonBeanRegistry:对接口SingletonBeanRegistry各函数的实现。
- HierarchicalBeanFactory:继承BeanFactory,也就是在BeanFactory的基础上定义了对parentFactory的支持。
- BeanDefinitionRegistry:定义对BeanDefinition的各种增改删操作。BeanDefinition中定义的属性有诸如类名、sccope、属性、构造函数参数列表、依赖的bean、是否单例类、是否懒加载等,其实就是将Bean的定义信息存储到这个BeanDefinition相应的属性中,之后对Bean的操作就是直接对BeanDefinition进行的。
- FactoryBeanRegistrySupport:在DefaultSingletonBeanRegistry基础上增加了对FactoryBean的特殊处理功能。
- ConfigurableBeanFactory:提供配置Factory的各种方法。
- ListableBeanFactory:根据各种条件获得bean的配置清单。
- AbstractBeanFactory:综合FactoryBeanRegistrySupport和ConfigurableBeanFactory的功能。
- AutowireCapableBeanFactory:提供创建bean自动注入,初始化以及应用bean的后置处理器
- AbstractAutowireCapableBeanFactory:综合AbstractBeanFactory并对接口Autowire,CapableBeanFactory进行实现。
- ConfigurableListableBeanFactory:BeanFactory配置清单,指定忽略类型及接口等。
DefaultListableBeanFactory也缺少一些能力,比如有如下配置类
@Configuration
public class Config {
@Bean
public Bean1 bean1() {
return new Bean1();
}
@Bean
public Bean2 bean2() {
return new Bean2();
}
}
当注册Config配置bean的时候,Bean1核Bean2并不能注入到DefaultListableBeanFactory中去,此时需要BeanFactory的后置处理器去完成对Bean1和Bean2这些带有@Bean注解bean注册功能。spring内置后置处理器有如下5个
//BeanFactory后置处理器
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
//Bean后置处理器
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
//Bean后置处理器
org.springframework.context.annotation.internalCommonAnnotationProcessor
//BeanFactory后置处理器
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
使用internalConfiguratibmAnnotationProcessor后置处理可以做到解析并注册@Configuration配置类中的bean的能力,再使用internalAutowiredAnnotationProcessor的Bean后置处理器增加对注解@Autowired的解析能力,使用internalCommonAnnotationProcessor的Bean后置处理器增加对注解@Resource的解析能力,使得Bean1拥有Bean2的依赖注入
ApplicationContext
除了继承BeanFactory的功能外ApplictionContext拥有以下能力
- messageScore:国际化资源处理能力
通过读取自己配置的properties文件从而得到国际化信息,调用getMessage()方法得到具 体的国际化描述信息
- ResourcePatternResolver:通配符匹配资源能力
[calsspath:]是去类路径下边去找propertres,如果想去jar包中去找要写成 [classpath*:META-INFO...]
Resource[] rescue = getResource("calsspath:application.propertres");
- ApplicationEventPublisher:发布事件对象
publishEvent();
- EnvironmentCapable:处理环境信息的能力
可以获取环境变量也可以获取prepertres文件中的键值对
getEnvironment().getProperty("java_home");
getEnvironment().getProperty("server.port");
ApplicationContext接口典型的实现有如下几个
ClassPathXmlApplicationContext
读取类路径下的*.xml文件进行bean注入
FileSystemXmlApplicationContext
读取文件路径的*.xml文件进行bean注入
ConfigurableApplicationContext
此接口结合了所有ApplicationContext需要实现的接口。因此大多数的ApplicationContext都要实现此接口。它在ApplicationContext的基础上增加了一系列配置应用上下文的功能。配置应用上下文和控制应用上下文生命周期的方法在此接口中被封装起来,以免客户端程序直接使用。
AnnotationConfigApplicationContext
较为实用的,基于注解实现的容器,将配置类作为参数传入该容器的构造参数中进行bean的注入。创建AnnotationConfigApplicationContext后,5个内置的后置处理器会自动加到容器中去,可以直接使用
AnnotationConfigServletWebApplicationContext
与AnnotationConfigApplicationContext类似,增加支持web环境的能力
GenericApplicationContext
GenericApplicationContext通用应用程序上下文实现,该实现内部有一个 DefaultListableBeanFactory 实例。可以采用混合方式处理bean的定义,而不是采用特定的bean定义方式来创建bean。
GenericApplicationContext基本就是对DefaultListableBeanFactory 做了个简易的封装,几乎所有方法都是使用了DefaultListableBeanFactory的方法去实现。
GenericApplicationContext没有添加默认的后置处理器,如果需要进行操作如配置类的bean注入,bean的依赖注入还是需要自行添加后置处理器