IOC AOP
IOC AOP
IOC-控制反转(Inversion of Control)
为了降低对象之间的耦合度, 实现解耦
IOC容器去控制对象bean的生命周期, 而不是对象的使用者
不需要对象的使用者去创建对象, 赋予各种属性, 而是由IOC容器去做, 对象的使用者直接把对象拿来用
控制反转是目的, 手段是依赖注入(DI)(Dependency Injection)
对象之间不在相互依赖, 通过一个第三方实现解耦
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)
它转换了依赖,高层模块不依赖于低层模块的实现,而低层模块依赖于高层模块定义的接口。通俗的讲,就是高层模块定义接口,低层模块负责实现。
高层模块不应依赖于低层模块,两者应该依赖于抽象。
抽象不应该依赖于具体,具体应该依赖于抽象
依赖无倒置(低层模块定义接口,高层模块负责实现)
从上图中,我们发现高层模块的类依赖于低层模块的接口。因此,低层模块需要考虑到所有的接口。如果有新的低层模块类出现时,高层模块需要修改代码,来实现新的低层模块的接口。这样,就破坏了开放封闭原则。
依赖倒置(高层模块定义接口,低层模块负责实现)
在这个图中,我们发现高层模块定义了接口,将不再直接依赖于低层模块,低层模块负责实现高层模块定义的接口。这样,当有新的低层模块实现时,不需要修改高层模块的代码。
DIP是一种 软件设计原则,它仅仅告诉你两个模块之间应该如何依赖,但是它并没有告诉如何做。IoC则是一种 软件设计模式,它告诉你应该如何做,来解除相互依赖模块的耦合。
AOP(Aspect Oriented Programming)面向切面编程
出现原因: 比如某个业务类的CRUD方法, 每个方法都需要进行一些安全检查, 这会造成大量重复的代码. AOP的思想就是将这些重复代码视作切面