Spring入门AOP(一)

本文介绍了面向切面编程(AOP)的基本概念,并通过一个具体的Spring AOP实例详细讲解了如何利用Spring框架实现AOP编程。从配置切入点、定义通知类到创建切面,一步步解析AOP的工作原理。

    关于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的编写(注:意味着一个切面类中可以编写多个通知,切入多个点)。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值