Spring源码解析(一)开篇
前言
Spring源码继承结构比较复杂,看过以后经常会忘记。因此,记录一下源码分析的过程,方便以后回顾。本次分析的Spring源码版本为3.2.15。
另外,一提Spring就是IOC、DI等等,我们先初步了解一下这些概念。
依赖倒置原则(Dependence Inversion Principle):面向对象设计原则的一种(抽象概念),其他的还有单一职责原则、里氏替换原则、接口隔离原则、依赖倒置原则、迪米特原则、开-闭原则。
控制反转(Inversion Of Control):它是遵循依赖倒置原则设计的一种设计模式或者说设计思想(还是停留在概念),所谓控制反转其实就是依赖对象的获取权被反转了,不再由自己控制,而是由第三方来控制。
依赖注入(Dependency Injection):依赖注入是实现控制反转(设计思想)的一种具体实现方式。
依赖倒置原则(DIP)
public class ServiceA{
private ServiceB serviceB;//ServiceB是一个接口 public void toDoMethod(){
serviceB.toDo();
} public ServiceA(){
this.serviceB=new ServiceBImpl1();
}
}
public class ServiceA{
private ServiceB serviceB;//ServiceB是一个接口 public void toDoMethod(){
serviceB.toDo();
}
}
什么是依赖倒置呢?
如上代码所示,ServiceA中并没有ServiceB具体实现,也就是所谓的ServiceA依赖了ServiceB的抽象。在编译期ServiceA(.高层次的模块)并没有依赖低层次模块(ServiceB的具体实现),只有真正在运行期需要ServiceB实现的时候才会有交集,这就大大降低耦合度。
控制反转(Inversion Of Control)
依赖倒置原则只是告诉我们不要依赖具体实现,要依赖抽象。它只是指导思想,具体怎么去实现呢?控制反转就是在指导思想下设计出的一套解决方案。
高层次模块中只依赖低层次模块的抽象(接口或抽象类),创建低层次模块具体对象的事情不再由高层次模块负责,而是交由第三方来完成,在运行期需要的时候再通过某种方式获得低层次模块的实现。
到此,还是只停留在理论层面。
依赖注入(Dependency Injection)
IoC是一个很大的概念,可以用不同的方式来实现。其主要实现方式有两种:<1>依赖查找(Dependency Lookup):容器提供回调接口和上下文环境给组件。EJB和Apache Avalon都使用这种方式。<2>依赖注入(Dependency Injection):组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。后者是时下最流行的IoC类型,其又有接口注入(Interface Injection),设值注入(Setter Injection)和构造子注入(Constructor Injection)三种方式。
依赖注入是现在最主流的方式。因为它太主流,导致现在ioc已经约等于DI。
IOC容器
我们提到创建依赖对象的工作由第三方来完成,这个第三方就是IOC容器,它负责理清模块与模块直接的依赖关系,并且负责进行依赖注入。
当然,这个容器要做的足够灵活、可配置。
总结
依赖倒置是指导思想
反转控制是解决方案
依赖注入是一种具体实施
IOC的优点:
1.模块与模块直接耦合度降低,这样有利于团队协作开发、单元测试。
2.面向接口编程,系统灵活性增加。
3.模块直接的复杂依赖关系、对象的创建以及生命周期管理等都有容器完成。
IOC的缺点:
1.原本简单通过new就可以完成的对象创建,现在需要一个复杂过程来完成。
2.面向接口编程,灵活度增强了必然导致效率的降低。
所以说,IOC这种模式不是适合所有的系统,还是要根据系统特点来选择是否需要IOC模式。
Spring源码解析(一)开篇的更多相关文章
- Spring源码解析系列汇总
相信我,你会收藏这篇文章的 本篇文章是这段时间撸出来的Spring源码解析系列文章的汇总,总共包含以下专题.喜欢的同学可以收藏起来以备不时之需 SpringIOC源码解析(上) 本篇文章搭建了IOC源 ...
- Spring源码解析 - AbstractBeanFactory 实现接口与父类分析
我们先来看类图吧: 除了BeanFactory这一支的接口,AbstractBeanFactory主要实现了AliasRegistry和SingletonBeanRegistry接口. 这边主要提供了 ...
- spring 源码解析
1. [文件] spring源码.txt ~ 15B 下载(167) ? 1 springн┤┬вио╬Ш: 2. [文件] spring源码分析之AOP.txt ~ 15KB 下载( ...
- Spring源码解析——循环依赖的解决方案
一.前言 承接<Spring源码解析--创建bean>.<Spring源码解析--创建bean的实例>,我们今天接着聊聊,循环依赖的解决方案,即创建bean的ObjectFac ...
- Spring源码解析-ioc容器的设计
Spring源码解析-ioc容器的设计 1 IoC容器系列的设计:BeanFactory和ApplicatioContext 在Spring容器中,主要分为两个主要的容器系列,一个是实现BeanFac ...
- Spring源码解析之PropertyPlaceholderHelper(占位符解析器)
Spring源码解析之PropertyPlaceholderHelper(占位符解析器) https://blog.csdn.net/weixin_39471249/article/details/7 ...
- Spring源码解析之BeanFactoryPostProcessor(三)
在上一章中笔者介绍了refresh()的<1>处是如何获取beanFactory对象,下面我们要来学习refresh()方法的<2>处是如何调用invokeBeanFactor ...
- Spring源码解析之ConfigurationClassPostProcessor(二)
上一个章节,笔者向大家介绍了spring是如何来过滤配置类的,下面我们来看看在过滤出配置类后,spring是如何来解析配置类的.首先过滤出来的配置类会存放在configCandidates列表, 在代 ...
- Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean
Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean 七千字长文深刻解读,Spirng中是如何初始化单例bean的,和面试中最常问的Sprin ...
随机推荐
- Java中的阻塞队列(BlockingQueue)
1. 什么是阻塞队列 阻塞队列(BlockingQueue)是 Java 5 并发新特性中的内容,阻塞队列的接口是 java.util.concurrent.BlockingQueue,它提供了两个附 ...
- 专题实验 Toad 用户的创建与管理( 包括 role 等 )
1. 用户登录数据库 是否可以通过操作系统权限来登录数据库, $ORACLE_HOME/network/admin/sqlnet.ora 这个文件中设置, 如果增加参数sqlnet.authentic ...
- 解决request.getRemoteAddr()获取的值为0:0:0:0:0:0:0:1这个小问题
症状: Windows操作系统,eclipse开发环境下,在本机上使用http://localhost:8080/...访问本机上的页面,使用tomcat作为服务器 在Servlet或者Action中 ...
- crc32 冗余加密校验
在数据存储和传输中使用 在ts中要对pat 和pmt 中的数据进行冗余校验 http://blog.chinaunix.net/uid-20321537-id-1966721.html
- RabbitMQ之Queues-5
工作队列的主要任务是:避免立刻执行资源密集型任务,然后必须等待其完成.相反地,我们进行任务调度:我们把任务封装为消息发送给队列.工作进行在后台运行并不断的从队列中取出任务然后执行.当你运行了多个工作进 ...
- jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
对于问题从后台获取json数据,将内容填充到下拉列表,代码非常简单,具体过程请看下面代码. 需求:url:链接 par:ID sel:下拉列表选择器 function BuildS ...
- MP 及OMP算法解析
转载自http://blog.csdn.net/pi9nc/article/details/18655239 1,MP算法[盗用2] MP算法是一种贪心算法(greedy),每次迭代选取与当前样本残差 ...
- ionic listview对象的编辑、排序和删除
1)ionic的listview对象即<ion-list></ion-list> 2)添加并显示编辑按钮(添加其他自定义按钮也一样) can-swipe属性设置为true(默认 ...
- windows系统共享设置最顺的一次
1.关掉防火墙 2.控制面板\网络和 Internet\网络和共享中心\高级共享设置 3.设置要共享的文件夹属性
- MVC模式 与 Model2模型 介绍
Model1回顾 MVC模式:MVC(Model.View.Controller)是软件开发过程中比较流行的设计思想.旨在分离模型.控制.师徒.是一种分层思想的体现. Model2简介Java Web ...