1.IOC容器简介

(1) org.springframework.beans 与 org.springframework.context 这两个包是Spring IOC容器的基础,在org.springframework.beans中的BeanFactory接口提供了一种能够管理任何类型对象的机制(类似于一个工厂,里面放满了需要被管理的对象),而在org.springframework.context中的BeanFactory的子接口ApplicationContext则在其基础之上提供了更多特性(如AOP,Message resource,Event publication等)。总而言之,BeanFactory提供了一个容器的基本功能,而ApplicationContext可以看做是BeanFactory的扩展,它提供了更多企业级特性

(2) 一个普通的java对象,在交由Spring IOC容器实例化,配置,组装并管理之后,我们称其为bean。IOC容器需要通过XML,Java code等方式来获取有关对象的配置信息(也称为配置元数据),来完成bean的实例化动作。如下所示,我们通过XML的方式定义了一个bean的配置元数据,规定了其id,name和class的值,之后IOC会根据这些信息来构造一个bean并保存

<?xml version="1.0" encoding="UTF-8"?>
<beans ....> <bean id="..." name="..." class="..."></bean> </beans>

2.配置元数据

(1) 由上文可知,元数据的概念就是告诉Spring如何实例化、配置和组装的我们应用程序中的对象,如下图

(2) 配置方式:基于xml的配置可用bean标签,基于java的配置用@Configuration和@Bean注解等

下面是一个基于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
https://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 在xml中,所有的bean都必须放在beans这一顶级标签中,里面的这些bean标签对应于我们的系统中的实际对象 -->
<!-- bean标签中的id属性用来标识一个bean,其值不可重复,class用来指定这个bean的类类型(使用全限定类名) -->
<bean id="..." class="...">
<!-- 在bean标签内部来指定该bean的成员变量等 -->
</bean> </beans>

3.实例化容器

(1) ApplicationContext接口就代表了IOC容器,如果想要构建它,则可根据实际需要来使用其某个具体的实现类,如ClassPathXmlApplicationContext或FileSystemXmlApplicationContext,它们的构造函数接收一个或多个资源路径,表示从各种外部资源(如XML)中加载配置元数据,如下

ApplicationContext ctx = new ClassPathXmlApplicationContext("boke/definition.xml");

其中boke/definition.xml配置文件中的内容如下所示

<beans ...>

    <bean id="bId" class="cn.example.spring.boke.ExampleB"></bean>

    <bean id="aId" name="aName" class="cn.example.spring.boke.ExampleA">
<!-- property标签用于bean中成员变量值的注入,name属性:指定JavaBean中的属性名,该属性要有其对应的setter方法,否则无法注入,ref属性:引用另一个bean的id,注入依赖 -->
<property name="exampleB" ref="bId"></property>
</bean> </beans>

此外,如果是基于Java code的配置,还可以使用AnnotationConfigApplicationContext,其构造函数参数接受配置类或需要扫描的包路径,来加载配置元数据,如下所示

ApplicationContext ctx = new AnnotationConfigApplicationContext("cn.example.spring");

4.导入另一份xml中的配置元数据

(1) 通常来说,一个系统会被分为多个模块,某个模块都对应有一份单独的xml文件,因此,当我们需要向一个xml文件中导入另一个xml中的配置元数据时,可以使用import标签,如下所示

<beans ...>

    <!-- import标签:导入其它的配置文件;该标签定义于beans标签内部,与bean标签平行 -->
<import resource="from.xml"></import>
<import resource="down/son.xml"></import> </beans>

注意:采用的是相对于当前文件(在上面这个例子中为:definition.xml)的路径来导入其他的文件,上面这个例子中,文件结构为

--boke

 |-definition.xml

 |-from.xml

----down

    |-son.xml

definition.xml和from.xml处于同一级目录boke下,而son.xml位于down目录下,该目录是boke目录的子目录。Spring不建议使用相对路径(如:classpath:../beans.xml),但可以使用绝对路径(如:file:C:/spring/boke/from.xml或classpath:/boke/from.xml)来导入其他的xml配置文件

5.使用容器

(1) 容器用来管理bean,使用容器一般情况就是获取它所保存的bean。在ApplicationContext中,提供了getBean()方法(不推荐使用,会对Spring的API产生强依赖)来获取容器中的bean,如下示例所示

//1.创建容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("boke/definition.xml"); //2.从容器中获取需要bean
ExampleA a = ctx.getBean(ExampleA.class); //3.使用这个bean
a.doSomething();

此外,还可将GenericApplicationContext与XmlBeanDefinitionReader结合使用,来解析xml中的bean配置元数据并生成对应的bean

//1.创建容器
GenericApplicationContext context = new GenericApplicationContext(); //2.将xml文件的解析工作委托给了xml阅读器XmlBeanDefinitionReader,它会解析xml配置文件,并将解析的bean配置元数据交给GenericApplicationContext
new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml", "daos.xml"); //3.刷新容器,此时容器就会创建出对应的bean
context.refresh(); //4.获取bean
ExampleA a = context.getBean(ExampleA.class); //5.使用这个bean
a.doSomething();

