Spring是一个开源框架,是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。

原因:

(1)通过控制反转(IOC)达到松耦合,IOC也就是把控制权交出去,在使用中直接得到对象

(2)提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务进行内聚性的开发(例如,商品的入库和出库是业务逻辑,而商品的入库和出库需要统一的日志记录和事务的管理是系统服务,与具体的业务无关,也就是无论业务如何,都要用到系统服务)

(3)包含并管理应用对象的配置和生命周期,也就是容器的作用

(4)将简单的组件配置、组合成为复杂的应用,也就是框架的作用

框架与类库的区别:

(1)框架一般是封装了逻辑、高内聚的,类库则是松散的工具组合

(2)框架专注于某一领域,类库则是更通用的

Spring是一系列轻量级Java EE框架的集合:核心容器,Spring上下文,Spring AOP, Spring DAO, Spring ORM, Spring Web, Spring MVC。

IOC:控制反转,控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护,也就是不显示的进行new创建对象

DI(依赖注入):是控制反转的一种实现方式,由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。也就是获得依赖对象的过程由自身管理变为由IOC容器主动注入。通过反射机制实现。

控制反转:

控制反转的目的:创建对象并组装对象之间的关系。

IOC容器初始化时创建一系列对象,并把对象之间的依赖关系通过注入的方式组织起来,当一个类A中有另外一个B,实例化时,先实例化A这个对象,再实例化B这个对象,然后把B这个对象赋值给A,这就是IOC的组装对象,具体如下图

图解:业务对象进入Spring容器,然后通过配置的元数据,生产出符合我们需要的对象,当我们需要用的时候,直接从Spring容器中取出来用即可,这也就是IOC,应用程序只关心对象的使用,而不关心对象的创建

在IOC容器中,把所有对象称为Bean,Spring利用Bean来管理这些对象,Spring对于Bean和其他的使用有两种方式,一种是基于xml的配置,一种是注解方式。

依赖注入:

借鉴http://blog.csdn.net/zhoudaxia/article/details/31763677

控制反转:把传统上由程序代码直接操控的对象的调用权交给外部容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”就是组件对象的控制权转移了,从程序代码本身转移到了外部容器。

实现控制反转的两种方式:依赖注入和依赖查找。

依赖注入有四种实现方式:

1.基于接口:实现特定接口以供外部容器注入所依赖类型的对象,接口中定义要注入依赖对象的方法。

2.基于setter方法:实现特定属性的public set方法,来让外部容器调用,以传入所依赖类型的对象。

3.基于构造函数:实现特定参数的构造函数,在新建对象时传入所依赖类型的对象。

4.基于注解:基于Java的注解功能,在私有变量前加“@Autowired"等注解,不需要显式的定义以上三种代码,便可以让外部容器传入对应的对象。该方案相当于定义了public 的set方法,但是因为没有真正的set方法,从而不会为了实现依赖注入导致暴露了不该暴露的接口(因为set方法只想让容器访问来注入而不希望其他依赖此类的对象访问)。

 Spring注入:

Spring注入是指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为。即在IOC容器加载配置文件的过程中,会扫描相关配置,并为这些bean实例化,也就是创建对象,注入就是随着创建的过程,完成对成员变量的赋值,例如在A类中声明了一个B类,注入就是指IOC容器在初始化A的时候就把A的成员变量B进行赋值。

常用的两种注入方式:

(1)设值注入

  通过成员变量的set方法进行注入,xml配置文件中的配置:

  

  这里也就是injectionDAO是injectionService中的一个属性,而且injectionService中必须有injectionDAO的set方法,因为context容器会自动调用对其进行赋值

(2)构造注入

  xml配置文件如下:

  

  构造方法如下:

  

  与设值注入其他配置类似,只是这里要求injectionService中,一定要有构造方法,且构造方法的参数名要是injectionDAO,在IOC容器调用InjectionServiceImpl的构造方法去创建这个类的实例的同时,就会把InjectionDAOImpl的实例赋值给injectionService中声明的构造方法中的参数injectionDAO。

