Spring Bean 封装机制
Spring 大量引入了Java 的Reflection机制,通过动态调用的方式避免硬编码方式的约束,并在此基础上建立了其核心组件BeanFactory,以此作为其依赖注入机制的实现基础。
org.springframework.beans包中包括了这些核心组件的实现类,核心中的核心为BeanWrapper和BeanFactory类。(对其源码进行研读,必有所获)。BeanFactory家族如图1所示。
图1 BeanFactory家族
BeanWrapper
讲的通俗点,就是在运行期,由Spring根据配置文件,将其他对象的引用通过组件的提供的setter方法进行设定。
通过BeanWrapper,我们可以无需在编码时就指定JavaBean的实现类和属性值,通过在配置文件加以设定,就可以在运行期动态创建对象并设定其属性(依赖关系)。
BeanFactory
Bean Factory,顾名思义,负责创建并维护Bean实例。
Bean Factory负责根据配置文件创建Bean实例,可以配置的项目有:
1. Bean属性值及依赖关系(对其他Bean的引用)
2. Bean创建模式(是否Singleton模式,即是否只针对指定类维持全局唯一的实例)
3. Bean初始化和销毁方法
4. Bean的依赖关系
联合上面关于BeanWrapper的内容,我们可以看到,BeanWrapper实现了针对单个Bean的属性设定操作。而BeanFactory则是针对多个Bean的管理容器,根据给定的配置文件,BeanFactory从中读取类名、属性名/值,然后通过Reflection机制进行Bean加载和属性设定。
ApplicationContext
ApplicationContext覆盖了BeanFactory的所有功能,并提供了更多的特性。此外ApplicationContext为与现有应用框架相整合,提供了更为开放式的实现(如对于Web应用,我们可以在web.xml中对ApplicationContext进行配置)。
相对BeanFactory而言,ApplicationContext提供了以下扩展功能:
1. 国际化支持(MessageSource)
我们可以在Beans.xml文件中,对程序中的语言信息(如提示信息)进行定义,将程序中的提示信息抽取到配置文件中加以定义,为我们进行应用的各语言版本转换提供了极大的灵活性。
2. 资源访问(ResourceLoader)
支持对文件和URL的访问。
3. 事件传播(ApplicationEventPublisher)
事件传播特性为系统中状态改变时的检测提供了良好支持。
4. 多实例加载可以在同一个应用中加载多个Context实例。(ListableBeanFactory)
WebApplicationContext
与ApplicationContext的区别:ApplicationContext均通过编码加载。对于Web应用,Spring提供了可配置的ApplicationContext加载机制。
两种加载器:ContextLoaderServlet , ContextLoaderListener
配置非常简单,在web.xml中增加:
<listener>
<listener-class>org.springframework.web.context.contextLoaderLisenter</listener-class>
</listener>
或:
<servlet>
<servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.contextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
通过以 上配置,Web容器会自动加载/WEB-INF/applicationContext.xml初始化ApplicationContext。