Spring3学习笔记之(spring core之IoC容器基本原理)

2023-10-30

IoC容器的概念

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

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

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


Bean的概念

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


Hello World

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吧。

详解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。

容器实现一览:

• XmlBeanFactory:BeanFactory实现,提供基本的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);

 

• ClassPathXmlApplicationContext:ApplicationContext实现,从classpath获取配置文件;

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

• FileSystemXmlApplicationContext:ApplicationContext实现,从文件系统获取配置文件。

         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容器

小结

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

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

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

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

 

转自【http://sishuok.com/forum/blogPost/list/2428.html



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring3学习笔记之(spring core之IoC容器基本原理) 的相关文章

  • 深度学习检测小目标常用方法

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 作者丨船长 知乎 来源丨https zhuanlan zhihu com p 83220498 引言 在深度学习目标检测中 特别是人脸检测中 小目标 小人脸的检测由于分辨
  • 哲理故事300篇 中

    哲理故事300篇 上 http blog csdn net andylin02 archive 2006 08 23 1109314 aspx 哲理故事300篇 下 http blog csdn net andylin02 archive
  • 汽配企业想上MES管理系统,需要具备哪些条件

    随着全球汽车行业的快速发展 汽配行业也面临着日益激烈的竞争和不断变化的市场环境 为了应对这种挑战 许多汽配企业开始考虑引入制造执行系统 MES 来提高生产效率和管理水平 然而 在实施MES管理系统解决方案之前 汽配企业需要具备一定的条件 以
  • 整理 mac 安装php扩展mcrypt

    这个问题是遇到多次了 不想再被坑了 首先使mcrypt软件能够运行 然后安装php扩展模块 并在php ini配置 这里注意的是mcrypt软件依赖libmcrypt和mhash两个库 所以安装配置顺序从右至左 下载安装mcrypt 1 先
  • Java Solr HTTPClient一般请求流程代码编写

    import com alibaba fastjson JSONObject import com digipower common page PageData 查询的策略模式 author zzg public interface Sea
  • 整理 firefox 和IE系列的相关差别,已备后用!

    一 IE与FireFox的js和css png透明 AlphaImageLoaderfilter progid DXImageTransform Microsoft AlphaImageLoader enabled bEnabled siz
  • STC32G资料及入门介绍

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 STC32G资料及入门介绍 前言 一 资料准备 二 工程介绍 1 文件架构 总结 前言 提示 这里可以添加本文要记录的大概内容 STC32G是STC新推出的32位单片机 也就
  • 2、OpenCV加载、显示、保存图像

    OpenCV加载 显示 保存图像 一 OpenCV加载图像 二 判断图像是否加载成功 三 窗体显示图片 四 保存图像 五 完整代码示例 六 其它关于图像保存的代码例子 七 致谢 一 OpenCV加载图像 1 所用函数原型 Mat cv im
  • CAN光纤转换器 CAN光端机在久远消防主机JB-TB-JF999-H上的应用

    火灾报警主机联网问题一直是各消防项目中的难点 特别是管廊等长距离通讯中 如何保证通讯信号长期稳定可靠的运行是需要工程重点解决的问题 而LCAN FOBR系列环网冗余式CAN光纤转换器提供二路光通道和一路CAN通道 实现CAN与光纤之间的双向
  • “文明上网”

    接下来 让我们通过一些司法案例来学习如何做到 文明上网 安全上网 吧 案例一 不听劝告沉溺网络 步步深陷堕入深渊 十四岁的韩某从小就迷恋网络 家人越是劝告越是不听 到后来甚至发展到通宵到网吧打游戏 2018年3月 因无钱上网玩游戏 韩某先后

