2.2.1  IoC容器的概念

IoC容器就是具有依赖注入功能的容器,IoC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需直接在代码中new相关的对象,应用程序由IoC容器进行组装。在Spring中BeanFactory是IoC容器的实际代表者。

Spring IoC容器如何知道哪些是它管理的对象呢?这就需要配置文件,Spring IoC容器通过读取配置文件中的配置元数据,通过元数据对应用中的各个对象进行实例化及装配。一般使用基于xml配置文件进行配置元数据,而且Spring与配置文件完全解耦的,可以使用其他任何可能的方式进行配置元数据,比如注解、基于java文件的、基于属性文件的配置都可以。

那Spring IoC容器管理的对象叫什么呢?

2.2.2  Bean的概念

由IoC容器管理的那些组成你应用程序的对象我们就叫它Bean, Bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。那IoC怎样确定如何实例化Bean、管理Bean之间的依赖关系以及管理Bean呢?这就需要配置元数据,在Spring中由BeanDefinition代表,后边会详细介绍,配置元数据指定如何实例化Bean、如何组装Bean等。概念知道的差不多了,让我们来做个简单的例子。

2.2.3  Hello World

一、配置环境:

l       JDK安装:安装最新的JDK,至少需要Java 1.5及以上环境;

l       开发工具:SpringSource Tool Suite,简称STS,是个基于Eclipse的开发环境,用以构建Spring应用,其最新版开始支持Spring 3.0及OSGi开发工具,但由于其太庞大,很多功能不是我们所必需的所以我们选择Eclipse+ SpringSource Tool插件进行Spring应用开发;到eclipse官网下载最新的Eclipse,注意我们使用的是Eclipse IDE for Java EE Developers(eclipse-jee-helios-SR1);

安装插件:启动Eclipse,选择Help->Install New Software,如图2-3所示

图2-3 安装

2、首先安装SpringSource Tool Suite插件依赖,如图2-4:

Name为:SpringSource Tool Suite Dependencies

Location为:http://dist.springsource.com/release/TOOLS/composite/e3.6

图2-4 安装

3、安装SpringSource Tool Suite插件,只需安装如图2-5所选中的就可以:

Name为:SpringSource Tool Suite

Location为:http://dist.springsource.com/release/TOOLS/update/e3.6

图2-4 安装

4、安装完毕,开始项目搭建吧。

Spring 依赖:本书使用spring-framework-3.0.5.RELEASE

spring-framework-3.0.5.RELEASE-with-docs.zip表示此压缩包带有文档的;

spring-framework-3.0.5.RELEASE-dependencies.zip表示此压缩包中是spring的依赖jar包,所以需要什么依赖从这里找就好了;

下载地址:http://www.springsource.org/download

二、开始Spring Hello World之旅

1、准备需要的jar包

核心jar包:从下载的spring-framework-3.0.5.RELEASE-with-docs.zip中dist目录查找如下jar包

 
 

org.springframework.asm-3.0.5.RELEASE.jar

org.springframework.core-3.0.5.RELEASE.jar

org.springframework.beans-3.0.5.RELEASE.jar

org.springframework.context-3.0.5.RELEASE.jar

org.springframework.expression-3.0.5.RELEASE.jar

依赖的jar包:从下载的spring-framework-3.0.5.RELEASE-dependencies.zip中查找如下依赖jar包

 
 

com.springsource.org.apache.log4j-1.2.15.jar

com.springsource.org.apache.commons.logging-1.1.1.jar

com.springsource.org.apache.commons.collections-3.2.1.jar

2、创建标准Java工程:

(1)选择“window”—> “Show View” —>“Package Explorer”,使用包结构视图;

图2-5 包结构视图

(2)创建标准Java项目,选择“File”—>“New”—>“Other”;然后在弹出来的对话框中选择“Java Project”创建标准Java项目;

图2-6 创建Java项目

图2-7 创建Java项目

图2-8 创建Java项目

(3)配置项目依赖库文件,右击项目选择“Properties”;然后在弹出的对话框中点击“Add JARS”在弹出的对话框中选择“lib”目录下的jar包;然后再点击“Add Library”,然后在弹出的对话框中选择“Junit”,选择“Junit4”;

图2-9 配置项目依赖库文件

图2-10 配置项目依赖库文件

图2-11 配置项目依赖库文件

(4)项目目录结构如下图所示,其中“src”用于存放java文件;“lib”用于存放jar文件;“resources”用于存放配置文件;

图2-12 项目目录结构

3、项目搭建好了,让我们来开发接口,此处我们只需实现打印“Hello World!”,所以我们定义一个“sayHello”接口,代码如下:

package cn.javass.spring.chapter2.helloworld;
public interface HelloApi {  public void sayHello();
} 

