关于AOP的介绍,简单一句面向切面编程肯定是不够的,虽然这确实是他相对于OOP的地方。
AOP,具体来介绍,就是将无关于业务逻辑的代码抽离出来,完成代码的解耦,关注于切面。如此便可以在不修改源码的情况下对程序进行增强:日志记录、事务管理、性能监控。(AOP的底层使用了动态代理的机制)
AOP有几个关键的点:一、切入的拦截是谁?在Spring中切入的对象只有方法;二、对哪一类对象进行拦截?三、增强/通知:对于拦截到的方法需要做的事,一共有五种类型的通知:前置通知:在拦截到的方法执行前,后置通知:在拦截到的方法执行后,环绕通知:在拦截到的方法执行前后都执行,异常通知:在方法抛出异常时执行,最终通知:无论该方法是否抛出异常都执行。四、拦截的方法属于哪个对象?五、什么是切面?切面就是通知与拦截到方法的结合。
以上五点就是我们AOP编程需要关注的点以及深入研究的点。
接下来我们开始编写简单的SpringAop实例。
首先需要肯定的是,无论是通知类,还是被拦截方法的类,都必须是Spring容器中的bean,然后才能通过设置通知类型,和拦截点位置,以及通知类中的方法,才能组成一个切面。
在前文中,我们通过注解扫描,将所有的lfq.ima包下的类扫描进入Spring容器,如此我们便开始aop基于xml的编程,代码如下:
<context:component-scan base-package="lfq.ima"></context:component-scan>再需要构建一个通知类,以及通知类中需要执行的方法:
@Component("beforeBean")
public class BeforeBean {
public void before()
{
System.out.println("before");
}
} 再然后,开始核心配置文件的编写,先上代码:<aop:config>
<aop:pointcut expression="execution(* lfq.ima.*.say())" id="point"/>
<aop:aspect ref="beforeBean">
<aop:after-returning method="before" pointcut-ref="point"/>
</aop:aspect>
</aop:config>
最外头有一个aop:config标签,顾名思义aop的配置。
再里头有两个核心,一个是切入点,这个我们需要写出拦截的方法“类型”,也就是一类的方法。如上文:execution(* lfq.ima.*.say())表示在任何返回类型下,lfq.ima中的所有类的say()方法作为切入点。需要注意的是*表示所有,也可以表示部分替代,如,上文也可以写成:execution(* lfq.im*.*.say())表示对如何lfq.im+任意字符的包底下的类进行进一步切入点查找。还有,..表示任意参数,*加上..可以完成所有的切入点描述了。
另外一个核心就是切面的编写了,现在我们已经得到的有切入点类型,和通知类的bean,两者组合我们便可得到切面,一共有之前所说的五种类型的通知。这里我们以最终通知为例,先给一个大标签,aop:aspect标签(切面标签),里面就可以配置我们的通知类型了,切面标签中的ref中填写切面类的引用。
再说切面类型标签,后置通知由aop:after-returning,顾名思义,method填写切面类中要执行的方法,pointcut-ref引用我们之前编写的切入点id。
如此一来,简单的aop编写就完成了,执行效果如下:

总结一下,其实xml文件编写是和我们aop思想是一致的,第一步:将所有对象放入容器,接下来就可以写aop的配置了,对应着aop-config的编写;第二步:再获取切入点,对应着aop-config中aop:pointcut的编写;第三步:有了切入点以及通知类,就可以编写切面了,对应着aop:aspect的编写,再就是通知的类型,配置于切面之中,对应着aop:aspect中aop:after-returning的编写(注:意味着一个切面类中可以编写多个通知,切入多个点)。
本文介绍了面向切面编程(AOP)的基本概念,并通过一个具体的Spring AOP实例详细讲解了如何利用Spring框架实现AOP编程。从配置切入点、定义通知类到创建切面,一步步解析AOP的工作原理。
2040

被折叠的 条评论
为什么被折叠?



