原文地址: https://gyl-coder.top/spring/spring-IOC-AOP /
本文从以下几个问题来介绍IoC AOP
什么是国际奥委会? IoC解决了什么问题? IoC和DI有什么区别? 什么是AOP? AOP解决了什么问题? AOP为什么被称为面条编程? 首先,IoC AOP不是Spring提出的,在Spring之前就已经存在了,但是当时更偏向理论。 Spring在技术水平上很好地实现了这两种思想。
什么是 IoC
IOC(inversionofcontrol )控制反转/反转控制。 那是思想,不是技术的实现。 介绍Java开发域对象的创建和管理问题。例如,现有的a类依赖于b类
以往的开发方法:在大多数情况下,在a类中是用new关键字new一个b对象,使用IoC思想的开发方法。 不是用new关键字创建对象,而是用IoC容器(Spring框架)帮助实例化对象。 我们需要哪个对象,直接通过IoC容器就可以了。 从以上两种开发方式的对比来看,我们“失去了一个权力”(创建、管理对象的权力),从而获得了一个好处)。
为什么叫控制反转
控件:创建(实例化、管理)对象的权限反转:将控制交给外部环境(Spring框架、IoC容器) )。
IoC 解决了什么问题
IoC的思想是,双方互不依赖,由第三方容器管理相关资源。 这样有什么好处?对象之间的耦合度或依赖度降低,资源的管理变得容易。例如,通过Spring容器提供就可以简单地实现一个例子。 例如,针对现有用户的操作是利用服务和Dao的2层结构开发的
如果不使用IoC思想,则如果Service层要使用Dao层的具体实现,则需要使用new关键字向UserServiceImpl提交IUserDao的具体实现类UserDaoImpl (直接在new上提交new接口类)
完美。 这个方法也可以实现,但请想象以下场景。
开发中突然受到新的需求,针对IUserDao接口开发了另一个具体的实现类。 由于服务器层依赖于IUserDao的具体实现,因此需要修改UserServiceImpl的new对象。 如果只有一个类引用了IUserDao的具体实现,您可能会觉得没问题,但修改起来并不费力。 但是,如果很多地方引用了I-userdao的具体实现,那么I-userdao的实现方式需要更改的话,修改就会非常头疼。
运用IoC的思想,我们将对象的控制权(创建、管理)交给IoC容器进行管理。 我们使用时直接向IoC集装箱“要”就行了
IoC 和 DI 别再傻傻分不清楚
IOC (控制反转) )是一种设计思想或某种模式。 该设计思想是将原本通过程序手动创建的对象的控制权交给Spring框架进行管理。 IoC在其他语言中也有使用,并非Spring特有。 IoC容器是Spring实现IoC的载体,IoC容器实际上是Map(key,value ),map中存储着各种对象。IoC最常见合理的实现方式被称为依赖注入(Dependency Injection,简称DI )。
而且,友好的冰淇淋(Martin Fowler )在一篇文章中提到了将IoC改名为DI。 原文如下,原文地址为https://martinf
owler.com/articles/injection.html 。友好的冰淇淋的大概意思是 IoC 太普遍并且不表意,很多人会因此而迷惑,所以,使用 DI 来精确指名这个模式比较好。
什么是 AOP
AOP:Aspect oriented programming 面向切面编程,AOP 是 OOP(面向对象编程)的一种延续。
下面我们先看一个 OOP 的例子。
例如:现有三个类,Horse、Pig、Dog,这三个类中都有 eat 和 run 两个方法。
通过 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 解决了什么问题
通过上面的分析可以发现,AOP 主要用来解决:在不改变原有业务逻辑的情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复。
AOP 为什么叫面向切面编程
切 :指的是横切逻辑,原有业务逻辑代码不动,只能操作横切逻辑代码,所以面向横切逻辑
面 :横切逻辑代码往往要影响的是很多个方法,每个方法如同一个点,多个点构成一个面。这里有一个面的概念