Spring_02_IOC容器

IOC容器

 Spring容器是Spring框架的核心,容器将创建对象,把他们连接在一起,配置它们,并管理它们的整个生命周期从创建到销毁.Spring容器使用依赖注入(DI)来管理组成一个应用程序的组件.这些对象被称为Spring Beans .

 通过阅读配置元数据提供的指令,容器知道对哪些象进行实例化,配置和组装.配置元数据可以通过XML,java注释或java代码来表示.

如图:是Spring如何工作的的高级视图,Spring IOC 容器利用Java的POJO类和配置元数据来生成完全配置和可执行的系统或应用程序.

img

科普: 元数据

 任何文件系统中的数据分为数据和元数据。数据是指普通文件中的实际数据,而元数据指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者以及文件数据块的分布信息(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



    
        
    

在主程序中,我们需要注意以下两点

  • 第一步,利用框架提供的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



    
        
    

步骤流程:

  • 第一步生成工厂对象,加载完成指定路径下的bean配置文件后,利用框架提供的FileSystemXmlApplicationContext 的API 去生成bean.FileSystemXmlApplicationContext负责生成和初始化所有的对象,比如:所有的XML的bean配置文件中的bean
  • 第二步,利用第一步生成的上下文中的getBean()方法得到多需要的bean.这个方法通过配置文件中的bean ID 来返回一个真正的对象,一旦得到这个对象,就可以利用这个对象来调用任何方法.

你可能感兴趣的:(Spring_02_IOC容器)