Spring核心实现篇
一、Spring Framework的核心:IoC容器的实现
1.1Spring IoC的容器概述
1.1.1 IoC容器和控制反转模式
依赖控制反转的实现有很多种方式。在Spring中,IOC容器是实现这个模式的载体,它可以在对象生成或初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖。这种依赖注入是可以递归的,对象被逐层注入。
关于如何反转对依赖的控制,把控制权从具体的业务对象手中转交到平台或者框架中,是降低面向对象系统设计复杂性和提高面向对象系统可测试性的一个有效的解决方案。它租金了IOC设计模式的发展。
通过使用IOC容器,对象关系依赖的管理被反转了,转到IOC容器中来了,对象之间的相互依赖的关系由IOC容器进行管理,并由IOC容器完成对象的注入。因为很多对象依赖关系的建立和维护并不需要和系统的运行状态有很强的关联性,所以可以把面向对象中需要执行的如新建对象、为对象引用赋值等操作交由容器来统一完成。
1.1.2 Spring IOC的应用场景
IOC设计模式,是解耦组件之间复杂关系的利器,Spring IOC模块就是一种实现。以应用开发人员的身份设计组件时,往往需要引用和调用其他组件的服务,这种依赖关系如果固化在组件的设计中,就会造成依赖关系的僵化和维护难度的增加,使用IOC容器,把资源获取的方向反转,让IOC容器主动管理这些依赖关系,将这些依赖关系注入到组件中,会让依赖关系的适配和管理更加灵活。在具体的注入实现中,接口注入、setter注入、构造器注入是主要的注入方式。在Spring的IOC设计中,setter注入和构造器注入是主要的注入方式。另一方面,在应用管理依赖关系时,可以通过IOC容器将控制进行反转,在反转的实现中,如果能通过可读的文本来完成配置,并且还能通过工具对这些配置信息进行可视化的管理和浏览,能够提高对组件关系的管理水平。并且如果耦合关系需要变动,并不需要重新修改和编译Java源代码,这符合面向对象设计中的开闭原则,如果结合osgi的使用特性,还可以提高应用的动态部署能力。
1.2 Ioc容器系列的设计与实现:BeanFactory和ApplicationContext
在Spring Ioc容器的设计中,有两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器的最基本的功能;另一个是ApplicationContext应用上下文,它作为容器的高级形态而存在。
1.2.1 Spring的Ioc容器系列
作为IOC容器,需要为他的具体实现指定基本的功能规范,功能规范的设计表现为接口类BeanFactory,它体现了Spring为提供给用户使用的Ioc容器所设定的最基本的功能规范。对Spring的具体IOC容器的实现来说,他需要满足BeanFactory这个基本的接口定义,BeanFactory作为一个最基本的接口类出现在Spring的Ioc容器体系中。
在这些Spring提供的基本Ioc容器的接口定义和实现的基础上,Spring通过定义BeanDefinition来管理基于Spring的应用中的各种对象以及他们之间的相互依赖关系。BeanDefinition抽象了我们对Bean的定义,是让容器起作用的主要数据类型。对Ioc容器来说,BeanDefinition就是对依赖反转模式中管理的对象依赖关系的数据抽象,也就是容器实现依赖反转功能的核心数据结构,依赖反转都是围绕对这个BeanDefinition的处理来完成的。
同时,再使用IOC容器时,了解BeanFactory和ApplicationContext之间的区别对我们理解和使用Ioc容器也是比较重要的。
1.2.2 Spring IoC容器的设计
- 从接口BeanFactory到HierarchicalBeanFactory,再到ConfigurableBeanFactory,是一条主要的BeanFactory设计路径。在此路径,BeanFactory接口定义了基本的Ioc容器的规范。在这个接口定义中,包括了getBean()这样的IoC容器的基本方法。而HierarchicalBeanFactory接口在继承了BeanFctory的基本接口之后,增加了getParentBeanFactory()的接口功能,使BeanFactory具备了双亲Ioc的管理功能。在接下来的ConfigurableBeanFactory接口中,主要定义了一些对BeanFactory的配置功能,比如通过setParentBeanFactory()设置双亲IOC容器,通过addBeanPostProcessor()配置Bean后置处理器等。
- 第二条接口设计主线是,以ApplicationContext应用上下文接口为核心的接口设计,涉及的主要接口设计有,从BeanFactory到ListableBeanFactory,再到ApplicationContext,再到我们常用的WebApplicationContext或者ConfigurableApplicationContext接口。
- 第三个路线涉及的是主要接口关系,而具体的IOC容器都是在这个接口体系下实现的,比如DefaultListableBeanFctory,这个基本IOC容器的实现就是实现了ConfigurableBeanFactory,从而成为一个简单的Ioc容器实现。
- 这个接口系统是以BeanFactory和ApplicationContext为核心的。而BeanFactory又是Ioc容器的最基本接口,在ApplicationContext的设计中,一方面,可以看到它继承了BeanFactory接口体系中的ListableBeanFactory、AutowireCapableBeanFactory、HierarchicalBeanFacctory等BeanFactory的接口,具备了BeanFactory Ioc容器的基本功能;另一方面,通过继承MessageSource、ResourceLoadr、ApplocationEventPublisher这些接口,BeanFactory为ApplicationContext赋予了更高级的Ioc容器特性。对于ApplicationContext而言,为了在Web环境中使用它,还设计了WebApplicationContext接口,而这个接口通过继承ThemeSource接口来扩充功能
Spring核心实现篇的更多相关文章
- Spring boot学习1 构建微服务:Spring boot 入门篇
Spring boot学习1 构建微服务:Spring boot 入门篇 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框 ...
- 自己实现spring核心功能 一
聊聊spring spring对于java开发者来说,是最熟悉不过的框架了,我们日常开发中每天都在使用它.它有着各种各样的好处,简单易用,得心应手... ... 我们一说到spring就会讲到ioc ...
- Spring Cloud第九篇 | 分布式服务跟踪Sleuth
本文是Spring Cloud专栏的第九篇文章,了解前八篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cl ...
- Spring 核心功能演示
Spring 核心功能演示 Spring Framework 简称 Spring,是 Java 开发中最常用的框架,地位仅次于 Java API,就连近几年比较流行的微服务框架 SpringBoot, ...
- 读源码之Spring 核心内容
为什么有这篇文档 工作两三年之后,总感觉什么东西都懂,但是什么东西又都不会.所以日常学习是很有必要的,俗话说学而不思则罔 ,思而不学则殆.所以我们要学思结合,学习的方法有很多,但是思考的深度或者说有没 ...
- 死磕Spring之IoC篇 - BeanDefinition 的加载阶段(XML 文件)
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...
- 死磕Spring之IoC篇 - BeanDefinition 的解析过程(面向注解)
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...
- 死磕Spring之IoC篇 - 开启 Bean 的加载
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...
- 死磕Spring之IoC篇 - Bean 的创建过程
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...
随机推荐
- ACM-Checker Challenge
题目描述:Checker Challenge 1000(ms) 10000(kb) 20 / 90 Examine the 6x6 checkerboard below and note tha ...
- vue学习(六)异步组件加载
异步组件加载 首先准备-----简单的框架搭出来 <!DOCTYPE html> <html lang="zh-CN"> <head> < ...
- Django template配置
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join( ...
- JavaWeb学习记录
服务器端跳转(请求重定向): 1.jsp内跳转 : <jsp:forward page="page_scope_03.jsp"/> 客户端跳转(请求转发): 1.通过超 ...
- 官网英文版学习——RabbitMQ学习笔记(一)认识RabbitMQ
鉴于目前中文的RabbitMQ教程很缺,本博主虽然买了一本rabbitMQ的书,遗憾的是该书的代码用的不是java语言,看起来也有些不爽,且网友们不同人学习所写不同,本博主看的有些地方不太理想,为此本 ...
- 设置Apache(httpd)和Nginx 开机自启动
方法1: 进入目录: vi /etc/rc.d/rc.local #设置apache 和 nginx 开机自启动/usr/sbin/apachectl start/usr/sbin/nginx s ...
- springboot-jar
预览 1.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&quo ...
- sed使用案例
简介: sed是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用 ...
- vue样式的动态绑定
true显示样式,flase不显示 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- HDU - 1251 字典树模板题
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input输入数据的第一部 ...