原来看过一本关于Spring的书《Spring 2.0宝典》,看完之后以为自己对Spring 2.0比较了解了,实际差的很远。最近看了InfoQ上的关于Spring 2.0新特性的文章后我才恍然大悟。下面结合我看Spring 2.0的开发参考手册和其它一些关于Spring 2.0的文章写一些我对于Spring 2.0新特性的理解。仅供参考。
本文结合Spring 2.0开发参考手册来讲解。对于手册中有的东西我就不说了,其实这样的话也剩下不了多少我能说的了,我只是谈一下我在看手册的时候比较费劲的地方和我对这些地方的理解。
首先@AspectJ并不是AspectJ,Spring AOP 框架支持@AspectJ只是说Spring支持用AspectJ注解的方式配置AOP。当然了,Spring 2.0也支持纯的AspectJ的应用,但这个不在本文的范围之内。
Spring 2.0开发参考手册的<6.2.>部分的内容是关于@AspectJ的。你可以看Springframework.org上的英文文档,这样你可以看到最最新的东西。蛙眼上也有中文版的,也是最新的,当然会比最最新的旧一点点点循环。虽然翻译过来的手册和英文原版的差别很小,但这并不意味着没有差别。像原版中的有绿叶标示的部分,翻译过来的就没有。虽然绿叶标示的部分你可能看的不大懂(有些东西我就看不明白555),不过你一旦看懂可能就会获益匪浅,而且原版的味道最正。所以如果你的英语水平够的话我还是推荐大家看原版的手册。好了不废话了。下面开门见山,步入正题。
要启用@AspectJ支持的话要在Spring配置文件中加入下面一句
接下来的工作基本上不用和配置文件打交道了。定义@Aspect、@Pointcut、Advice(@Before、@AfterReturning、@AfterThrowing、@After、@Around)都是在Java文件中进行的,而不再是XML配置文件了。注意前面有@的都是实实在在的注解。
虽然手册中这一部分的代码块很多,实际上可以分为两个类文件,一个是对Pointcut的定义,另一个是Advice的定义。我觉得合在一起也不是不行,但是如果那么做的话无论从视觉上还是逻辑上讲都是比较乱的。
无论是对Pointcut定义还是对Advice定义的类文件都要使用@Aspect注解。
对Pointcut的定义更像是写配置文件,因为里面没有任何的逻辑代码,仅仅是声明方法(当是要有大括号)。从手册中我们可以看到,Pointcut的定义代码分为两行,第一行是Pointcut Expression,即符合这个表达式的方法(在当前的Spring AOP中只有方法调用能被当作Pointcut)就被作为是这个Pointcut;第二行是什么呢?说白了就是这个Pointcut的名字,只不过这个名字是一个严格定义的Java方法而已(觉得有一点的别扭是不是,我是觉得有点别扭,但不是很厉害,这样配置也算好看,呵呵)。
光定义Pointcut是没有用的,还要定义相应的Advice(当然像事务性之类的应用你要使用框架提供的Advice,你接下来要做的是在Spring配置文件中做必要的配置,就像手册里举的那个Service层事务化的例子一样)。定义Advice时你要做的就是写出什么时候该调用什么方法。定义Advice也可以分为两部分(不是两行了),第一部分是告诉AOP框架什么时候执行这个Advice。有两种方法,一种是使用已经定义好的Pointcut的名字(就是那个像Java方法的名字);另一种方法是自己在定义一个Pointcut。似乎使用已经定义好的Pointcut时,方法名前面的包名是必须的,也挺麻烦的是吧,反正我觉得是。好了其他的关于Advice定义的东西我就不说了,自己看手册吧。
好了,就写到这了。手册这一部分的后面一块(6.2.5-6.2.7)看的不大懂,所以我就不说了。如果有谁看明白了可以回复哈。
本文结合Spring 2.0开发参考手册来讲解。对于手册中有的东西我就不说了,其实这样的话也剩下不了多少我能说的了,我只是谈一下我在看手册的时候比较费劲的地方和我对这些地方的理解。
首先@AspectJ并不是AspectJ,Spring AOP 框架支持@AspectJ只是说Spring支持用AspectJ注解的方式配置AOP。当然了,Spring 2.0也支持纯的AspectJ的应用,但这个不在本文的范围之内。
Spring 2.0开发参考手册的<6.2.>部分的内容是关于@AspectJ的。你可以看Springframework.org上的英文文档,这样你可以看到最最新的东西。蛙眼上也有中文版的,也是最新的,当然会比最最新的旧一点点点循环。虽然翻译过来的手册和英文原版的差别很小,但这并不意味着没有差别。像原版中的有绿叶标示的部分,翻译过来的就没有。虽然绿叶标示的部分你可能看的不大懂(有些东西我就看不明白555),不过你一旦看懂可能就会获益匪浅,而且原版的味道最正。所以如果你的英语水平够的话我还是推荐大家看原版的手册。好了不废话了。下面开门见山,步入正题。
要启用@AspectJ支持的话要在Spring配置文件中加入下面一句
- <aop:aspectj-autoproxy/>
接下来的工作基本上不用和配置文件打交道了。定义@Aspect、@Pointcut、Advice(@Before、@AfterReturning、@AfterThrowing、@After、@Around)都是在Java文件中进行的,而不再是XML配置文件了。注意前面有@的都是实实在在的注解。
虽然手册中这一部分的代码块很多,实际上可以分为两个类文件,一个是对Pointcut的定义,另一个是Advice的定义。我觉得合在一起也不是不行,但是如果那么做的话无论从视觉上还是逻辑上讲都是比较乱的。
无论是对Pointcut定义还是对Advice定义的类文件都要使用@Aspect注解。
对Pointcut的定义更像是写配置文件,因为里面没有任何的逻辑代码,仅仅是声明方法(当是要有大括号)。从手册中我们可以看到,Pointcut的定义代码分为两行,第一行是Pointcut Expression,即符合这个表达式的方法(在当前的Spring AOP中只有方法调用能被当作Pointcut)就被作为是这个Pointcut;第二行是什么呢?说白了就是这个Pointcut的名字,只不过这个名字是一个严格定义的Java方法而已(觉得有一点的别扭是不是,我是觉得有点别扭,但不是很厉害,这样配置也算好看,呵呵)。
Pointcut的定义
- @Pointcut("within(com.xyz.someapp.web..*)")
- public void inWebLayer() {}
光定义Pointcut是没有用的,还要定义相应的Advice(当然像事务性之类的应用你要使用框架提供的Advice,你接下来要做的是在Spring配置文件中做必要的配置,就像手册里举的那个Service层事务化的例子一样)。定义Advice时你要做的就是写出什么时候该调用什么方法。定义Advice也可以分为两部分(不是两行了),第一部分是告诉AOP框架什么时候执行这个Advice。有两种方法,一种是使用已经定义好的Pointcut的名字(就是那个像Java方法的名字);另一种方法是自己在定义一个Pointcut。似乎使用已经定义好的Pointcut时,方法名前面的包名是必须的,也挺麻烦的是吧,反正我觉得是。好了其他的关于Advice定义的东西我就不说了,自己看手册吧。
使用已经定义的Pointcut
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Before;
- @Aspect
- public class BeforeExample {
- @Before("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")
- public void doAccessCheck() {
- // ...
- }
- }
自己重新定义Pointcut
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Before;
- @Aspect
- public class BeforeExample {
- @Before("execution(* com.xyz.myapp.dao.*.*(..))")
- public void doAccessCheck() {
- // ...
- }
- }
好了,就写到这了。手册这一部分的后面一块(6.2.5-6.2.7)看的不大懂,所以我就不说了。如果有谁看明白了可以回复哈。