Spring AOP初级入门-关于唠叨的

来源:互联网 发布:淘宝香港代购 编辑:程序博客网 时间:2024/05/20 03:45

先简单唠叨几句:
诶,最近一周研究Spring AOP的切面功能,说实话大家写的都可以(其实还好吧~),但是面对一个小白的不能在小白的来说,代码即使调试成功了,但是不明白其中的缘由,着实让人郁闷。本着对学习认真负责的态度,根据最近的学习资料,整理一番,与君共勉。

什么是AOP(东西是从别处盗来的):
一、概念
AOP(Aspect Oriented Programming):面向切面编程。
面向切面编程(也叫面向方面编程),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

一些必要的知识点
我觉得反倒是代码的顺序。
以下内容摘自:http://blog.csdn.net/wangpeng047/article/details/8556800
1. 切面(Aspect)
官方的抽象定义为“一个关注点的模块化,这个关注点可能会横切多个对象”“切面”在ApplicationContext.xml中来配置。
注解中配置:

 <!-- 使用@Aspectj 注解来切面  start--> <aop:aspectj-autoproxy proxy-target-class="true" />

xml配置(大概配置):

<aop:config>        <!-- 配置切面类 -->        <aop:aspect id="myAspect" ref="logAspect">            <!-- 配置切入点 -->            <aop:pointcut id="logServer" expression="execution(* com.udbac.controller.*Controller.*(..))" />            <!-- 配置advice stard -->            <aop:before method="before" pointcut-ref="logServer"/><!-- 前置通知 -->            <aop:after-returning method="afterReturning" pointcut-ref="logServer"/><!-- 后置通知 -->            <!-- 配置advice end -->        </aop:aspect>    </aop:config>

2.连接点(Joinpoint)
程序执行过程中的某一行为,调用方法或者抛出异常等行为。
3. 通知(Advice)

“切面”对于某个“连接点”所产生的动作,例如,对某个包下所有类的方法进行日志记录的动作就是一个Advice。其中,一个“切面”可以包含多个“Advice”,Advice共有如下5种类型:

A 前置通知(Before advice) :在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。xml中在里面使用元素进行声明;注解中使用@Before声明。

B 后通知(After advice) :当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。xml中在里面使用元素进行声明。抛出异常时,doAfter方法仍然执行。注解中使用@After声明。

C 返回后通知(After return advice) :在某连接点正常完成后执行的通知,不包括抛出异常的情况。xml中在里面使用元素进行声明。注解中使用@AfterReturning声明;

D 环绕通知(Around advice) :包围一个连接点的通知,类似Web中Servlet规范中的Filter的doFilter方法。可以在方法的调用前后完成自定义的行为,也可以选择不执行。xml中在里面使用元素进行声明。注解中使用@Around声明。

E 抛出异常后通知(After throwing advice) : 在方法抛出异常退出时执行的通知。xml中在里面使用元素进行声明。注解中使用@AfterThrowing声明。

通知执行顺序:前置通知→环绕通知连接点之前→连接点执行→环绕通知连接点之后→返回通知→后通知
4. 切入点(Pointcut)

匹配连接点的断言,在AOP中通知和一个切入点表达式关联。例如,ApplicationContext.xml中的所有通知所关注的连接点,都由切入点表达式来决定。

● 切入点表达式

execution:用于匹配方法执行的连接点;

within:用于匹配指定类型内的方法执行;

this:用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配;注意this中使用的表达式必须是完整类名,不支持通配符;

target:用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配;注意target中使用的表达式必须是完整类名,不支持通配符;

args:用于匹配当前执行的方法传入的参数为指定类型的执行方法;参数类型列表中的参数必须是完整类名,通配符不支持;args属于动态切入点,这种切入点开销非常大,非特殊情况最好不要使用;

@within:用于匹配所以持有指定注解类型内的方法;注解类型也必须是完整类名;

@target:用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解;注解类型也必须是完整类名;

@args:用于匹配当前执行的方法传入的参数持有指定注解的执行;注解类型也必须是完整类名;

@annotation:用于匹配当前执行方法持有指定注解的方法;注解类型也必须是完整类名;

bean:Spring AOP扩展的,AspectJ没有对于指示符,用于匹配特定名称的Bean对象的执行方法;

reference pointcut:表示引用其他命名切入点,只有注解风格支持,XML风格不支持。

二、用途
日志记录,性能统计,安全控制,权限管理,事务处理,异常处理,资源池管理。

关于我要唠叨的内容:
其实,分别可以使用Pointcut、Advice、Advisor接口来描述切点、增强、切面。而我要唠叨的是使用@AdpectJ注解来进行切点(Spring aop可以通过xml文件来配置实现,也可以通过对AspectJ对AOP实现,Spring中对AspectJ也有很好的支持,所以我要写的就是通过Spring 中的Aspectj来实现AOP,注意的是,xml和@Aspectj实现方式差别主要在是否配置上,所以各自的代码逻辑不通,不要搞混了,我之前没有完成的知识结构的时候就走错很多弯路,把两者的代码弄混淆了)。

Spring 可以使用Aspectj来进行注解,从而进行切面,@Aspect是编译期的AOP,它的运行还是纯的Spring aop,对Aspectj本身无依赖.
@Aspectj切面使用@Aspectj注解配置,任何拥有@Aspectj的任何类(bean)都将会被Spring自动识别并应用
用@Aspectj注解的类可以有方法和字段等,他们也可能包括切入点(pointcut),通知(Advice)和引入(introduction)声明

@Aspectj注解是不能通过类路径自动检测发现的,所以需要配合使@Component注释或者在xml中配置,例如:
xml中:

<!--AOP  使用的切面类 --><bean id="logAspect" class="com.udbac.util.aop.LogAspectN"></bean>

类中配置:

​    ​package com.udbac.xxx.xxx.TestAspect;    @Aspect    @Component    ​public class TestAspect{      ​...    }

其实,如果一个类中的@Aspectj注解表示它为一个切面,并且将自己从自动代理中排除。怎么理解这句话。说白了就是一个包下(包括子包)有很多个类,使用@Aspectj注解的类不会被扫描处理,避免进入死循环。

唠叨的内容就是基本概念以及利用XML或@Aspectj注解怎么配置,具体代码会在下一篇博客中写出。

1 0
原创粉丝点击