天天看点

【spring框架】AOP的Annotation实现(上)

使用annotation来实现aop的动态代理:

@aspectj支持

@aspectj使用了java 5的注解,可以将切面声明为普通的java类。@aspectj样式在aspectj 5发布的aspectj project部分中被引入。spring 2.0使用了和aspectj 5一样的注解,并使用aspectj来做切入点解析和匹配。但是,aop在运行时仍旧是纯的spring aop,并不依赖于aspectj的编译器或者织入器(weaver)。 

使用aspectj的编译器或者织入器的话就可以使用完整的aspectj语言,我们将在第 6.8 节 “在spring应用中使用aspectj”中讨论这个问题。

6.2.1. 启用@aspectj支持

为了在spring配置中使用@aspectj切面,你首先必须启用spring对@aspectj切面配置的支持,并确保自动代理(autoproxying)的bean是否能被这些切面通知。自动代理是指spring会判断一个bean是否使用了一个或多个切面通知,并据此自动生成相应的代理以拦截其方法调用,并且确保通知在需要时执行。 

通过在你的spring的配置中引入下列元素来启用spring对@aspectj的支持:

<aop:aspectj-autoproxy/>

需要的jar包:aspectjrt.jar、aspectjweaver.jar

需要加新的命名空间:

beans.xml:

实验:

需要加在前面的代理类loginterceptor:

测试:

结果:

method start

add success!!

原理:

首先spring会通过

去按照注解@component注解去找相应的bean,在找loginterceptor的时候,它发现这个类还是一个@aspect,也就是说这个是个切面逻辑,可以把它切到其它的方法上面去,那么它怎么往里切呢?他发现了你用@before定义了一下,在这个execution指定的方法执行之前(execution方法、属性、类)去执行下面定义的方法。

execution可以指定在任何方法上,userdaoimpl自己的业务逻辑不会受任何影响,它甚至不知道有新的逻辑切入进来了,这就保证了userdaoimpl业务逻辑的纯洁性。

下面介绍一些专业术语:

关于spring的aop的一些专业术语:

1.joinpoint:

连接点、切入点

就是说在哪些点上把切面逻辑加进去(比如在save方法之前)

2.pointcut:

切入点的集合

我们可以一下定好多切入点

例如:在com.xyz.someapp.service任何类的任何方法切入

@pointcut("execution(* com.xyz.someapp.service.*.*(...))")

public voidbussinessservice(){}

3.aspect(切面):

前面我们写的loginterceptor切面类里面有好多方法加到不同的被代理的对

象上面去,这就是那个切面。也就是加@aspect注解的类。

4.advice:

在加入的那个点上的"建议",与aspect意思有些重合。

可以这样理解,aspect是个"面",而advice是那个"面"的逻辑

就是在你要代理的方法上加"@before或@after等逻辑"

5.target:

被代理对象

把我们的业务逻辑"织入"到哪个对象上面去

6.weave:

织入。

和织布机一样,横排的织完,竖排的再去织,这时候就像业务逻辑切进去一样,被织入进去了。

转载请注明出处:http://blog.csdn.net/acmman/article/details/44344193