可见ClassPathXmlApplicationContext中已经包含了xml文件的解析工作

Spring IOC官方文档学习笔记(一)之IOC容器概述的更多相关文章

  1. Spring 4 官方文档学习(十一)Web MVC 框架

    介绍Spring Web MVC 框架 Spring Web MVC的特性 其他MVC实现的可插拔性 DispatcherServlet 在WebApplicationContext中的特殊的bean ...

  2. Spring Boot 官方文档学习(一)入门及使用

    个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...

  3. Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(一)

    题外话:本篇是对之前那篇的重排版.并拆分成两篇,免得没了看的兴趣. 前言 在Spring Framework官方文档中,这三者是放到一起讲的,但没有解释为什么放到一起.大概是默认了读者都是有相关经验的 ...

  4. Spring boot官方文档学习(一)

    个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...

  5. Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion

    本篇太乱,请移步: Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 写了删删了写,反复几次,对自己的描述很不 ...

  6. Spring 4 官方文档学习(十二)View技术

    关键词:view technology.template.template engine.markup.内容较多,按需查用即可. 介绍 Thymeleaf Groovy Markup Template ...

  7. Spring 4 官方文档学习(十一)Web MVC 框架之配置Spring MVC

    内容列表: 启用MVC Java config 或 MVC XML namespace 修改已提供的配置 类型转换和格式化 校验 拦截器 内容协商 View Controllers View Reso ...

  8. Spring 4 官方文档学习(十一)Web MVC 框架之resolving views 解析视图

    接前面的Spring 4 官方文档学习(十一)Web MVC 框架,那篇太长,故另起一篇. 针对web应用的所有的MVC框架,都会提供一种呈现views的方式.Spring提供了view resolv ...

  9. Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion(二)

    接前一篇 Spring Framework 官方文档学习(四)之Validation.Data Binding.Type Conversion(一) 本篇主要内容:Spring Type Conver ...

  10. Spring Framework 官方文档学习(二)之IoC容器与bean lifecycle

    到目前为止,已经看了一百页.再次感慨下,如果想使用Spring,那可以看视频或者找例子,但如果想深入理解Spring,最好还是看官方文档. 原计划是把一些基本接口的功能.层次以及彼此的关系罗列一下.同 ...

随机推荐

  1. C# 内存泄漏之 Internal 关键词代表什么?

    一:背景 1. 背景 前段时间有位朋友咨询说他的程序出现了非托管内存泄漏,说里面有很多的 HEAP_BLOCK 都被标记成了 Internal 状态,而且 size 都很大, 让我帮忙看下怎么回事? ...

  2. gin项目部署到服务器并后台启动

    前言 我们写好的gin项目想要部署在服务器上,我们应该怎么做呢,接下来我会详细的讲解一下部署教程. 1.首先我们要有一台虚拟机,虚拟机上安装好go框架. 2.将写好的项目上传到虚拟机上. 3.下载好项 ...

  3. Codeforces Round #577 (Div. 2) C. Maximum Median

    题意:就是给一n(奇数)个元素数组,可以对它的元素执行k次+1操作,递增排序,求中位数最大是多少. 那我们在排完序之后,中位数前的元素可以不管它,只要对中位数后的操作就行,我们要判断和中位数相等的元素 ...

  4. 跨平台客户端Blazor方案尝试

    一.方案选择 Electron/MAUI + Blazor(AntDesgin blazor) BlazorApp:Blazor Razor页面层,抽象独立层,被BlazorAppElectron/B ...

  5. pta第二次博客

    目录 pta第二次博客 1.前言 2.设计与分析 第四次作业第一题 第四次作业第一题 第四次作业第一题 第四次作业第一题 pta第二次博客 1.前言 2.设计与分析 第四次作业第一题 1.题目: &q ...

  6. 泛化之美 —— C++11 可变参数模板的妙用

    概述 首先这篇文章出自博客园作者:[qicosmos ],我对本文的实例代码进行了学习.思考和整理纠正,理清了文章的全部细节,觉得这是一篇让我受益匪浅的文章.之所以会接触「可变参数模板」这部分的内容, ...

  7. 如何使用ffmpeg缩小视频的大小?

    如何使用ffmpeg缩小视频的大小? 看到这个答案.为方便起见,在下面引用: 通过将1 GB除以以秒为单位的视频长度来计算所需的比特率.因此,对于长度为16:40(1000秒)的视频,请使用10000 ...

  8. day05-JavaScript02

    JavaScript02 8.JavaScript函数 JavaScript函数介绍 函数是由事件驱动的,或者当它被调用时,执行的可重复使用的代码 例子 <!DOCTYPE html> & ...

  9. idea中springboot热部署(无需重启项目)

    idea中springboot热部署(无需重启项目) 1.在pom.xml文件中导入依赖 <dependency> <groupId>org.springframework.b ...

  10. 详解从浏览器地址栏输入URL到页面显示的步骤

    版本1(基础版本) 步骤1:浏览器根据请求的 URL 交给 DNS 域名解析,找到真实 IP ,向服务器发起请求: 步骤2:服务器交给后台处理完成后返回数据,浏览器接收⽂件( HTML.JS.CSS ...