ApplicationContext接口是BeanFactory的子接口,代表一个应用的上下文环境。在BeanFactory的基础上,
ApplicationContext扩展了更多使用的功能,如Bean的声明周期管理、框架事件体系、国际化支持等功能,并且这些
功能大部分可以通过少量配置以零编码的方式实现。因此,应用上下文ApplicationContext是访问Spring IoC容器最常
用的接口。
这里先说明两种方式的区别:
(1)ApplicationContext接口操作更加简繁
(2)在加载完毕配置文件并初始化Spring IoC容器时,如果使用ApplicationContext接口的实现类,则会在同期初始化完毕后就会构造所有Bean对象;而如果使用其他BeanFactory接口实现类,则不会构造Bean对象,而是延迟到调用getBean()方法时构造。因此Application的初始化时间会稍长一些,但是调用getBean()是由于Bean已经构造完毕,速度会更快。
下面,我就通过对比BeanFactory与ApplicationContext进行装载配置的区别,体现ApplicationContext接口的便捷。
(1)创建一个Web Project;
(2)在工程下面,把包文件都复制到WEB-INF/lib文件夹下;
(3)创建一个Package,例如我这里的名称为com.loster.li;
(4)在com.loster.li包下面创建一个Book类:
package com.loster.li;
public class Book {
private String name; //书名
private String author; //作者
private String publishHouse; //出版社
private double price; //价格
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPublishHouse() {
return publishHouse;
}
public void setPublishHouse(String publishHouse) {
this.publishHouse = publishHouse;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
(5)接下来,也是在这个包下面创建一个XML配置文件,bean.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="book" class="com.loster.li.Book">
<property name="name" value="SSH开发"></property>
<property name="author" value="xiaoli"></property>
<property name="publishHouse" value="某出版社"></property>
<property name="price" value="45"></property>
</bean>
</beans>
(6)创建一个BeanTest类装载配置文件:
package com.loster.li;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.ClassPathResource;
public class BeanTest {
public static void main(String[] args){
//根据配置文件创建ClassPathResource对象
ClassPathResource resource = new ClassPathResource("com/loster/li/bean.xml");
//创建BeanFactory对象
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(resource);
//从BeanFactory对象中,根据id获取具体对象
Book book = (Book)factory.getBean("book");
System.out.println(book.getName());
System.out.println(book.getAuthor());
System.out.println(book.getPublishHouse());
System.out.println(book.getPrice());
}
}
这里首先用ClassPathResource类指定了配置文件是位于类路径下的bean.xml,然后构DefaultListableBeansFactory
对象,并将DefaultListableBeansFactory对象传递为新构建的XMLBeanDefinitionReader对象,再之后,通过
XMLBeanDefinitionReader对象加载配置文件,最后通过DefaultListableBeansFactory对象中的getBean()方法从IoC
容器中获取了Bean。
(7)运行BeanTest.java,结果如下:
package com.loster.li;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ApplicationTest {
public static void main(String[] args){
ClassPathXmlApplicationContext context = new
ClassPathXmlApplicationContext("com/loster/li/bean.xml");
Book book = (Book)context.getBean("book");
System.out.println(book.getName());
System.out.println(book.getAuthor());
System.out.println(book.getPublishHouse());
System.out.println(book.getPrice());
}
}
(9)运行ApplicationTest.java,结果如下:
通过上面的例子,可以看出,通过ApplicationTest装载配置与BeanFactory可以达到相同的效果,而且前者的操作更
加简单便捷。