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. AFNetworking你最最最起码要知道的基本使用~

    AFNetworking是一个在iOS开发中,使用非常多的一个开源库 适用于iOS以及Mac OS X, 它构建于在(Apple iOS开发文档)NSURLConnection, NSOperatio ...

  2. iOS pch文件的创建

    3.iso pch头文件的创建  输入文件名的时候记得打钩 3.1.在Build Settings 里搜索pref就能找到preflx, 点击设置相对路径 $(SRCROOT) +路径:成功了就会显示 ...

  3. Codeforces 748D Santa Claus and a Palindrome

    雅礼集训期间我好像考完试就开始划水了啊 给出k个长度相同的字符串,每个串有一个权值,选出一些串连成一个回文串.使得选中的串的总权值最大. 如果选一个串,必须同时选一个对称的串.还有一个特殊情况是可以在 ...

  4. After ZJOI2017 day2

    4.28早上6点左右就起了床,怀着紧张的心情,候到了7:45进考场 看到题,先0.5h看了看题意,yy一下,至少10+20+10. 首先是觉得T3可以搞一搞,先想到SA,很快就X掉了,思索一会儿,感觉 ...

  5. MyBatis之自查询,使用 递归实现 N级联动

    A:首先先看下一个简单的面试题 斐波那契数列 计算数组{1,1,2,3,5,8.......} 第30位值 规律:1 1 从第三项开始,每一项都是前两项之和 有两种实现方式 第一种方式: public ...

  6. centos上部署nginx服务

    Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯访问量第二的R ...

  7. 【二维树状数组】【CF10D】 LCIS

    传送门 Description 给你两个串,求他们的最长公共上升子序列 Input 第一行是第一个串的长度\(n\) 第二行\(n\)个数代表第一个串 第三行是第二个串的长度\(m\) 第四行\(m\ ...

  8. 图像PNG格式介绍

    1 图像png格式简介 PNG是20世纪90年代中期开始开发的图像文件存储格式,其目的是企图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性.流式网络图形格式(PortableN ...

  9. POJ2975:Nim(Nim博弈)

    Nim Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7279   Accepted: 3455 题目链接:http://p ...

  10. windows环境下封装条件wait和signal

    linux 环境有提供好的pthread_cond_wait() 和 phread_signal().pthread_broadcast() windows需要自己封装,利用semophore控制线程 ...