使用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