BeanFactory 与ApplicationContext都是工厂模式中的工厂,但是BeanFactory是面向Spring框架的,ApplicationContext的基础是BeanFactory,大部分应用操作的是ApplicationContext。
BeanFactory
BeanFactory 是最顶层的接口,最主要功能就是各种获取Bean的方法。
ListableBeanFactory 拓展支持 访问容器中Bean的方法,通过类获取BeanName,Bean是否存在等工具方法。
HierarchicalBeanFactory 父子容器接口,子容器可以访问父容器。
ConfigurableBeanFactory 对容器提供了可配置性,设置类加载器,属性编辑器等
SingletonBeanRegistry ConfigurableBeanFactory也继承了这个机构提供运行时向容器注册Bean。
AutowireCapableBeanFactory Bean按照规则进行自动装配
AliasRegistry 别名注册
BeanDefinitionRegistry 配置文件中的Bean通过一个BeanDifintion表示,他就代表了Bean的描述信息,提供向容器注入的功能。
Aware 一个标记接口,spring将会在必要时候调用回调接口
BeanNameAware setBeanName() 该Bean在实例化后在当前容器的名字将会当做参数传递进来,继承Aware的主要功能就是在一些回调点,未我们进行一些hook时提供资源。
通过Xml声明一个Bean,在使用BeanFactory获取实例的流程
- 获取XML资源。
- 实例化一个BeanFactory 如DefaultListableBeanFactory
-
需要一个解析Bean属性的工具BeanDefinitionReader的实例如
- BeanDefinitionReader解析resource
- beanfactory生成bean
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader x = new XmlBeanDefinitionReader(factory);
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
Resource resources = resourcePatternResolver.getResource("classpath:com/smart/beans1.xml");
x.loadBeanDefinitions(resources);
Car car = factory.getBean("car1",Car.class);
car.introduce();
BeanFactory启动后不会去实例化注册进来的Bean,会在第一个调用getBean() 时去具体实例化bean,如果是单例模式的Bean将会被保存缓存中,下次将会直接从缓存中获取。
ApplicationContext
ApplicationContext同样是有BeanFactory派生出来的,提供了很多面向实际应用的功能,主要实现类
ClassPathXmlApplicationContext与FileSystemXmlApplicationContext
主要接口 ApplicationContext 继承与 ListableBeanFactory、HierarchicalBeanFactory、ApplicationEventPublisher:提供容器发布上下文事件的功能,如容器启动事件,关闭事件等实现了ApplicationListener就可以接收处理到这些事件。
MessageSource i18n国际化支持
ResourcePatternResolver 提供资源查找功能
Lifecycle 控制异步处理过程
ConfigurableApplicationContext 提供一些配置项,如refresh(),使ApplicationContext 启动刷新上下文的能力。
- GenericGroovyApplicationContext
- AnnotationConfigApplicationContext
这些ApplicationContext继承与GenericApplicationContext(通用),提供特别的Bean声明方式,从而可以对Bean进行实例化等操作。
ApplicationContext ctx = new AnnotationConfigApplicationContext(Beans.class);
Car car =ctx.getBean("car",Car.class);
- WebApplicationContext
WebApplicationContext extends ApplicationContext 仅新增一个方法, ServletContext getServletContext(); ServletContext与WebApplicationContext建立关系,使两者项目关联。
- ConfigurableWebApplicationContext 配置的方式实例化ApplicationContext,setServletContext()setServletConfig setConfigLocations()
通样WebApplicationContext也提供了支持不同Bean声明的方式的ApplicationContext。
WebApplicationContext初始化,需要ServletContext实例,所有需要Web容器后才能进行初始化,需要在配置自启动Servlet或者监听器,完成初始化工作。
- 监听器启动
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:conf/spring-mvc.groovy
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
- Servlet自启动
<servlet>
<servlet-name>springContextLoaderServlet</servlet-name>
<servlet-class>org.springframework.web.context.ContextLoaderServlet>
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>