本文从以下几个问题介绍了IoC AOP

什么是IoC? IoC解决了什么问题? IoC和DI有什么区别? 什么是AOP? AOP解决了什么问题? AOP为什么叫面条编程? 首先,IoC AOP不是Spring提出的,它在Spring之前就已经存在,但当时更偏重理论。 Spring在技术层面很好地实现了这两个思想。

什么是IOC IOC (反转控制)控件的反转/反转控制? 那是思想,不是技术的实现。 Java开发领域对象的创建以及管理的问题

例如,现有的a类依赖于b类

http://www.Sina.com/: IOC,而不是在a类中使用new关键字新建一个b对象,然后使用3358www.Sina.com/:new关键字创建对象我们需要哪个对象,直接通过IoC容器就可以了。

从以上两种开发方式的对比来看,我们可以不考虑“失去了一个权力”(通过创建、管理对象的权力)来创建、管理对象(也获得了一个好处)等一系列事情) )。

为什么称为控件反向传统的开发方式:指创建对象实例化管理的权限

使用 IoC 思想的开发方式:控制权位于外部环境(Spring框架、IoC容器) ) ) )。

IoC解决了什么问题,IoC的思想是两者之间不相互依存,由第三方容器管理相关资源。 这样有什么好处?

对象之间的结合度或依赖度降低

资源的管理变得容易。例如,通过Spring容器提供,可以简单地实现一个例子。

例如,现有的面向用户的操作是利用Service和Dao这两层结构开发的

如果未使用IoC思想,则当服务层尝试使用Dao层的具体实现时,必须使用new关键字在UserServiceImpl中找到IUserDao的具体实现类UserDaoImpl (直接在new上找到new接口类

很完美。 这个方法也可以实现,但请想象以下场景。

在开发过程中突然受到新的需求,为IUserDao接口开发了另一个具体的实现类。 由于服务器层依赖于IUserDao的具体实现,因此需要修改UserServiceImpl中new的对象。 如果只有一个类引用了IUserDao的具体实现,你可能会觉得没问题,但修改起来并不费力。 但是,如果很多地方引用了IUserDao的具体实现,那么如果需要更改IUserDao的实现方式,修改起来就会非常头疼。

运用IoC思想,我们将对象的控制权(创建、管理)传递给IoC容器进行管理。 我们使用的时候直接向IoC容器“要”就可以了

IoC与DI的差异IoC (控制反相)为控制或某种模式。反转IoC在其他语言中也有使用,并非Spring特有的设计思想。设计思想

IoC最常见合理的实现方式称为依赖注入(Dependency Injection,简称DI )。

IOC和DI描述了相同的内容(实例化对象和保持依赖关系),但只是角度不同。

反转控制(IOC )控制反转/反转控制。 站在对象的角度,对象的实例化和管理权限(反转)传递给了容器。

从属注入(di )依赖于注入。 站在容器的立场上,容器注入(送入)对象所依赖的其他对象。 例如,由于在对象a实例化期间声明了b型属性,因此容器需要将b对象注入a中。

AOPAOP是什么:面向aspectorientedprogramming切面编程,AOP是一种面向对象编程(OOP )。

我们先来看看OOP的例子。

例如,现有的三个类: Horse、Pig和Dog,这三个类有两种方法: eat和run。

通过继承OOP思想,可以提取Animal的父类,并将eat和run方法放入父类中。 Horse、Pig和Dog可以通过继承Animal类自动获取eat ()和run () )方法。 这将减少重复的代码。

原始设备制造商

编程思想可以解决大部分的代码重复问题。但是有一些问题是处理不了的。比如在父类 Animal 中的多个方法的相同位置出现了重复的代码,OOP 就解决不了。