4、接口开发好了,让我们来通过实现接口来完成打印“Hello World!”功能;

package cn.javass.spring.chapter2.helloworld;
public class HelloImpl implements HelloApi {  @Override  public void sayHello() {  System.out.println("Hello World!");  }
}  

5、接口和实现都开发好了,那如何使用Spring IoC容器来管理它们呢?这就需要配置文件,让IoC容器知道要管理哪些对象。让我们来看下配置文件chapter2/helloworld.xml(放到resources目录下):

<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context                http://www.springframework.org/schema/context/spring-context-3.0.xsd">  <!-- id 表示你这个组件的名字,class表示组件类 -->
<bean id="hello" class="cn.javass.spring.chapter2.helloworld.HelloImpl"></bean>
</beans>  

6、现在万一具备,那如何获取IoC容器并完成我们需要的功能呢?首先应该实例化一个IoC容器,然后从容器中获取需要的对象,然后调用接口完成我们需要的功能,代码示例如下:

package cn.javass.spring.chapter2.helloworld;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloTest {  @Test  public void testHelloWorld() {  //1、读取配置文件实例化一个IoC容器  ApplicationContext context = new ClassPathXmlApplicationContext("helloworld.xml");  //2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”  HelloApi helloApi = context.getBean("hello", HelloApi.class);  //3、执行业务逻辑
              helloApi.sayHello();  }
}  

7、自此一个完整的Spring Hello World已完成,是不是很简单,让我们深入理解下容器和Bean吧。

2.2.4  详解IoC容器

在Spring Ioc容器的代表就是org.springframework.beans包中的BeanFactory接口,BeanFactory接口提供了IoC容器最基本功能;而org.springframework.context包下的ApplicationContext接口扩展了BeanFactory,还提供了与Spring AOP集成、国际化处理、事件传播及提供不同层次的context实现 (如针对web应用的WebApplicationContext)。简单说, BeanFactory提供了IoC容器最基本功能,而 ApplicationContext 则增加了更多支持企业级功能支持。ApplicationContext完全继承BeanFactory,因而BeanFactory所具有的语义也适用于ApplicationContext。

容器实现一览:

• XmlBeanFactoryBeanFactory实现,提供基本的IoC容器功能,可以从classpath或文件系统等获取资源;

(1)  File file = new File("fileSystemConfig.xml");

Resource resource = new FileSystemResource(file);

BeanFactory beanFactory = new XmlBeanFactory(resource);

(2)

Resource resource = new ClassPathResource("classpath.xml");

BeanFactory beanFactory = new XmlBeanFactory(resource);

• ClassPathXmlApplicationContextApplicationContext实现,从classpath获取配置文件;

BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath.xml");

• FileSystemXmlApplicationContextApplicationContext实现,从文件系统获取配置文件。

BeanFactory beanFactory = new FileSystemXmlApplicationContext("fileSystemConfig.xml");

具体代码请参考cn.javass.spring.chapter2.InstantiatingContainerTest.java。

ApplicationContext接口获取Bean方法简介:

• Object getBean(String name) 根据名称返回一个Bean,客户端需要自己进行类型转换;

• T getBean(String name, Class<T> requiredType) 根据名称和指定的类型返回一个Bean,客户端无需自己进行类型转换,如果类型转换失败,容器抛出异常;

• T getBean(Class<T> requiredType) 根据指定的类型返回一个Bean,客户端无需自己进行类型转换,如果没有或有多于一个Bean存在容器将抛出异常;

• Map<String, T> getBeansOfType(Class<T> type) 根据指定的类型返回一个键值为名字和值为Bean对象的 Map,如果没有Bean对象存在则返回空的Map。

让我们来看下IoC容器到底是如何工作。在此我们以xml配置方式来分析一下:

一、准备配置文件:就像前边Hello World配置文件一样,在配置文件中声明Bean定义也就是为Bean配置元数据。

二、由IoC容器进行解析元数据: IoC容器的Bean Reader读取并解析配置文件,根据定义生成BeanDefinition配置元数据对象,IoC容器根据BeanDefinition进行实例化、配置及组装Bean。

三、实例化IoC容器:由客户端实例化容器,获取需要的Bean。

整个过程是不是很简单,执行过程如图2-5,其实IoC容器很容易使用,主要是如何进行Bean定义。下一章我们详细介绍定义Bean。

图2-5 Spring Ioc容器

2.2.5  小结

除了测试程序的代码外,也就是程序入口,所有代码都没有出现Spring任何组件,而且所有我们写的代码没有实现框架拥有的接口,因而能非常容易的替换掉Spring,是不是非入侵。

客户端代码完全面向接口编程,无需知道实现类,可以通过修改配置文件来更换接口实现,客户端代码不需要任何修改。是不是低耦合。

