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


    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。

  • 相关阅读:
    leetcode390
    leetcode388
    leetcode373
    leetcode368
    leetcode372
    leetcode386
    基于自定义协议的服务器高并发处理之:多线程模型
    基于自定义协议的服务器高并发处理之:多进程模型
    macos下简单的socket服务器+客户端
    Windows下编译Libevent
  • 原文地址:https://www.cnblogs.com/cing/p/7412643.html
Copyright © 2020-2023  润新知