/** * 动物父类 */public class Animal {<span class=”token comment”>/** 身高 */</span><span class=”token keyword”>private</span> String height<span class=”token punctuation”>;</span><span class=”token comment”>/** 体重 */</span><span class=”token keyword”>private</span> <span class=”token keyword”>double</span> weight<span class=”token punctuation”>;</span><span class=”token keyword”>public</span> <span class=”token keyword”>void</span> <span class=”token function”>eat</span><span class=”token punctuation”>(</span><span class=”token punctuation”>)</span> <span class=”token punctuation”>{<!– –></span> <span class=”token comment”>// 性能监控代码</span> <span class=”token keyword”>long</span> start <span class=”token operator”>=</span> System<span class=”token punctuation”>.</span><span class=”token function”>currentTimeMillis</span><span class=”token punctuation”>(</span><span class=”token punctuation”>)</span><span class=”token punctuation”>;</span> <span class=”token comment”>// 业务逻辑代码</span> System<span class=”token punctuation”>.</span>out<span class=”token punctuation”>.</span><span class=”token function”>println</span><span class=”token punctuation”>(</span><span class=”token string”>”I can eat…”</span><span class=”token punctuation”>)</span><span class=”token punctuation”>;</span> <span class=”token comment”>// 性能监控代码</span> System<span class=”token punctuation”>.</span>out<span class=”token punctuation”>.</span><span class=”token function”>println</span><span class=”token punctuation”>(</span><span class=”token string”>”执行时长:”</span> <span class=”token operator”>+</span> <span class=”token punctuation”>(</span>System<span class=”token punctuation”>.</span><span class=”token function”>currentTimeMillis</span><span class=”token punctuation”>(</span><span class=”token punctuation”>)</span> <span class=”token operator”>-</span> start<span class=”token punctuation”>)</span><span class=”token operator”>/</span><span class=”token number”>1000f</span> <span class=”token operator”>+</span> <span class=”token string”>”s”</span><span class=”token punctuation”>)</span><span class=”token punctuation”>;</span><span class=”token punctuation”>}</span><span class=”token keyword”>public</span> <span class=”token keyword”>void</span> <span class=”token function”>run</span><span class=”token punctuation”>(</span><span class=”token punctuation”>)</span> <span class=”token punctuation”>{<!– –></span> <span class=”token comment”>// 性能监控代码</span> <span class=”token keyword”>long</span> start <span class=”token operator”>=</span> System<span class=”token punctuation”>.</span><span class=”token function”>currentTimeMillis</span><span class=”token punctuation”>(</span><span class=”token punctuation”>)</span><span class=”token punctuation”>;</span> <span class=”token comment”>// 业务逻辑代码</span> System<span class=”token punctuation”>.</span>out<span class=”token punctuation”>.</span><span class=”token function”>println</span><span class=”token punctuation”>(</span><span class=”token string”>”I can run…”</span><span class=”token punctuation”>)</span><span class=”token punctuation”>;</span> <span class=”token comment”>// 性能监控代码</span> System<span class=”token punctuation”>.</span>out<span class=”token punctuation”>.</span><span class=”token function”>println</span><span class=”token punctuation”>(</span><span class=”token string”>”执行时长:”</span> <span class=”token operator”>+</span> <span class=”token punctuation”>(</span>System<span class=”token punctuation”>.</span><span class=”token function”>currentTimeMillis</span><span class=”token punctuation”>(</span><span class=”token punctuation”>)</span> <span class=”token operator”>-</span> start<span class=”token punctuation”>)</span><span class=”token operator”>/</span><span class=”token number”>1000f</span> <span class=”token operator”>+</span> <span class=”token string”>”s”</span><span class=”token punctuation”>)</span><span class=”token punctuation”>;</span><span class=”token punctuation”>}</span>

}

123456789101112131415161718192021222324252627282930313233

这部分重复的代码,一般统称为 横切逻辑代码

横切逻辑代码存在的问题:

代码重复问题横切逻辑代码和业务代码混杂在一起,代码臃肿,不变维护

AOP 就是用来解决这些问题的

AOP 另辟蹊径,提出横向抽取机制,将横切逻辑代码和业务逻辑代码分离

代码拆分比较容易,难的是如何在不改变原有业务逻辑的情况下,悄无声息的将横向逻辑代码应用到原有的业务逻辑中,达到和原来一样的效果。

AOP 解决了什么问题

通过上面的分析可以发现,AOP 主要用来解决:在不改变原有业务逻辑的情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复。

AOP 为什么叫面向切面编程

:指的是横切逻辑,原有业务逻辑代码不动,只能操作横切逻辑代码,所以面向横切逻辑

:横切逻辑代码往往要影响的是很多个方法,每个方法如同一个点,多个点构成一个面。这里有一个面的概念