如果在开发初期没有真正的实现,我们可以模拟一个实现来测试,不耦合代码,是不是很方便测试。

Bean之间几乎没有依赖关系,是不是很容易重用。

IoC 之 2.2 IoC 容器基本原理(贰)相关推荐

  1. 深入理解DIP、IoC、DI以及IoC容器

    对于大部分小菜来说,当听到大牛们高谈DIP.IoC.DI以及IoC容器等名词时,有没有瞬间石化的感觉?其实,这些"高大上"的名词,理解起来也并不是那么的难,关键在于入门.只要我们入 ...

  2. 抛开 Spring 去理解 IOC 思想:原来 IOC 容器这么简单

    很多小伙伴们看到标题可能就会想到抛开 Spring 就不会存在 IOC 思想了,其实不然在接下来的文章中就会讲述到. 很多小伙伴在理解 IOC 的时候通常会和 Spring 放到一起去学习,首先呢 S ...

  3. Spring IOC源代码具体解释之容器初始化

    Spring IOC源代码具体解释之容器初始化 上篇介绍了Spring IOC的大致体系类图,先来看一段简短的代码,使用IOC比較典型的代码 ClassPathResource res = new C ...

  4. .net5 IOC原理+手动创建IOC容器

    .net5 IOC原理+手动创建IOC容器 IOC容器 说白了就是创建对象的(看成创建对象的一个工厂) 而在**.net5以及.net core** 项目中自带容器(IserviceCollectio ...

  5. 【第二章】 IoC 之 2.1 IoC基础 ——跟我学Spring3

    2.1.1  IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器 ...

  6. 什么是IOC,IOC的优缺点及IOC的应用

    更多免费教学文章请关注这里 IOC,即控制反转(Inversion of Control,英文缩写为IoC),是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核 ...

  7. 【Spring】IOC理论推导、IOC本质

    1. IOC理论推导 1. UserDao接口 2. UserDaoImpl实现类 3. Userservice业务接口 4. UserserviceImpl业务实现类 在之前的业务中,用户的需求可能 ...

  8. Ioc的来由与Ioc基本概念及Ioc使用实现

    Ioc的来由与Ioc基本概念 传统的对象创建 Ioc的对象创建本质 Ioc的概念 通过Ioc生产和获取对象 传统的对象创建 public class UserServiceImpl implement ...

  9. Spring基于IOC容器基本原理

    [b]一.简介[/b] org.springframework.beans及org.springframework.context包 是Spring IoC容器 的基础.BeanFacotry提供的高 ...

  10. Spring IOC学习心得之IOC容器的初始化过程

    注:本文大多数内容都是摘自<Spring技术内幕>这本书 简单来说,Ioc容器的初始化过程是在refresh()方法中启动的,包括BeanDefinition的Resource定位,载入和 ...

最新文章

  1. 面试准备3——相关知识
  2. VTK修炼之道2_VTK体系结构1
  3. JustOj 1486: Hello, world!
  4. mysql session 数_查询数据库当前连接数(session),进程数等操作
  5. 最新变体Transformer!∞-former!DeepMind 出品!
  6. python图像数据是几维数据_python实现读取类别频数数据画水平条形图案例
  7. 软件测试面试题小结(一)
  8. 第九届全国大学生数学竞赛(江西赛区)数学类获奖学生名单
  9. 相对URL拼接为绝对URL的过程
  10. COMSOL案例内容,有需要的了解下!
  11. PRCV2021 第四届中国模式识别与计算机视觉大会开放注册
  12. 计算机键盘卡扣原理,笔记本键盘怎么拆?笔记本键盘卡扣、排线如何打开?
  13. 论文--Learning to Predict Bus Arrival Time From Heterogeneous Measurements via Recurrent Neural Networ
  14. OPPO年薪百万offer经历分享
  15. android 股票行情走势图K线控件 KLineView
  16. 【esp32-s3】6.2 文件系统——文件夹列表
  17. 分布式服务治理及优化经验
  18. 斗兽棋项目开发计划书
  19. 高斯投影坐标计算例题_高斯投影坐标计算程序下载
  20. 计算机网络第一章概论

热门文章

  1. 90 矩阵——矩阵微分与求导
  2. 5.10 Memory Networks 记忆网络的应用与方法
  3. html幻灯片效果需要js吗,js 幻灯片的实现
  4. Matlab中(),[],与{}的用法认识
  5. linux 装gcc组件,linux下安装redis组件报错-gcc报错
  6. 7-8 评委打分 (5 分)
  7. spring aop源码分析总结
  8. mxonline实战14,全局搜索,修改个人中心页面个人资料信息
  9. 安装redis3.0.5
  10. 关于如何安装cocoapods