[译]6-Spring IOC容器

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.运行程序,得出预期结果,如下

时间: 2024-10-01 00:31:28

[译]6-Spring IOC容器的相关文章

spring ioc 容器概念

spring ioc 容器 一个java应用程序是有很多类组成的,这些类相互协作.相互作用来提供应用程序的表现行为.那些被其它类组合提供某些行为的类,称之为其它类的依赖(dependencies).利用软件工程中的组合模式(经常是继承模式的反模式)来说,我们经常利用某些类组合成其它类,不管这些类是通过构造函数还是setter方法或其它方法,那么组合成其它类的那些类就是这个组合类的依赖.当组合类要表现出的行为依赖这些类的时候,这些类必须被创建并注入给组合类. 在spring应用中,spring i

Spring IoC容器的初始化过程

Spring IoC容器的初始化包括 BeanDefinition的Resource定位.载入和注册 这三个基本的过程.IoC容器的初始化过程不包含Bean依赖注入的实现.Bean依赖的注入一般会发生在第一次通过getBean向容器索取Bean的时候. 先看以下代码: ApplicationContext context = new ClassPathXmlApplicationContext("ioc.xml"); Car car = (Car) context.getBean(&q

Mybaits3源码分析(二):扫描Mapper关联到spring IOC容器

首先讲讲mapper是怎么从配置到对象的. <!-- 采用自动扫描方式创建mapper bean(单个更新模式) --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.xxx.dao" /> <property name="sqlSe

Spring—IOC容器如何实例话Bean

前言  传统应用程序可以通过new和反射的方式来实例化Bean.而Spring Ioc容器则需要根据配置元数据使用反射机制来创建Bean.在Spring Ioc容器中根据Bean创建Bean实例有以下几种方式. (1).使用构造器实例化Bean (2).使用静态工厂实例化Bean (3).使用实例工厂实例化Bean 一.使用构造器实例化Bean:Spring IoC容器能使用默认空构造器也能使用有参数构造器两种方式创建Bean. (a).使用空构造器进行定义,使用此种方式,class属性指定的类

MyEclipse Spring 学习总结一 Spring IOC容器

一.Spring IOC容器---- Spring AllicationContext容器 程序的结构如下: 1.首先在MyEclipse 创建创建Java Project 2.创建好后,添加sping支持.在project上右击, MyEclipse->Add spring Capabilities. 3.之后会自动生成applicationContent.xml文件 1)创建HelloWorld.java public class HelloWorld { private String me

介绍 Spring IoC 容器和 bean

简介 本章涵盖了 Spring Framework实现控制翻转 (IoC) 的原则. IoC 有时也被称为依赖注入 (DI).这是一个对象定义他们依赖的过程,其中对象之间的相关性,也就是说,它们一起工作,只能通过构造函数参数,参数工厂方法或设置在其构造后的对象实例或者是从一个工厂方法返回的对象实例的属性上.容器在创建的 bean 注入这些依赖.这个过程是根本的反转,因此称为控制反转(IoC),bean 本身通过直接构造类,或作为 Service Locator(服务定位器)模式的机制,来控制其依

[Spring实战系列](6)配置Spring IOC容器的Bean

1. 简介 Spring提供了一个强大的IOC容器来管理组成应用的bean.为了利用容器服务,必须配置运行于Spring IOC容器中的Bean. 2. 解决方案 你可以通过XML文件,属性文件,注释甚至API来设置Spring IOC容器中的Bean. Spring允许你在一个或者多个bean配置文件中配置bean.对于简单的应用程序,可以在单个配置文件中集中配置bean.但是对于有许多bean的大型应用,你应该根据其功能将其分割到多个配置文件中. 3. 创建Spring配置 正如前面所讲的,

Spring IoC容器管理Action

Spring IoC容器管理Action有两种方式:DelegatingRequestProcessor.DelegatingActionProxy 不管采用哪一种方式,都需要随应用启动时创建ApplicationContext实例,由Struts负责在应用启动时创建ApplicationContext实例.Struts中提供了PlugIn的扩展点,可在应用启动和关闭时,创建或销毁某些资源. 使用ContextLoaderPluIn创建了ApplicationContext实例后,关键是如何将A

自己实现Spring IoC容器(四)IoC容器的Bug

Bug的发现 之前我自己写了一个类似Spring中的IoC容器自己实现Spring IoC容器(三)完成IoC容器,然后最近想在这个项目基础上把Spring的AOP也实现一下,然后就悲剧的发现了一句错误代码-- 这个错误代码就在edu.jyu.core.ClassPathXmlApplicationContext类的Object createBeanByConfig(Bean bean)方法中,下面是这个方法 /** * 根据bean的配置信息创建bean对象 * * @param bean *

Spring IOC 容器源码分析 - 创建单例 bean 的过程

1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去创建,而是从缓存中获取.如果某个 bean 还未实例化,这个时候就无法命中缓存.此时,就要根据 bean 的配置信息去创建这个 bean 了.相较于getBean(String)方法的实现逻辑,创建 bean 的方法createBean(String, RootBeanDefinition, Obj