Spring是什么+控制反转和依赖注入

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

缘由:框架

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

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

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

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

框架与类库的区别:日志

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

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

 

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

 

 

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。

相关文章
相关标签/搜索