广东建网站公司,书籍教你如何做网站,怎么做英文版网站,虚拟服务器有免费的吗学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念#xff0c;对于初学Spring的人来说#xff0c;总觉得IoC 、DI这两个概念是模糊不清的#xff0c;是很难理解的#xff0c;今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及…学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念对于初学Spring的人来说总觉得IoC 、DI这两个概念是模糊不清的是很难理解的今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解。
IOC理解
首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解写得非常通俗易懂以下内容全部来自原文原文地址http://jinnianshilongnian.iteye.com/blog/1413846
1.1、IoC是什么
Ioc—Inversion of Control即“控制反转”不是什么技术而是一种设计思想。在Java开发中Ioc意味着将你设计好的对象交给容器控制而不是传统的在你的对象内部直接控制。如何理解好Ioc呢理解好Ioc的关键是要明确“谁控制谁控制什么为何是反转有反转就应该有正转了哪些方面反转了”那我们来深入分析一下
●谁控制谁控制什么传统Java SE程序设计我们直接在对象内部通过new进行创建对象是程序主动去创建依赖对象而IoC是有专门一个容器来创建这些对象即由Ioc容器来控制对 象的创建谁控制谁当然是IoC 容器控制了对象控制什么那就是主要控制了外部资源获取不只是对象包括比如文件等。
●为何是反转哪些方面反转了有反转就有正转传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象也就是正转而反转则是由容器来帮忙创建及注入依赖对象为何是反转因为由容器帮我们查找及注入依赖对象对象只是被动的接受依赖对象所以是反转哪些方面反转了依赖对象的获取被反转了。
用图例说明一下传统程序设计如图2-1都是主动去创建相关对象然后再组合起来 图2-1 传统应用程序示意图
当有了IoC/DI的容器后在客户端类中不再主动去创建这些对象了如图2-2所示: 图2-2有IoC/DI容器后程序结构示意图
1.2、IoC能做什么
IoC 不是一种技术只是一种思想一个重要的面向对象编程的法则它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象从而导致类与类之间高耦合难于测试有了IoC容器后把创建和查找依赖对象的控制权交给了容器由容器进行注入组合对象所以对象与对象之间是 松散耦合这样也方便测试利于功能复用更重要的是使得程序的整个体系结构变得非常灵活。
其实IoC对编程带来的最大改变不是从代码上而是从思想上发生了“主从换位”的变化。应用程序原本是老大要获取什么资源都是主动出击但是在IoC/DI思想中应用程序就变成被动的了被动的等待IoC容器来创建并注入它所需要的资源了。
IoC很好的体现了面向对象设计法则之一—— 好莱坞法则“别找我们我们找你”即由IoC容器帮对象找相应的依赖对象并注入而不是由对象主动去找。
1.3、IoC和DI
DI—Dependency Injection即“依赖注入”组件之间依赖关系由容器在运行期决定形象的说即由容器动态的将某个依赖关系注入到组件之中。**依赖注入的目的并非为软件系统带来更多功能而是为了提升组件重用的频率并为系统搭建一个灵活、可扩展的平台。**通过依赖注入机制我们只需要通过简单的配置而无需任何代码就可指定目标需要的资源完成自身的业务逻辑而不需要关心具体的资源来自何处由谁实现。
理解DI的关键是“谁依赖谁为什么需要依赖谁注入谁注入了什么”那我们来深入分析一下
●谁依赖于谁 当然是应用程序依赖于IoC容器
●为什么需要依赖应用程序需要IoC容器来提供对象需要的外部资源
●谁注入谁很明显是IoC容器注入应用程序某个对象应用程序依赖的对象
●注入了什么就是注入某个对象所需要的外部资源包括对象、资源、常量数据。
IoC和DI由什么关系呢其实它们是同一个概念的不同角度描述由于控制反转概念比较含糊可能只是理解为容器控制对象这一个层面很难让人想到谁来维护对象关系所以2004年大师级人物Martin Fowler又给出了一个新的名字“依赖注入”相对IoC 而言依赖注入明确描述了“被注入对象依赖IoC容器配置依赖对象”。
看过很多对Spring的Ioc理解的文章好多人对Ioc和DI的解释都晦涩难懂反正就是一种说不清道不明的感觉读完之后依然是一头雾水感觉就是开涛这位技术牛人写得特别通俗易懂他清楚地解释了IoC(控制反转) 和DI(依赖注入)中的每一个字读完之后给人一种豁然开朗的感觉。我相信对于初学Spring框架的人对Ioc的理解应该是有很大帮助的。
IIOC理解
2.1、IoC(控制反转)
首先想说说IoCInversion of Control控制反转。这是spring的核心贯穿始终。**所谓IoC对于spring框架来说就是由spring来负责控制对象的生命周期和对象间的关系。**这是什么意思呢举个简单的例子我们是如何找女朋友的常见的情况是我们到处去看哪里有长得漂亮身材又好的mm然后打听她们的兴趣爱好、qq号、电话号、ip号、iq号………想办法认识她们投其所好送其所要然后嘿嘿……这个过程是复杂深奥的我们必须自己设计和面对每个环节。传统的程序开发也是如此在一个对象中如果要使用另外的对象就必须得到它自己new一个或者从JNDI中查询一个使用完之后还要将对象销毁比如Connection等对象始终会和其他的接口或类藕合起来。
那么IoC是如何做的呢有点像通过婚介找女朋友在我和女朋友之间引入了一个第三者婚姻介绍所。婚介管理了很多男男女女的资料我可以向婚介提出一个列表告诉它我想找个什么样的女朋友比如长得像李嘉欣身材像林熙雷唱歌像周杰伦速度像卡洛斯技术像齐达内之类的然后婚介就会按照我们的要求提供一个mm我们只需要去和她谈恋爱、结婚就行了。简单明了如果婚介给我们的人选不符合要求我们就会抛出异常。整个过程不再由我自己控制而是有婚介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此所有的类都会在spring容器中登记告诉spring你是个什么东西你需要什么东西然后spring会在系统运行到适当的时候把你要的东西主动给你同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制也就是说控制对象生存周期的不再是引用它的对象而是spring。对于某个具体的对象而言以前是它控制其他对象现在是所有对象都被spring控制所以这叫控制反转。
2.2、DI(依赖注入)
IoC的一个重点是在系统运行中动态的向某个对象提供它所需要的其他对象。这一点是通过DIDependency Injection依赖注入来实现的。比如对象A需要操作数据库以前我们总是要在A中自己编写代码来获得一个Connection对象有了 spring我们就只需要告诉springA中需要一个Connection至于这个Connection怎么构造何时构造A不需要知道。在系统运行时spring会在适当的时候制造一个Connection然后像打针一样注射到A当中这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行而这个Connection是由spring注入到A中的依赖注入的名字就这么来的。那么DI是如何实现的呢 Java 1.3之后一个重要特征是反射reflection它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性spring就是通过反射来实现注入的。
理解了IoC和DI的概念后一切都将变得简单明了剩下的工作只是在spring的框架中堆积木而已。
我对IoC(控制反转)和DI(依赖注入)的理解
在平时的java应用开发中我们要实现某一个功能或者说是完成某个业务逻辑时至少需要两个或以上的对象来协作完成在没有使用Spring的时候每个对象在需要使用他的合作对象时自己均要使用像new object() 这样的语法来将合作对象创建出来这个合作对象是由自己主动创建出来的创建合作对象的主动权在自己手上自己需要哪个合作对象就主动去创建创建合作对象的主动权和创建时机是由自己把控的而这样就会使得对象间的耦合度高了A对象需要使用合作对象B来共同完成一件事A要使用B那么A就对B产生了依赖也就是A和B之间存在一种耦合关系并且是紧密耦合在一起而使用了Spring之后就不一样了创建合作对象B的工作是由Spring来做的Spring创建好B对象然后存储到一个容器里面当A对象需要使用B对象时Spring就从存放对象的那个容器里面取出A要使用的那个B对象然后交给A对象使用至于Spring是如何创建那个对象以及什么时候创建好对象的A对象不需要关心这些细节问题(你是什么时候生的怎么生出来的我可不关心能帮我干活就行)A得到Spring给我们的对象之后两个人一起协作完成要完成的工作即可。
所以控制反转IoC(Inversion of Control)是说创建对象的控制权进行转移以前创建对象的主动权和创建时机是由自己把控的而现在这种权力转移到第三方比如转移交给了IoC容器它就是一个专门用来创建对象的工厂你要什么对象它就给你什么对象有了 IoC容器依赖关系就变了原先的依赖关系就没了它们都依赖IoC容器了通过IoC容器来建立它们之间的关系。
这是我对Spring的IoC(控制反转) 的理解。DI(依赖注入)其实就是IOC的另外一种说法DI是由Martin Fowler 在2004年初的一篇论文中首次提出的。他总结控制的什么被反转了就是获得依赖对象的方式反转了。
IOC实现原理
《Spring》IOC实现原理
1. 概述
IOCInversion of Control控制反转也称为DIDependency Injection依赖注入。所谓IOC 就是把原先代码里需要开发者实现的对象创建和关系依赖反转交给SpringIOC容器管理对象的生命周期和对象之间的依赖关系。 Spring通过配置文件描述Bean及Bean之间的依赖关系或者是注解annotation利用Java语言的反射功能实例化Bean并建立Bean之间的依赖关系。 Spring启动时读取应用程序提供的Bean配置信息并在Spring容器中生成一份相应的Bean配置注册表然后根据这张注册表实例化Bean装配Bean之间的依赖关系最后将Bean保存到Spring容器中的Bean缓存池中其中Bean缓存池是由ConcurrentHashMap实现。 2. 依赖倒置
假设我们设计一辆汽车先设计轮子然后根据轮子大小设计底盘接着根据底盘设计车身最后根据车身设计好整个汽车。这里就出现了一个依赖关系汽车依赖车身车身依赖底盘底盘依赖轮子。 这样的设计看起来没问题但是可维护性却很低。假设设计完工之后上司却突然说根据市场需求的变动要我们把车子的轮子设计都改大一码。这下我们就蛋疼了因为我们是根据轮子的尺寸设计的底盘轮子的尺寸一改底盘的设计就得修改。
同样因为我们是根据底盘设计的车身那么车身也得改同理汽车设计也得改——整个设计几乎都得改我们现在换一种思路。我们先设计汽车的大概样子然后根据汽车的样子来设计车身根据车身来设计底盘最后根据底盘来设计轮子。这时候依赖关系就倒置过来了轮子依赖底盘 底盘依赖车身 车身依赖汽车。 这时候上司再说要改动轮子的设计我们就只需要改动轮子的设计而不需要动底盘车身汽车的设计了。这就是依赖倒置原则——把原本的上层依赖底层倒置过来变成底层依赖上层。上层决定需要什么底层就去实现这样的需求而上层并不关注底层怎么实现的。这样就不会出现前面的牵一发而动全身的情况。
3. 控制反转
控制反转是依赖倒置原则的一种代码设计的思路具体采用的方法是依赖注入Dependency Injection。所谓依赖注入上层控制底层底层类作为参数传入上层类。 4. 常用容器
4.1 BeanFactory
BeanFactory是Spring框架的基础设施是IOC容器的基础接口所有的容器都是从它这里继承实现而来。BeanFactory作为SpringIOC容器为了能够明确描述各个对象间的依赖关系Spring提供了三种管理方式
在XML中进行显式配置。在Java中进行显式配置。注解方式。
Spring提供了三种注入方式
构造方法注入。setter方法注入。注解方式注入。 4.2 ApplicationContext
ApplicationContext是Spring提供的一个高级的IOC容器面向使用Spring框架的开发者它除了能够提供IOC容器的基本功能外还为用户提供了以下的附加服务
BeanFactory能够管理和装配Bean。ResourcePatternResolver能够加载资源文件。MessageResource能够实现国际化等功能。ApplicationEventPublisher能够注册监听器实现监听机制。
Spring自带多种类型的应用上下文
AnnotatinonConfigApplicationContext从一个或多个基于Java的配置类中加载Spring应用上下文。
ApplicationContext context new AnnotatinonConfigApplicationContext(com.cmos.DemoConfig.class);AnnotationConfigWebApplicationContext从一个或多个基于Java的配置类中加载SpringWeb应用上下文。ClassPathXmlApplicationContext从类路径下的一个或多个XML配置文件中加载上下文定义把应用上下文的定义文件作为类资源。
ApplicationContext context new ClassPathXmlApplicationContext(demo.xml);FileSystemXmlApplicationContext从文件系统下的一个或多个XML配置文件中加载上下文定义。
ApplicationContext context new FileSystemXmlApplicationContext(c:/demo.xml);XmlWebApplicationContext从Web应用下的一个或多个XML配置文件中加载上下文定义。
5. Bean的作用域
singleton这种Bean范围是默认的这种范围确保不管接受到多少个请求每个容器中只有一个Bean的实例单例的模式由BeanFactory自身来维护。prototype原形范围与单例范围相反为每一个Bean请求提供一个实例。request在请求Bean范围内会为每一个来自客户端的网络请求创建一个实例在请求完成以后Bean会失效并被垃圾回收器回收。session与请求范围类似确保每个Session中有一个Bean的实例在Session 过期后Bean会随之失效。global-sessionglobal-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时它包含很多 portlet。如果你想要声明让所有的 portlet 共用全局的存储变量的话那么这全局变量需要存储在global-session 中。全局作用域与Servlet中的Session 作用域效果相同。
6. Bean的生命周期
Spring对Bean实例化Spring将值和Bean的引用注入到Bean对应的属性中如果Bean实现了BeanNameAware接口Spring将调用setBeanName()方法传递Bean的ID到BeanFactory中如果Bean实现了BeanFactoryAware接口Spring将调用setBeanFactroy()方法将BeanFactory容器实例传入便于Bean够获取配置他们的BeanFactory的引用如果Bean实现了ApplicationContextAware接口Spring将调用setApplicationContext()方法将Bean所在应用上下文的引用传进来便于bean获取它所在的Spring容器如果Bean实现了BeanPostProcessor接口Spring将调用postProcessBeforeInitialization()方法该方法在Bean初始化之前调用。如果Bean在Spring配置文件中配置了init-method属性该方法将会自动调用。如果Bean实现了InitializingBean接口Spring将调用它的afterPropertiesSet()方法当Bean的所用属性被设置完成之后调用该方法如果Bean实现了BeanPostProcessor接口Spring将调用它的postProcessAfterInitialization()方法在Bean初始化完成之后调用此时Bean准备就绪如果Bean实现了DisposableBean接口spring将调用它的destory()方法。如果Bean在Spring配置文件中配置了destory-method属性该方法将会自动调用。 Spring的ioc底层原理和简单实例
传统创建对象方法 IOC 底层原理
1.ioc底层原理使用技术 1xml配置文件 2dom4j解决xml 3工厂设计模式 4反射
2.画图分析ioc实现原理