Spring是什么+控制反转和依赖注入的更多相关文章

  1. 轻松了解Spring中的控制反转和依赖注入(二)

    紧接上一篇文章<轻松了解Spring中的控制反转和依赖注入>讲解了SpringIOC和DI的基本概念,这篇文章我们模拟一下SpringIOC的工作机制,使我们更加深刻的理解其中的工作. 类 ...

  2. Spring中的控制反转和依赖注入

    Spring中的控制反转和依赖注入 原文链接:https://www.cnblogs.com/xxzhuang/p/5948902.html 我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达 ...

  3. 轻松了解Spring中的控制反转和依赖注入(一)

    我们回顾一下计算机的发展史,从最初第一台计算机的占地面积达170平方米,重达30吨,到现如今的个人笔记本,事物更加轻量功能却更加丰富,这是事物发展过程中的一个趋势,在技术领域中同样也是如此,企业级Ja ...

  4. Spring框架之控制反转和依赖注入

    学Spring框架必须理解控制反转和依赖注入.下面各自举一个例子,来说明控制反转和依赖注入. IOC(控制反转):应用本身创建和维护的依赖对象:现在交由外部容器(Spring)来创建和维护:这个控制权 ...

  5. Spring IOC&DI 控制反转和依赖注入

    控制反转(Inversion of Control,缩写为IOC),它是把你设计好的对象交给spring控制,而不再需要你去手动 new Object(); 网上对于IOC的解释很多,对程序员而言,大 ...

  6. Spring 04: IOC控制反转 + DI依赖注入

    Spring中的IOC 一种思想,两种实现方式 IOC (Inversion of Control):控制反转,是一种概念和思想,指由Spring容器完成对象创建和依赖注入 核心业务:(a)对象的创建 ...

  7. Spring的IOC控制反转和依赖注入-重点-spring核心之一

    IoC:Inverse of Control(控制反转): 读作"反转控制",更好理解,不是什么技术,而是一种设计思想,好比于MVC.就是将原本在程序中手动创建对象的控制权,交由S ...

  8. Spring学习02——控制反转、依赖注入

    有两个人,张三和李四 package com.su.service; public class ZhangSan implements Tester{ public void test(){ Syst ...

  9. spring学习总结一----控制反转与依赖注入

    spring作为java EE中使用最为广泛的框架,它的设计体现了很多设计模式中经典的原则和思想,所以,该框架的各种实现方法非常值得我们去研究,下面先对spring中最为重要的思想之一----控制反转 ...

随机推荐

  1. Contest 4

    A:cf原题.当然是不是也没什么关系. #include<iostream> #include<cstdio> #include<cstdlib> #include ...

  2. The Largest Clique UVA - 11324( 强连通分量 + dp最长路)

    这题  我刚开始想的是  缩点后  求出入度和出度为0 的点  然后统计个数  用总个数 减去 然而 这样是不可以的  画个图就明白了... 如果  减去度为0的点  那么最后如果出现这样的情况是不可 ...

  3. 两种方法实现TAB菜单及文件操作

    1,自定义属性的方法实现----TAB菜单操作 cursor:pointer; 鼠标的小手 <!DOCTYPE html> <html lang="en"> ...

  4. svn和git的区别及适用场景

    svn和git的区别及适用场景 来源 https://blog.csdn.net/wz947324/article/details/80104621 svn的优势: 优异的跨平台支持,对windows ...

  5. 【省选水题集Day1】一起来AK水题吧! 题解(更新到B)

    题目:http://www.cnblogs.com/ljc20020730/p/6937936.html 水题A:[AHOI2001]质数和分解 安徽省选OI原题!简单Dp. 一看就是完全背包求方案数 ...

  6. PHP安装扩展mcrypt以及相关依赖项 【PHP安装PECL扩展的方法】

    一:Mcrypt简介 Mcrypt是PHP的一个扩展,完成了常用加密算法的封装.其实该扩展是对mcrypt标准类库的封装,mcrypt完成了相当多的常用加密算法,如DES, TripleDES, Bl ...

  7. openCV实例:Canny边缘检测

    http://blog.sina.com.cn/s/blog_737adf530100z0jk.html 在第一次使用openCV程序成功对图像进行打开后,现在开始试验第二个例程试验:Canny边缘检 ...

  8. 玲珑学院oj 1152 概率dp

    1152 - Expected value of the expression Time Limit:2s Memory Limit:128MByte Submissions:128Solved:63 ...

  9. libevent学习文档(二)eventbase相关接口和参数

    Setting up a default event_base The event_base_new() function allocates and returns a new event base ...

  10. 「Python」7个不一样的代码写法

    打印index 对于一个列表,或者说一个序列我们经常需要打印它的index,一般传统的做法或者说比较low的写法: 更优雅的写法是多用enumerate 两个序列的循环 我们会经常对两个序列进行计算或 ...