spring学习第一篇:控制反转(IOC)或依赖注入(DI)和面向切面编程(AOP)

spring相关的书和博文看了很多,一直也没明白依赖注入和面向切面编程到底是什么,spring企业实战看到第三遍突然恍然大悟,也许是因为之前动手写过代码,所以终于潜移默化,慢慢理解了吧。

http://www.360doc.com/content/18/0125/09/27831725_724899826.shtml这篇文章写得挺好的

首先控制反转和面向切面编程是spring的核心机制,由于控制反转不好理解,因此有人提出依赖注入的概念,其实依赖注入是控制反转的一种方式,但现在大家默认控制反转等同于依赖注入

一.控制反转:控制反转是指spring容器通过依赖注入的方式使得创建依赖对象的控制权由对象转移到spring容器。举个例子:

我们有一个明星,要举办演唱会,在他唱歌之前有记者要采访他,通常我们的做法是创建一个明星类,在明星类里面new一个记者类,或者将记者类作为构造器的参数传入。如下图所示

spring学习第一篇:控制反转(IOC)或依赖注入(DI)和面向切面编程(AOP)_第1张图片

在这里对象依赖的对象是由自己创建的。使用spring之后,reporter对象不再由superStar来创建而是交给spring容器来创建和管理,如下图:

spring学习第一篇:控制反转(IOC)或依赖注入(DI)和面向切面编程(AOP)_第2张图片

我们在spring的配置文件中配置superstar和reporter两个bean,并把reporter注入到supers中,这样我们在superStard对象中不需要再自己去new一个reporter了,spring容器会帮我们创建。这就是控制反转,对象依赖ioc容器注入依赖的对象。实现解耦合。

spring学习第一篇:控制反转(IOC)或依赖注入(DI)和面向切面编程(AOP)_第3张图片

二.面向切面编程

面向切面编程有几个术语需要理解:(来自百度百科)

1)aspect(切面):实现了cross-cutting功能,是针对切面的模块。最常见的是logging模块,这样,程序按功能被分为好几层,如果按传统的继承的话,商业模型继承日志模块的话根本没有什么意义,而通过创建一个logging切面就可以使用AOP来实现相同的功能了。

2)jointpoint(连接点):连接点是切面插入应用程序的地方,该点能被方法调用,而且也会被抛出意外。连接点是应用程序提供给切面插入的地方,可以添加新的方法。比如以上我们的切点可以认为是findInfo(String)方法。

3)advice(处理逻辑):advice是我们切面功能的实现,它通知程序新的行为。如在logging里,logging advice包括logging的实现代码,比如像写日志到一个文件中。advice在jointpoint处插入到应用程序中。以上我们在MyHandler.java中实现了advice的功能

4)pointcut(切点):pointcut可以控制你把哪些advice应用于jointpoint上去,通常你使用pointcuts通过正则表达式来把明显的名字和模式进行匹配应用。决定了那个jointpoint会获得通知。

上面提到的例子中,记者在明星开场前进行采访,在明星演唱结束时报道,我们可以在superstar的singing方法前去调用reporter的interview方法,但我们发现这样我们的类会比较混乱,我们不希望在superstar的方法里看到reporter的方法,这时我们就需要面向切面编程AOP的帮忙了

我们可以将reporter配置成一个切面,通过配置的方式插入superstar中,完成采访任务,如下图:

spring学习第一篇:控制反转(IOC)或依赖注入(DI)和面向切面编程(AOP)_第4张图片

有很多理解不到位的地方,请大家指正,互相学习啊

你可能感兴趣的:(spring)