spring的IOC和AOP的理解(面试题目)
首先什么是IOC呢?
IOC(Inversion of control)控制反转。它是一种设计思想而不是一个技术实现,描述的是Java开发领域对象的创建以及管理的问题。
例子:现有一个类A依赖类B
- 如果按照传统的开发方式的话:往往是在类A手动通过new关键字来new一个B的对象出来;
- 使用Ioc思想的开发方式: 不通过new关键字来创建对象了,而是通过Ioc容器(Spring框架)来帮助我们实例化对象。我们需要哪个对象,直接从Ioc容器里面找即可了。
从这上面的例子,可以更好的理解Ioc的控制反转的意思,即我们丧失了一个权力(创建、管理对象的权力),从而得到了一个好处(不用再考虑对象的创建、管理等一系列的事情了)。
控制: 指的是 对象创建(实例化、管理)的权力;
反转: 控制权交给外部环境(spring 框架、IOC容器)
通过第三方容器来管理资源这样的好处是什么呢?
- 对象之间的耦合度或者说依赖程度就降低;
- 资源变得很容易管理;比如用spring容器提供的话就很容易实现一个单例;
那么Ioc和DI呢?
Ioc(Inversion of Controller:控制反转)是一种设计思想,将原本在程序中手动创建对象的控制权,交由spring 框架来管理。Ioc容器是spring用来实现Ioc的载体,Ioc容器实际上就是个Map(key,value), Map中存放的是各种对象。Ioc最常见以及最合理的实现方式就是依赖注入(Dependency Injection,DI).
那么什么是AOP呢?
AOP:Aspect oriented programming面向切面编程,AOP是OOP面向对象编程的一种延续。
举例来理解:
例子:现有三个类,Horse
、Pig
、Dog
通过 OOP 思想中的继承,我们可以提取出一个 Animal 的父类,然后将 eat 和 run 方法放入父类中,Horse
、Pig
、Dog
通过继承Animal
类即可自动获得 eat()
和 run()
方法。这样将会少些很多重复的代码。
OOP 编程思想可以解决大部分的代码重复问题。但是有一些问题是处理不了的。比如在父类 Animal 中的多个方法的相同位置出现了重复的代码,OOP 就解决不了。
/**
* 动物父类
*/
public class Animal {
/** 身高 */
private String height;
/** 体重 */
private double weight;
public void eat() {
// 性能监控代码
long start = System.currentTimeMillis();
// 业务逻辑代码
System.out.println("I can eat...");
// 性能监控代码
System.out.println("执行时长:" + (System.currentTimeMillis() - start)/1000f + "s");
}
public void run() {
// 性能监控代码
long start = System.currentTimeMillis();
// 业务逻辑代码
System.out.println("I can run...");
// 性能监控代码
System.out.println("执行时长:" + (System.currentTimeMillis() - start)/1000f + "s");
}
}
这部分重复的代码,一般统称为横切逻辑代码。
横切逻辑代码存在的问题:
- 代码重复问题;
- 横切逻辑代码和业务代码混杂在一起,代码臃肿,不易维护;
AOP就是用来解决这些问题的
AOP提出横向抽取机制,将横切代码和业务逻辑代码分离。
总之:AOP主要用来解决:在不改变原有业务逻辑的情况下, 增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复。