IOC容器
Spring容器是Spring框架的核心,容器将创建对象,把他们连接在一起,配置它们,并管理它们的整个生命周期从创建到销毁.Spring容器使用依赖注入(DI)来管理组成一个应用程序的组件.这些对象被称为Spring Beans .
通过阅读配置元数据提供的指令,容器知道对哪些象进行实例化,配置和组装.配置元数据可以通过XML,java注释或java代码来表示.
如图:是Spring如何工作的的高级视图,Spring IOC 容器利用Java的POJO类和配置元数据来生成完全配置和可执行的系统或应用程序.
科普: 元数据
任何文件系统中的数据分为数据和元数据。数据是指普通文件中的实际数据,而元数据指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者以及文件数据块的分布信息(inode…)等等。
容器 | 描述 |
---|---|
Spring BeanFactory 容器 | 它是最简单的容器,给DI提供了基本的支持,它用org.springframework.beans.factory.BeanFactory接口来定义.BeanFactory或者相关的接口,如BeanFactoryAware , initializingBean , DisposableBean , 在Spring 中仍存在具有大量的与Spring 整合的第三方框架的反向兼容性的目的. |
Spring ApplicationContext 容器 | 该容器添加了更多的企业特定的功能,例如从一个属性文件中解析文本信息的能力,发布应用程序事件给感兴趣的事件监听器的能力.该容器使由org.springframework.context.ApplicationContext接口定义.ApplicationContext容器包括BeanFactory容器的所有功能,所以通常建议超过BeanFactory.BeanFactory仍然可以用于轻量级的应用程序,如移动设备或基于applet的应用程序,其中它的数据量和速度是显著的. |
Spring 的 BeanFactory 容器
这是一个简单的容器,它主要功能是为依赖注入(DI)提供支持,这个容器在org.springframework.beans.factory.BeanFactory 中被定义. BeanFactory 和相关的接口 , 比如 BeanFactoryAware,DisposableBean,InitializingBean , 仍旧保留在Spring中,主要目的是向后兼容已经存在的和哪些Spring整合在一起的第三方框架.
在Spring中,有大量对BeanFactory接口实现.其中,最常被使用的是XMLBeanFactory类,这个容器从一个XML文件中读取配置元数据,由这些元数据来生成一个被配置化的系统或者应用.
在资源宝贵的移动设备或者基于applet的应用中,BeanFactory会被优先选择.否则一般使用的是ApplicationContext, 除非你有更好的理由选择BeanFactory.
案例:
步骤 | 描述 |
---|---|
1 | 创建名为SpringExample的工程并在src文件夹下创建名为com.turorialspoint文件夹 |
2 | 点击右键,选择 Add External JARs 选项,导入 Spring 的库文件,正如我们在 Spring Hello World Ex |
3 | 在 com.tutorialspoint 文件夹下创建 HelloWorld.java 和 MainApp.java 两个类文件。 |
4 | 在 c src 文件夹下创建 Bean 的配置文件 Beans.xml |
5 | 最后的步骤是创建所有 Java 文件和 Bean 的配置文件的内容,按照如下所示步骤运行应用程序。 |
代码:
HelloWorld.java
package com.tutorialspoint;
public class HelloWorld {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
MainApp.java
package com.tutorialspoint;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import com.sun.org.apache.bcel.internal.util.ClassPath;
public class MainApp {
public static void main(String[] args) {
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource(
"Beans.xml"));
HelloWorld obj = (HelloWorld) factory.getBean("helloWorld");
String message = obj.getMessage();
System.out.println(message);
}
}
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>
在主程序中,我们需要注意以下两点
- 第一步,利用框架提供的XMLBeanFactory() API 去生成bean以及利用ClassPathResource() API 去加载在路径CLASSPATH下可用的bean 配置文件.XMLBeanFactory() API 负责创建并初始化所有的对象,即在配置文件中提到的bean.
- 第二步,利用第一步生成的bean工厂对象的getBean() 方法 得到所需的Bean. 这个方法通过配置文件中的bean ID 来返回一个真正的对象,该对象最后可以用于实际的对象.一旦得到这个对象,就可以利用这个对象来调用任何方法.
Spring ApplicationContext 容器
ApplicationContext 是Spring 中较高级的容器.和BeanFactory类似, 它可以加载配置文件中定义的Bean,将所有的bean集中在一起,当请求的时候分配bean.另外,它增加了企业所需要的功能,比如,从属性文件解析文本信息和将事件传递给所指定的监听器.这个容器在org.springframework.context.ApplicationContext interface 接口中定义.
ApplicationContext 包含BeanFactory所有的功能,一般情况下,相对于BeanFactory,ApplicationContext会被推荐使用.BeanFActory仍然可以用在轻量级应用中使用,比如移动设备或者applet的应用程序.
最常被使用的ApplicationContext接口实现:
- FileSystemXmlApplicationContext:该容器从XML文件中加载已经被定义的bean.在这里,你需要提供给构造器XML文件完整的路径.
- ClassPathXmlApplicationContext:该容器从XML文件中加载已被定义的bean.在这里,你不需要提供XML文件的完整路径,只需要正确配置CLASSPATH环境变量即可,因为容器从CLASSPATH中搜索bean配置文件.
- WebXmlApplicationContext : 该容器会在一个web应用程序的范围内加载XML文件中已被定义的bean
上面的BeanFactory案例中 我们看到了ClassPathXmlApplicationContext容器. 下面来写一个关于FileSystemXmlApplicationContext的例子.
例子和上述的有些许变化
例子:
步骤 | 描述 |
---|---|
1 | 创建一个名为 SpringExample 的工程, 在 c src 下新建一个名为 com.tutorialspoint 的文件夹 |
2 | 点击右键,选择 Add External JARs 选项,导入 Spring 的库文件,正如我们在 Spring Hello World Ex |
3 | 在 com.tutorialspoint 文件夹下创建 HelloWorld.java 和 MainApp.java 两个类文件。 |
4 | 文件夹下创建 Bean 的配置文件 Beans.xml 。 |
5 | 最后的步骤是编辑所有 JAVA 文件的内容和 Bean 的配置文件,按照以前我们讲的那样去运行应用程序。 |
HelloWorld.java
package com.tutorialspoint;
public class HelloWorld {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
MainApp.java
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import com.sun.org.apache.bcel.internal.util.ClassPath;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new FileSystemXmlApplicationContext("D:\\data\\cache\\workspace\\workspace_sts2\\SpringExample3\\src\\Beans.xml");
HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
String message = obj.getMessage();
System.out.println(message);
}
}
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配置文件后,利用框架提供的FileSystemXmlApplicationContext 的API 去生成bean.FileSystemXmlApplicationContext负责生成和初始化所有的对象,比如:所有的XML的bean配置文件中的bean
- 第二步,利用第一步生成的上下文中的getBean()方法得到多需要的bean.这个方法通过配置文件中的bean ID 来返回一个真正的对象,一旦得到这个对象,就可以利用这个对象来调用任何方法.