Spring容器是Spring框架的核心。Spring容器负责对象的创建、装配、以及生命周期的管理。Spring容器使用
依赖注入来管理组成应用程序的组件。Spring容器管理的这些对象我们称之为Bean.
Spring容器通过读取配置元数据得知需要对哪些对象进行初始化、配置、装配等。配置元数据可以是xml配置文
件、java注解、java代码。下面这张图从较高的层面展示了Spring容器的工作原理,Spring容器使用POJO和配
置元数据来产生经过充分配置的、可运行的系统或应用程序.
Spring框架提供了两种Spring IOC容器.
- Spring BeanFactory Container
最简单的IOC容器,提供了最基本的依赖注入的功能.由org.springframework.beans.factory.BeanFactory
接口进行定义.现在用的比较少,但是为了向后兼容性,Spring中还是保留了BeanFactory、BeanFactoryAware
、InitializingBean、DisposableBean。 - Spring ApplicationContext Container
由org.springframework.context.ApplicationContext interface接口进行定义。除了具备BeanFactory的
功能外,还增加了许多额外的功能,如,从属性文件中解析文本信息、支持事件订阅。
下面将分别介绍这两个IOC容器
BeanFactory容器
Spring提供了多个BeanFactory接口的实现类,最常用的一个是XmlBeanFactory,XmlBeanFactory从xml配置
文件中读取bean的信息并进行相应的处理。
一般情况下推荐使用ApplicationContext容器,而不使用BeanFactory容器,除非你在手机或平板这类资源量比较紧
缺的设备上使用Spring时,才考虑使用BeanFactory容器。
下面看一个例子程序:
1.创建包com.tutorialspoint.ioc_container,并在包中创建HelloWorld.java类,类的内容如下:
package com.tutorialspoint.ioc_container; public class HelloWorld { private String message; public void setMessage(String message) { this.message = message; } public void getMessage() { System.out.println("Your Message : " + message); } }
2.在包com.tutorialspoint.ioc_container中创建MainApp.java类,类的内容如下:
package com.tutorialspoint.ioc_container; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; @SuppressWarnings("all") public class MainApp { public static void main(String[] args) { BeanFactory factory = new XmlBeanFactory(new ClassPathResource("ioc_container.xml")); HelloWorld obj = (HelloWorld)factory.getBean("helloWorld"); obj.getMessage(); } }
3.在src目录下创建bean的配置元数据(xml配置文件), ioc_container.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-3.0.xsd"> <bean id="helloWorld" class="com.tutorialspoint.ioc_container.HelloWorld"> <property name="message" value="Hello World!"/> </bean> </beans>
4.运行程序,得到预期结果
ApplicationContext容器
ApplicationContext容器是Spring中更为先进的容器。ApplicationContext容器具有BeanFactory容器的所有功能。
一般情况下推荐使用ApplicationContext容器。除非在一些手机或平板上才推荐使用BeanFactory(主要考虑到这类
设备资源比较紧缺)
在Spring中有很多类实现了ApplicatonContext接口,主要使用的有如下几个:
- FileSystemXmlApplicationContext
从本地文件系统中加载bean的配置文件,需要指定配置文件所在的本地文件系统全路径 - ClassPathXmlApplicationContext
从类路径加载bean的配置文件,只需指定xml文件相对Classpath的相对路径即可 - WebXmlApplicationContext
在web应用中使用的spring容器,从web.xml得到bean的配置文件的位置,进而加载bean的配置文件
前面我们已经看到过ClassPathXmlApplicationContext的用法,后续我们会专门讲解WebXmlApplicationContext
所以这里我们以FileSystemXmlApplicationContext为例来讲解ApplicationContext容器的使用,如下:
1.创建包com.tutorialspoint.ioc_container.app_context,并在包中创建HelloWorld.java,内容如下:
package com.tutorialspoint.ioc_container.app_context; public class HelloWorld { private String message; public void setMessage(String message){ this.message = message; } public void getMessage(){ System.out.println("Your Message : " + message); } }
2.在包com.tutorialspoint.ioc_container.app_context中创建MainApp.java,内容如下:
package com.tutorialspoint.ioc_container.app_context; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class MainApp { public static void main(String[] args) { //这里指定bean的配置文件位于E盘下的Beans.xml文件 ApplicationContext context = new FileSystemXmlApplicationContext("E:/Beans.xml"); HelloWorld obj = (HelloWorld) context.getBean("helloWorld"); obj.getMessage(); } }
3.在E盘根目录下创建Beans.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-3.0.xsd"> <bean id="helloWorld" class="com.tutorialspoint.ioc_container.app_context.HelloWorld"> <property name="message" value="Hello World!"/> </bean> </beans>
4.运行程序,得出预期结果,如下