Spring有两个核心接口:BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口。它们都可代表Spring容器,Spring是生成Bean实例的工厂,并管理容器中的Bean。在基于Spring的JavaEE应用中,所有的组件都被当成Bean处理,包括数据源、Hibernate的SessionFactory、事务管理器等。
Java程序面向接口编程,无须关心Bean实例的实现类:但Spring容器负责创建Bean实例,因此必须精确知道每个Bean实例的实现类,因此Spring配置文件必须指定Bean实例的实现类。
一、Spring容器
Spring容器最基本的接口就是BeanFactory。BeanFactory负责配置、创建、管理Bean,它有一个子接口:ApplicationContext,因此也被称为Spring上下文。Spring容器还负责Bean与Bean之间的依赖关系。
BeanFactory接口包含如下几个基本方法。
(1)boolean containsBean(String name):判断Spring容器是否包含id为name的Bean实例。
(2) T getBean(Class requiredType):获取Spring容器中属于requiredType类型的、唯一的Bean实例。
(3)Object getBean(String name):返回容器id为name的Bean实例。
(4) T getBean(String name,Class requiredType):返回容器中id为name,并且类型为requiredType的Bean。
(5)Class <> getType(String name) : 返回容器中id为name的Bean实例的类型。
调用者只需使用getBean()方法即可获得指定Bean的引用,无须关心Bean的实例化过程。Bean实例的创建、初始化以及依赖关系的注入都由Spring容器来完成。
ApplicationContext是BeanFactory的子接口,对于大部分JavaEE应用来说,使用它作为Spring容器更方便。其常用的实现类是:FileSystemXmlApplicationContext、ClassPathXmlApplicationContext和AnnotationConfigApplicationContext。如果在Web应用中使用Spring容器,则通常有XmlWebApplicationContext、AnnotationConfigWebApplicationContext两个实现类。
大部分JavaEE应用,可在启动Web应用时自动加载ApplicationContext实例,接受Spring管理的Bean无须知道ApplicationContext的存在,一样可以利用ApplicationContext的管理。
对于独立的应用程序,了通过如下方法实例化BeanFactory
//搜索类加载路径下的beans.xml文件创建Resource对象
Resource isr=new ClassPathResourse("beans.xml");
//创建默认的BeanFactory容器
DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory();
//让默认的BeanFactory容器加载isr对应的xml文件
new XmlBeanDefinitionReader(BeanFactory).loadBeanDefinitions(isr);
或者采用如下代码来创建BeanFactory
//搜索文件系统的当前路径下的beans.xml文件创建Resource对象
Resource isr = new FileSystemResource("beans.xml");
DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory();
//让默认的BeanFactory容器加载isr对应的xml文件
new XmlBeanDefinitionReader(BeanFactory).loadBeanDefinitions(isr);
如果需要同时加载多个xml配置文件来创建Spring容器,则可以采用以下方式:
ApplicationContext appContext=new ClassPathXmlApplicationContext("beans.xml","service.xml");
同样的支持从文件系统进行加载
ApplicationContext appContext appContext=new FileSystemXmlApplicationContext("beans.xml","service.xml");
二、使用ApplicationContext
ApplicationContext包括BeanFactory的全部功能,并且自身还有额外的功能;
当系统创建ApplicationContext容器时,默认会预初始化所有的singleton Bean。也就是说,当ApplicationContext容器初始化完成后,容器会自动初始化所有的singleton Bean,包括调用构造器创建该Bean的实例,并根据
三、ApplicationContext的事件机制
ApplicationContext的事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationCOntext的事件处理。如果容器中有一个ApplicationListener Bean,每当ApplicationContext发布ApplicationEvent时,ApplicationListener Bean将自动触发。
Spring的事件框架中有如下两个重要成员。
ApplicationEvent:容器事件,必须由ApplicationContext发布。
ApplicationListener:监听器,可由容器中的任何监听器Bean担任。