文章目录
IOC和AOP
1.什么是IOC?
IOC控制反转。它是一种思想而不是一种技术实现。
作用:Java开发领域对象的创建及管理的问题。
例如:现有类A依赖类B
- **传统的开发方式:**往往是在类A手动通过new关键字来new一个B对象出来
- **使用IOC思想的开发方式:**不通过new关键字来创建对象,而是通过IOC容器(spring框架)来帮助我们实例化对象。我们需要哪个对象,直接从IOC容器里面拿就行
总结:以上两种开发方式的对比来看:我们丧失一个权利(创建,管理对象的权利),从而等到一个好处(不用考虑对象的创建、管理的一系列的事情)
1.1为什么叫控制反转?
控制:指的是对象的创建的权力
反转:指的控制权交给外部环境(Spring框架、IOC容器)
2.IOC解决了什么问题?(有什么好处?)
IOC的思想就是双方之间不相互依赖,由第三方容器来管理相关资源。
- 对象之间的耦合度或者说依赖程度降低
- 资源变的容易管理:比如你用Spring容器提供的话很容易就实现一个单例
例子:现有一个针对User的操作,利用Service和Dao两层结构进行开发
在没有使用IOC思想的情况下,Service层想要使用Dao层,需要通过new关键字在UserServiceImpl中手动new出IUserDao的具体实现类UserDaoImpl
很完美,这种方式也是可以实现的,但是我们想象一下如下场景:
开发过程中突然接到一个新的需求,针对对IUserDao
接口开发出另一个具体实现类。因为 Server 层依赖了IUserDao
的具体实现,所以我们需要修改UserServiceImpl
中 new 的对象。如果只有一个类引用了IUserDao
的具体实现,可能觉得还好,修改起来也不是很费力气,但是如果有许许多多的地方都引用了IUserDao
的具体实现的话,一旦需要更换IUserDao
的实现方式,那修改起来将会非常的头疼。
使用 IoC 的思想,我们将对象的控制权(创建、管理)交有 IoC 容器去管理,我们在使用的时候直接向 IoC 容器 “要” 就可以了
3.IOC和DI的区别?
IOC是一种设计思想或者说是一种某种模式。这个设计思想就是将原本在程序中手动创建对象的控制权,交由Spring框架来管理,IOC在其他语言中也有应用,并非Spring特有**。IOC容器时Spring实现IOC的载体,IOC实际上就是一个Map(key,value),Map中存放的是各种对象**
IOC最常见以及最合理的实现方式叫依赖注入(简称DI)
4.什么是AOP?
AOP:面向切面编程,AOP是OOP(面向对象编程)的延续。
例子:现有三个类,Horse
、Pig
、Dog
,这三个类中都有 eat 和 run 两个方法。
通过 OOP 思想中的继承,我们可以提取出一个 Animal 的父类,然后将 eat 和 run 方法放入父类中,Horse
、Pig
、Dog
通过继承Animal
类即可自动获得 eat()
和 run()
方法。这样将会少些很多重复的代码。
OOP 编程思想可以解决大部分的代码重复问题。但是有一些问题是处理不了的。比如在父类 Animal 中的多个方法的相同位置出现了重复的代码,OOP 就解决不了。
5.AOP解决了什么问题?(有什么用?)
通过上面的分析可以发现,AOP主要用来解决:
在不改变原有业务逻辑的情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复
/**
* 动物父类
*/
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");
}
}
这部分重复的代码,一般统称为横切逻辑代码。
横切逻辑代码存在的问题:
- 代码重复问题
- 横切逻辑代码和业务代码混杂在一起,代码臃肿,不变维护
6.AOP为什么叫切面编程?
切:指的是横切逻辑,原有业务逻辑代码不动,只能操作横切逻辑代码,所以面向横切编程
面:横切逻辑代码往往影响的是很多个方法,每个方法如同一个点,多个点构成一个面。这里有一个面的概念