IOC AOP

IOC-控制反转(Inversion of Control)

  • 为了降低对象之间的耦合度, 实现解耦

  • IOC容器去控制对象bean的生命周期, 而不是对象的使用者

  • 不需要对象的使用者去创建对象, 赋予各种属性, 而是由IOC容器去做, 对象的使用者直接把对象拿来用

  • 控制反转是目的, 手段是依赖注入(DI)(Dependency Injection)

  • 对象之间不在相互依赖, 通过一个第三方实现解耦

    img

  • IOC也叫依赖注入(DI), 获得依赖对象的过程由自身管理变为了由IOC容器主动注入

  • IOC容器生成对象是通过反射方式,在运行效率上有一定的损耗

  • ●谁依赖于谁:当然是应用程序依赖于IoC容器;

    ●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;

    ●谁注入谁:IoC容器注入应用程序依赖的对象;

    ●注入了什么:注入某个对象所需要的外部资源(包括对象、资源、常量数据)

  • 一般通过xml文件告诉容器如何创建组件,以及各组件的依赖关系

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <beans>
    <bean id="dataSource" class="HikariDataSource" />
    <bean id="bookService" class="BookService">
    <property name="dataSource" ref="dataSource" />
    </bean>
    <bean id="userService" class="UserService">
    <property name="dataSource" ref="dataSource" />
    </bean>
    </beans>

    上述XML配置文件指示IoC容器创建3个JavaBean组件,并把id为dataSource的组件通过属性dataSource(即调用setDataSource()方法)注入到另外两个组件中。

    在Spring的IoC容器中,我们把所有组件统称为JavaBean,即配置一个组件就是配置一个Bean。

依赖倒置原则(DIP)

它转换了依赖,高层模块不依赖于低层模块的实现,而低层模块依赖于高层模块定义的接口。通俗的讲,就是高层模块定义接口,低层模块负责实现。

高层模块不应依赖于低层模块,两者应该依赖于抽象。

抽象不应该依赖于具体,具体应该依赖于抽象

  • 依赖无倒置(低层模块定义接口,高层模块负责实现)

    img

    从上图中,我们发现高层模块的类依赖于低层模块的接口。因此,低层模块需要考虑到所有的接口。如果有新的低层模块类出现时,高层模块需要修改代码,来实现新的低层模块的接口。这样,就破坏了开放封闭原则。

  • 依赖倒置(高层模块定义接口,低层模块负责实现)

    img

    在这个图中,我们发现高层模块定义了接口,将不再直接依赖于低层模块,低层模块负责实现高层模块定义的接口。这样,当有新的低层模块实现时,不需要修改高层模块的代码。

DIP是一种 软件设计原则,它仅仅告诉你两个模块之间应该如何依赖,但是它并没有告诉如何做。IoC则是一种 软件设计模式,它告诉你应该如何做,来解除相互依赖模块的耦合。

AOP(Aspect Oriented Programming)面向切面编程

出现原因: 比如某个业务类的CRUD方法, 每个方法都需要进行一些安全检查, 这会造成大量重复的代码. AOP的思想就是将这些重复代码视作切面