IOC容器理解

忘是亡心i 2024-04-07 12:21 129阅读 0赞

spring简介

Spring : 春天 —>给软件行业带来了春天

2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架。

2004年3月24日,Spring框架以interface21框架为基础,经过重新设计,发布了1.0正式版。

很难想象Rod Johnson的学历 , 他是悉尼大学的博士,然而他的专业不是计算机,而是音乐学。

Spring理念 : 使现有技术更加实用 . 本身就是一个大杂烩 , 整合现有的框架技术

spring分为许多模块,应用可以选择他们需要的模块。它的核心模块是core container(也就是核心容器),包括配置模块和DI依赖注入。除此之外,Spring框架还为不同的应用程序体系结构提供基础支持,包括消息传递、事务数据和持久性以及web。

总的来说:spring是一个开放源代码的设计层框架, 他解决的是业务逻辑和其他各个层松耦合问题, 因此他将面向接口的编程思想贯穿整个项目,解决了企业应用开发的复杂性

一句话概括:spring是一个轻量级控制反转(IOC)和面向切面(AOP)的容器框架

spring的特点和好处

优点:

1.使用Spring的IOC容器,将对象之间的依赖关系交给Spring,降低组件之间的耦合性,让我们更专注于应用逻辑

2.可以提供众多服务,事务管理,WS等。

3.AOP的很好支持,方便面向切面编程。

4.对主流的框架提供了很好的集成支持,如hibernate,Struts2,JPA等

5.Spring DI机制降低了业务对象替换的复杂性。

6.Spring属于低侵入,代码污染极低。

7.Spring的高度可开放性,并不强制依赖于Spring,开发者可以自由选择Spring部分或全部

缺点:

1.虽然Spring的组件代码是轻量级的。但它的配置却是重量级的。
一开始。spring用XML配置,而且是很多XML配置。
Sring2.5引入了基于 注解的组件扫描,这消除了大量针对应用程序自身组件的显示XML配置。
2.Spring3.0引入了基于 java的配置 ,这是一种类型安全的可重构配置方式,可以代替XML。

所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要进行思维切换,所以编写配置挤占了编写应用程序逻辑的时间。
3.和所有框架一样,Spring实用,但与此同时它要求的回报也不少。

此外,项目的依赖管理也是一件耗时耗力的事情。
在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。

控制反转(Inversion of Control,缩写为IoC

控制反转是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

通俗来讲就是 :把我们对象的创建,以及对象之间的调用,都交给Spring进行管理,

65258e959cd549b7ab364c0e7739ea05.png

现在我们代码现状,目前来看似乎没什么问题

f3f4974bc83d468b944ad569e82ccb99.png

但是如果我们现在数据层实现想更换一下

97b38ec4c35c42c8bc955282f5546a95.png

此时问题就显现出来了,由于我们在类里面写了其他的实现,导致我们的代码耦合度偏高,但是我们要追求代码的高内聚和低耦合,因此传统方式不能满足我们的编码需求,我们需要解决这个问题来实现优雅的编码

fefc7c3a51ce4a5bb6c4d4ae5499bd2c.png

而我们显然不能容忍这种问题的存在,此时既然是因为new对象造成的代码耦合度较高,那我们不创建对象就是了

d2d710100ba24f578a6e76711db890fa.png

但此时新的问题就又出现了,此时运行程序,就会出现NullPointerException空指针异常,找不到对象,

当你想着,这下彻底完了,这也不行,那也不行,而这时墙角的Spring正在瑟瑟发抖,而Spring就为我们提供了一套解决方案,在使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象那不就行了,这时,你好像突然明白了什么

8eeb75752af248278ed489dd40977c0f.png

这个时候Spring的小弟IOC出场了,而什么是IOC呢

IOC:使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,这种思想称为控制反转,实现了应用解耦

而IOC实现了应用解耦,那又跟spring有什么关系呢

这时因为Spring技术对IOC思想进行了实现

  1. Spring提供了一个容器,称为IOC容器,用来充当IOC思想中的“外部”,可以简单理解为由主动new对象转换为IOC提供对象
  2. IOC容器负责对象的创建,初始化等一系列工作,被创建或被管理的对象在IOC容器中称为Bean

93a5e423d06744cba8435d5dc49a2968.png

依赖注入:bean对象的创建依赖于IOC容器,我们可以根据需要来选择注入对象所依赖的外部资源

因为service依赖Dao运行,如果在容器中建立bean与bean之间的依赖关系的过程,称为DI(Dependency Injection) 依赖注入

此时我们在使用service对象的时候,想用里边的dao,就直接有对象

理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:
谁依赖于谁:当然是应用程序依赖于IoC容器;
  ●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;
  ●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;
  ●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

949d541c21d04981ae583ee2d4d36fa7.png

最终实现我们的目标:充分解耦

  1. 使用IOC容器管理Bean
  2. 在IOC容器内将有依赖关系的bean进行关系绑定

最终效果:

使用对象时,不仅可以直接从IOC容器中获取,并且获取到的bean已经绑定了所有的依赖关系

补充:

依赖注入方式

对于spring配置一个bean时,如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象的过程,spring的依赖注入有3种方式:

·使用属性的setter方法注入 ,这是最常用的方式;
·使用构造器注入;
·使用Filed注入(用于注解方式)。

最后,马上要到1024程序员节日了,提前祝各位程序员节日快乐,头发永远不掉

95c2d28995e84011bbd1d447e6f5bffa.png

发表评论

表情:
评论列表 (有 0 条评论,129人围观)

还没有评论,来说两句吧...

相关阅读

    相关 IOC容器

    描述 IOC:控制反转,将对象的创建过程交给Spring容器,由容器管理对象的生命周期; Bean的作用域 Spring Bean实例的作用范围由配置