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++ 栈和典型迷宫问题

    C++ 栈和迷宫问题 1. 前言 栈是一种受限的数据结构,要求在存储数据时遵循先进后出(Last In First Out)的原则.可以把栈看成只有一个口子的桶子,进和出都是走的这个口子(也称为栈顶) ...

  2. CentOS 7.9 安装 kafka_2.13

    一.CentOS 7.9 安装 kafka_2.13 地址 https://kafka.apache.org/downloads.html 二.安装准备 1 安装JDK 在安装kafka之前必须先安装 ...

  3. 网页头部的声明应该是用 lang="zh" 还是 lang="zh-CN"?

    网页头部的声明应该是用 lang="zh" 还是 lang="zh-CN"? 遇到问题 不知道大家有没有留意到一个问题,就是使用 VsCode 新建的 html ...

  4. 你真的会使用Typora吗?

    你真的会使用Typora吗? 标题 一级标题:# 空格+内容 二级标题:## 空格+内容 字体 加粗:内容两边各加两个*号 你真美! 斜体:内容两边各加一个*号 你真帅! 删除线:两边各加两个~号(波 ...

  5. Linux文件属性与管理

    文件或目录属性主要包括: 索引节点,inode 文件类型 文件权限 硬链接个数 归属的用户和用户组 最新修改时间 查看命令 ls -lhi /opt 图解: Inode索引节点号,(人的身份证,家庭地 ...

  6. 多项式回归 & pipeline & 学习曲线 & 交叉验证

    多项式回归就是数据的分布不满足线性关系,而是二次曲线或者更高维度的曲线.此时只能使用多项式回归来拟合曲线.比如如下数据,使用线性函数来拟合就明显不合适了. 接下来要做的就是升维,上面的真实函数是:$ ...

  7. mysql是如何实现mvcc的

    mvcc的概念 mvcc即多版本并发控制,是一种并发控制的策略,能让数据库在高并发下做到安全高效的读写,提升数据库的并发性能; 是一种用来解决并发下读写冲突的无锁解决方案,为事务分配单向增长时间戳,为 ...

  8. Redis Cluster 数据分片

    介绍 Redis Cluster Redis 集群是 Redis 提供的分布式数据库方案, 集群通过分片(sharding) 来进行数据共享, 并提供复制和故障转移功能. 节点 一个 Redis 集群 ...

  9. Idea在windows和mac中的一些快捷指令

    从 Windows 过度到 Mac 必备快捷键对照表 Mac 键盘符号说明 ⌘ == Command ⇧ == Shift ⇪ == Caps Lock ⌥ == Option ⌃ == Contro ...

  10. PHP实现CURL发送请求

    public function curl($url, $params = false, $ispost = 0) { $httpInfo = array(); //初始化 $ch = curl_ini ...