Spring源码解析之BeanFactory和ApplicationContext的区别
相同点:
1.ApplicationContext间接继承了BeanFactory接口,在ClassPathXmlApplicationContext构造函数的源码中获取了BeanFactory,所以ApplicationContext拥有BeanFactory的所有功能(加载bean和获取bean的功能)。
不同点:
1.ApplicationContext提供的额外功能:
- 增加SPEL语言的支持,类似于Struts2的OGNL表达式。
- 增加了属性注册编辑器,由于XML配置文件中bean的类型都是String类型的,所以遇到Date等其他类型时,需要增加属性注册编辑器来转换类型,否则会报错。
- 增加了几个特殊的内置类:EnvironmentAware,MessageSourceAware(国际化)
- 增加了几个忽略自动装配的接口:BeanFactoryAware(实现此接口,可以直接获取BeanFactory对象),ResourceLoaderAware(通过url或者file来访问资源),ApplicationEventPublisherAware(消息发送、响应机制),ApplicationContextAware(直接获取ApplicationContext随对象)
- 增加AspectJ来支持AOP功能
2.实例化bean的区别:
- BeanFactory采用延迟加载实例,在程序中使用getBean("")才会实例化bean。
- ApplicationContext采用非延迟加载实例,意思就是说在解析xml配置文件时,就已经初始化并加载好各个bean实例,这样可以在程序启动时及时发现错误。
参考: