前言
Guide的文章面试被问了几百遍的 IoC 和 AOP ,还在傻傻搞不清楚?写的很容易理解,根据他的思路总结一下.
1. IOC理解
在Spring中我们经常提到的IOC并不是一个技术实现,而是一种设计理念.描述的是:Java 开发领域对象的创建以及管理的问题。
1.1 定义
IOC(Inversion of control)叫做控制反转.
控制
:是指对象的创建和管理的权利.
反转
:将这种权利交给外部环境(框架或容器).
1.2 优势
- IOC减少了对象之间的耦合度(不需要我们自己在一个类里面写创建另外类的方法)
- 资源容易管理.(很容易维护一个单例对象)
1.3 DI
DI(Dependency Injection)就是依赖注入,是控制反转思想在Spring中实现.大致说下原理,
- 首先创建IOC容器ApplicationContext(区别于BeanFactory容器),
- 根据XML元数据创建Bean放置到IOC容器中的Map中
- 如果Bean出现相互依赖的情况时,优先创建被依赖的Bean
- 如果出现循环依赖的情况,先调用无参的构造方法创建对象,然后将对象存储在三级缓存中,然后调用set赋值,来解决循环依赖.
- 当然也可以通过注解实现Bean的创建,被注解Component修饰,这个类就会被创建为Bean并被托管.scope修改bean的作用范围.
- 然后每次请求容器的时候,根据Bean的名字或者类型实现注入.
2. AOP的理解
AOP(Aspect oriented programming)面向切面编程式OOP面向对象编程的延续.
2.1 AOP的理解
AOP 为什么叫面向切面编程
切 :指的是横切逻辑,原有业务逻辑代码不动,只能操作横切逻辑代码,所以面向横切逻辑
面 :横切逻辑代码往往要影响的是很多个方法,每个方法如同一个点,多个点构成一个面。这里有一个面的概念
在Java中通过继承来实现去除重复代码,实现垂直纵向精简.但是在同一类中的不同方法也可能存在大量的重复逻辑,可以理解为横向代码重复.所有这些重复的代码可以成为一个个的点,无数的点汇聚成一个面.所以需要将这些重复的代码单独取出来.横向的重复代码的场景有:日志,权限校验,事务控制.
2.2 AOP的优势
AOP可以在不改变原有业务逻辑的情况下,提出横切逻辑代码,根本上解耦合,避免横切逻辑代码重复。