Spring源码学习(一)
(一): Resource接口
Resource接口实现类
资源加载器 ResourceLoader接口
ResourceLoader接口实现类
(二)BeanFactory
BeanFactory:
- HierarchicalBeanFactory: 定义父子工厂(父子容器)
- ListableBeanFactory: 实现类DefaultListableBeanFactory,保存了ioc容器的核心信息
- AutowireCapableBeanFactory: 提供自动装配能力
- AnnotationApplicationContext 组合了档案馆,有自动装配能力
AnnotationConfigApplicationContext 继承 GenericApplicationContext,GenericApplicationContext 组合了 DefaultListableBeanFactory,DefaultListableBeanFactory 保存ioc容器的核心信息。
public class **GenericApplicationContext** extends AbstractApplicationContext implements BeanDefinitionRegistry {
private final **DefaultListableBeanFactory** beanFactory;
.....
}
DefaultListableBeanFactory
BeanFactory和ApplicationContext有什么区别?
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
(1)BeanFactory:是Spring里面最底层的接口,包含了各种Bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。ApplicationContext接口作为BeanFactory的派生,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能:
①继承MessageSource,因此支持国际化。
②统一的资源文件访问方式。
③提供在监听器中注册bean的事件。
④同时加载多个配置文件。
⑤载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层。
(2)①BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。这 样,我们就不能发现一些存在的Spring的配置问题。如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常。
(3)BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式创建,如使用ContextLoader。
(4)BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。