(1)ApplicationContext接口容器
ApplicationContext用于加载Spring的配置文件,在程序中充当“容器”的角色。其实现类有两个。通过Ctrl +T查看:
A、配置文件在类路径下
若Spring配置文件存放在项目的类路径下,则使用ClassPathXmlApplicationContext实现类进行加载。
B、配置文件在本地目录中
若Spring配置文件存放在本地磁盘目录中,则使用FileSystemXmlApplicationContext实现类进行加载。
C、配置文件在项目根路径下
若Spring配置文件存放在项目的根路径下,同样使用FileSystemXmlApplicationContext实现类进行加载。
下面是存放在项目根路径下的情况,该配置文件与src目录同级,而非在src中。
@Test public void test02() { // ClassPathXmlApplicationContext()创建容器, applicationContext.xml需要放在src/resource目录下 ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml"); HelloWorld hw= (HelloWorld) applicationContext.getBean("helloWorld"); System.out.println("===================================="); System.out.println(hw.getMessage()); } @Test public void test03() { // 使用FileSystemXmlApplicationContext()创建容器,applicationContext.xml需要放在根目录src下 ApplicationContext applicationContext=new FileSystemXmlApplicationContext("applicationContext.xml"); HelloWorld hw= (HelloWorld) applicationContext.getBean("helloWorld"); System.out.println("===================================="); System.out.println(hw.getMessage()); }
(2)BeanFactory接口容器
BeanFactory接口对象也可作为Spring容器出现。BeanFactory接口是ApplicationContext接口的父类。
若要创建BeanFactory容器,需要使用其实现类XmlBeanFactory(Ctrl+T查看继承关系)。该类可以加载Spring配置文件。
@Test public void test04(){ // 这个容器的对象不是在容器初始化时创建的,而是在使用是创建的 BeanFactory bf=new XmlBeanFactory(new ClassPathResource("applicationContext.xml")); HelloWorld hw= (HelloWorld) bf.getBean("helloWorld"); System.out.println("==================================="); System.out.println(hw.getMessage()); }
而Spring配置文件以资源Resouce的形式出现在XmlBeanFactory类的构造器参数中。Resouce是一个接口,其具有两个实现类:
. ClassPathResource:指定类路径下的资源文件
. FileSystemResource:指定项目根路径或本地磁盘路径下的资源文件。
在创建了BeanFactory容器后,便可使用其重载的getBean()方法,从容器中获取指定的Bean对象。
(3)两个接口容器的区别
虽然这两个接口容器所要加载的Spring配置文件是同一个文件,但在代码中的这两个容器对象却不是同一个对象,即不是同一个容器:它们对于容器内对象的装配(创建)时机是不同的。
装配时机测试时需要注意,首先要在容器中对象StudentServiceImpl类的无参构造器中添加一个输出语句,以显示其是否执行。
A、ApplicationContext容器中对象的装配时机
ApplicationContext容器,会在容器对象初始化时,将其中的所有对象一次性全部装配好。以后代码中若要使用到这些对象,只需从内存中直接获取即可。执行效率较高。但占用内存。
B、BeanFactory容器中对象的装配时机
BeanFactory容器,对容器中对象的装配与加载采用延迟加载策略,即在第一次调用getBean()时,才真正装配该对象。