Spring 最核心最基础的两块东西,就是IOC和AOP,IOC控制反转的作用处处都能体现,但是aop好像没什么作用(大学期间一直这么理解的。。。),知道接触到了公司真正的项目时,才有了一些初步的见解,主要应用范围是日志的记录和缓存操作。

话不赘述直接上代码,普通的xml配置方式着实不够方便不够灵活,切点表达式用execution也是不够灵活的,实际工作中需要进行aop拦截的也许是分布在工程的各个地方,而不是单单只存在于某个包内。所以个人一直在使用的是@annotation()的方式,所有工作都是用注解来完成,只需要在Spring配置文件中(有MVC中的组件需要拦截的话也要在MVC配置文件中配置)配置代理开启和扫描aop切面类存在的包路径。




这也是网友做的测试。 自定义注解:Stat,AccessLog,SecurityLog。三者在切点匹配条件中用了或符号进行连接,无法直接作为参数传入通知方法中,但是如果使用与符号进行连接,则可以传入通知方法,如

至于或符号无法直接作为参数传入,我还不知道原因,猜测是若被拦截方法只存在其中一种或两种注解时,则通知方法中三个参数不能都匹配到具体的对象,所以会抛出异常吧,有知道原因的朋友欢迎告知。既然无法作为参数传入,但是还是需要根据注解的不同组合进行不同的实现,所以必须要获取到注解才行,个人是通过反射的方式获取到方法上存在的所有注解,再来进行操作,具体获取方式就在getAnnotations(pjp)方法中,具体实现如下





接下来是Spring配置文件


Spring文件也只需要这样简单的配置一下,aop只能拦截被Spring创建成bean的方法,第一行就是扫描包路径下需要被创建成bean的类,其余的就是扫描切面类和开启代理CGLIB。接下来就只要在你希望aop拦截的方法上加入自定义注解即可。