Spring容器是Spring框架的核心。容器会创建类,将他们连接、配置在一起,并管理他们的整个生命周期从创建到销毁。Spring容器用依赖注入去管理组建并组成应用。那些对象叫做Beans,我们将在下一章讨论。
容器通过读取配置提供的元数据得到对象实例化、配置、组装的指令。配置元数据可以通过XML,Java注解或者Java代码来表示。下图是Spring工作的高层次预览。Spring IoC容器是通过使用POJO类和配置元数据产生完全可配置的并且可执行的系统或应用。
Spring提供了以下两种不同类型的容器。
序号 | 容器&描述 |
1 | Spring BeanFactory 容器 这是一个简单的容器提供用于支持DI并通过接口org.springframework.beans.factory.BeanFacoty定义。BeanFactory和相关的接口,如BeanFactoryAware、InitializingBean、DisposableBean在Spring中仍然存在为了向后兼容众多第三方框架和Spring的集成。 |
2 | Spring ApplicationContext 容器 这个容器增加了更多的企业特性功能如解析资源文件的文本消息和发布application事件到感兴趣的监听器。这个容器由接口org.springframework.context.ApplicationContext接口定义。 |
ApplicationContext容器包含BeanFactory容器的全部功能,因此它通常比BeanFactory更受推荐。BeanFactory更被应用于轻量级的应用如手机设备或数据量和速度显著的小程序的基本应用。
Spring BeanFactory容器
这是一个简单的容器提供用于支持DI并通过接口org.springframework.beans.factory.BeanFacoty定义。BeanFactory和相关的接口,如BeanFactoryAware、InitializingBean、DisposableBean在Spring中仍然存在为了向后兼容众多第三方框架和Spring的集成。BeanFactory接口有众多的实现,提供开箱即用。最常用的BeanFactory的实现类是XmlBeanFactory。这个容器从XML文件中读取配置元数据并用它创建完全可配置的系统或应用。
BeanFactory通常优先使用于资源受限的环境如移动设备或小基本应用。因此没有特别好的理由一般使用ApplicationContext。
示例--BeanFactory
让我们使用EclipseIDE工作并按如下步骤创建Spring应用。
步骤 | 描述 |
1 | 创建一个项目命名SpringExample并在项目的scr文件夹下创建一个com.tutorialspoint的包。 |
2 | 通过Add Exteraal JARs选项卡增加所需的Spring库如在Spring Hello World章中讲述的。 |
3 | 在com.tutorialspoint包下创建Java源程序 HelloWorld 和 MainApp。 |
4 | 在src目录下创建Beans.xml配置文件。 |
5 | 最后一步创建Java文件的源代码和Bean配置文件并运行应用,解释如下。 |
HelloWorld.java源代码:
package com.tutorialspoint;
public class HelloWorld {
private String message;
public void setMessage(String message){
this.message=message;
}
public void getMessage(){
System.out.println("Your Message:"+message);
}
}
MainApp.java源代码:
package com.tutorialspoint;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
@SuppressWarnings("deprecation")
public class MainApp {
public static void main(String[] args){
XmlBeanFactory factory = new XmlBeanFactory (new ClassPathResource ("Beans.xml"));
HelloWorld obj = (HelloWorld)factory.getBean("helloWorld");
obj.getMessage();
}
}
主程序中有如下两个重点需要注意一下:
1、 第一步创建工厂对象我们使用了框架的API XmlBeanFactory()来创建工厂bean并用ClassPathResource() API来加载类路径下的配置文件初始化所有配置文件中提及的类。
2、 第二步使用创建的工厂通过getBean()方法得到需要的bean。这个方法用bean ID作为参数获取一般的类然后强制转换为实际的类型。一旦你获得了这个对象,你就可以使用这个对象的任何方法。
3、 如下内容是bean配置文件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.HelloWorld">
<property name="message" value="Hello World"/>
</bean>
</beans>
一旦你创建了源代码和bean配置文件,运行这个应用。如果应用一切正常,会打印如下消息:
Your Message : Hello World!
Spring ApplicationContext 容器
ApplicationContext是Spring更高级的容器。和BeanFactory相似可以加载bean定义,装配bean在一起并根据需要分发bean。另外它增加了更具企业特性的功能如从资源文件中解析文本消息,发布应用事件给感兴趣的监听者。这个容器由org.springframework.context.ApplicationContext接口定义。ApplicationContext包含了BeanFactory的所有功能,它比BeanFactory更常被提及。BeanFactory仍然可在轻量级应用如移动设备和基本的小应用中。
最普通的ApplicationContext实现是:
* FileSystemXmlApplicationContext:这个容器从XML文件中装载bean的定义。这里你需要提供XML文件的完整路径给构造器。
* ClassPathXmlApplicationContext:这个容器从XML中装载bean的定义。这里你不需要提供完整的XML文件路径但你需要设置合适的类路径因为这个容器需要在类路径下查找XML配置文件。
* WebXmlApplicationContext:这个容器在Web应用中从XML文件中加载所有的Bean定义。
我们已经在Spring的Hell World示例中看到了ClassPathXmlApplicationContext的使用,并且我们将在单独的章节中讨论WebXmlApplicationContext在讨论到Spring的web应用时。让我们看一下FileSystemXmlApplicationContext。
示例--FileSystemXmlApplicationContext
让我们在Eclipse IDE中按如下的步骤创建Spring应用
步骤 | 描述 |
1 | 创建一个SpringExample的项目并在项目scr目录下创建com.tutorialspoint包。 |
2 | 通过Add External JARs选项卡增加需要的Spring库像在Spring Hello World章节中讲述。 |
3 | 在com.tutorialspoint包下创建Java类HelloWorld和MainApp。 |
4 | 在scr目录下创建Bean配置文件Beans.xml |
5 | 最后一步创建Java文件和Bean配置文件的内容并运行应用如下解释。 |
package com.tutorialspoint;
public class HelloWorld {
private String message;
public void setMessage(String message) {
this.message = message;
}
public void getMessage() {
System.out.println("Your Message:" + message);
}
}
如下是MainApp.java的源代码:
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class MainApp {
public static void main(String[] args){
ApplicationContext factory = new FileSystemXmlApplicationContext ("C:/Users/ZARA/workspace/HelloSpring/src/Beans.xml");
HelloWorld obj = (HelloWorld)factory.getBean("helloWorld");
obj.getMessage();
}
}
主程序中有两个重点需要注意一下:
1、 第一步使用框架提供的APIFileSystemXmlApplicationContext通过载入给定路径下的bean配置文件创建bean工厂。FileSystemXmlApplicationContext() API关心在XML bean配置文件中提及的beans的创建和初始化。
2、 第二步使用创建的context通过getBean()方法得到需要的bean。这个方法使用beanID获取通用类型的对象最终强制转换为实际类型。一旦你获得了这个对象,你可以使用这个对象的任何方法。
3、 如下是bean配置文件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.HelloWorld">
<property name="message" value="Hello World"/>
</bean>
</beans>
一旦你创建好bean的配置文件,运行应用。如果你的应用一切正常,将输出如下消息:
Your Message : Hello World!