随机推荐

  • ajax设置滚轮效果,用 jQuery 实现页面滚动(Scroll)效果的完美方法

    以前很多博主都写过 转载过用 jQuery 实现页面滚动 Scroll 效果的方法 但目前搜来的方法大都在 Opera 下有个小 Bug 直接用跳的而且画面闪烁 今天 超级低调的高手 Willin 共享了一种完美方法解决 jQuery 实现
  • 经典进程同步问题(三)——读者写者问题

    目录 一 问题描述 二 解题思路 2 1 读者优先算法 2 2 写者优先算法 2 3 读写公平 三 源码实现 3 1 读者优先 3 2 写者优先 3 3 读写平等 一 问题描述 一个数据问价或记录可以被多个进程共享 我们把只读该文件的进程称
  • 集成学习算法:Bagging和随机森林

    学习目标 知道Bagging集成原理 知道随机森林构造过程 知道RandomForestClassifier的使用 了解baggind集成的优点 1 Bagging集成原理 目标 把下面的圈和方块进行分类 实现过程 1 采样不同数据集 2
  • Wireshark抓包——ICMP协议分析

    内容 使用Wireshark抓包 分析较简单的数据包 环境 Windows 7 Wireshark ping是用来测试网络连通性的命令 一旦发出ping命令 主机会发出连续的测试数据包到网络中 在通常的情况下 主机会收到回应数据包 ping
  • 【Linux-GNU编译器套件(gcc/g++/gfortran)离线编译安装】

    文章目录 Linux centos7 9系统GNU编译器套件 gcc g gfortran 离线编译安装 一 GNU编译器套件定义 二 GNU GCC编译环境说明 三 GNU GCC编译安装 3 1 依赖软件包安装 3 2 gcc 7 5版
  • Hexo博文发布管理工具分享出来啦

    从此刻起 小白也能搭建自己的博客 说些什么呢 之前为朋友写的一个Hexo博客发布与管理工具 只需要点点鼠标即可实现对Hexo博文的管理 从此告别各种难记的cmd命令 赠人玫瑰 手有余香 实现功能 创建博文 修改名称 删除文章 复制 粘贴 剪
  • react函数组件

    一 函数组件 1 函数组件的创建 函数组件 使用JS的函数 或箭头函数 创建的组件称为函数组件 函数组件有如下约定 函数名称必须以大写字母开头 函数组件必须有返回值 返回JSX表达式 渲染函数组件 用函数名作为组件标签名 组件名称可以是单标
  • BGA封装扇出过孔-BGA芯片的布局布线技巧

    bga封装扇出过孔 图文并茂讲解BGA芯片的布局布线技巧 谁不言的博客 CSDN博客 因此处理BGA芯片的布局和走线已经成为工程师的必修功课 本篇文章将向大家介绍BGA芯片的布局布线技巧 BGA芯片布局的基本顺序 1 对BGA芯片进行摆放
  • 用python写一个爬虫程序,爬取百度的源码

    我可以为您提供一个简单的Python爬虫程序的示例 它可以帮助您爬取百度的源码 导入所需要的模块 import requests from bs4 import BeautifulSoup 获取百度源码 url https www baid
  • vue封装树形组件

    效果 1 组件
  • Apache Druid命令执行漏洞(CVE-2021-25646)复现

    0x00 漏洞概述 Apache Druid 是用Java编写的面向列的开源分布式数据存储 旨在快速获取大量事件数据 并在数据之上提供低延迟查询 Apache Druid 包括执行用户提供的JavaScript的功能嵌入在各种类型请求中的代
  • 硬链接和软连接的区别

    硬链接和软连接的主要区别在于 硬链接和源文件具有相同的inode节点号和block 硬链接和源文件是同一份文件 软连接和源文件的inode节点号不同 进而指向的block也不同 软连接block中存放了源文件的路径名 硬链接 源文件和硬链接
  • Postman 批量导出接口:如何快速备份你的 API

    在使用 Postman 接口测试工具时 我们可能会需要将多个接口进行导出 以备后续使用或与他人共享 下面将介绍如何使用 Postman 批量导出接口 步骤一 进入集合 首先 我们需要进入 Postman 中的集合 该集合中包含了我们需要导出
  • 数据库的部分依赖,完全依赖,传递依赖以及三种范式

    第一范式1NF 列不可再分 关系模式R都是不可分 第二范式2NF 满足完全依赖 可唯一标识一行 如主键id 消除部分依赖 如果依赖于主属性的非空真子集 那么就不满足完全依赖 要拆分成一对多的关系 第三范式3NF 不存在传递依赖 不依赖于非主
  • JSR303校验之list校验问题

    现有需求如下 新增合同时要保存补贴和费用项信息 由于都是多条 所以用list传参 但不是必传项 不传的时候不校验list中的对象 传的时候就要校验list中对象每个字段都不能为空 也就是要通过JSR303实现 当请求对象中传list 需要校
  • Springboot 多数据源配置

    Springboot 多数据源配置 前几天工作中遇到个项目说出来比较恶心 对接老系统要求一个项目连接多个数据库 Oracle Mysql SqlServer 这个时候看了一些方式写了一套多数据源常用的方式 将代码分享出来 后续会将代码整体迁
  • CSS —— 盒模型

    概念 CSS 盒模型本质上是一个盒子 盒子包裹着HTML 元素 盒子由四个属性组成 从内到外分别是 content 内容 padding 内填充 border 边框 外边距 margin 盒模型的分类 W3C 盒子模型 标准盒模型 IE盒子
  • Unity之性能分析特别篇

    Unity的性能优化大家一定很熟悉了 我在Unity4 5的时期 做过多款大型在线射击对战类网游 超大地形加载优化 对性能分析优化工作和在使用Profiler的过程中总结了一些经验 今天才有空分享出来 欢迎大家讨论 和提出不同的见解 给Un
  • 无法访问javax.servlet.ServletException

    使用Idea CE 创建了一个基于 Maven 构建的 Spring Boot 项目 在打包的时候提示 无法访问javax servlet ServletException 完整错误信息 ERROR Failed to execute go
  • Spring3学习笔记之(spring core之IoC容器基本原理)

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