AspectJ:java社区里最完善最流行的AOP框架
- 在spring2.0以上的版本中,可以使用基于AspectJ注解或基于XML配置的AOP,其实Spring本身提供了aop框架,但是AspectJ更方便.
在Spring中启用AspectJ注解支持
-
使用条件:
1.要在Spring中使用AspectJ注解,必须在classapth下包含AspectJ类库(aopalliance.jar,aspectj.weaver.jar,spring-aspects.jar)
2.将aopSchema添加上到根元素中。
3.要在SpringIOC容器中启用AspectJ注解支持,只要在Bean配置文件定义一个空的xmL元素aop:aspectjautoproxy
4.当SpringIOC容器侦测到Bean配置文件中的aop:aspectjautoproxy元素时,会自动为与AspectJ切面匹配的Bean创建处理 -
步骤:
1.添加@Component(只要是可以被context:component-scan扫描到的组件注释即可),因为切面(上一篇笔记记载过)说白了也是需要被加入到IOC容器的类,所以要加入进去,再添加@aspect这个注释加上表示这个类是一个切面.2.然后在需要的方法上添加注释@before或@after(后置通知即使是方法异常也会继续执行,但不能访问目标方法执行的结果)
例图如下:
-
如果你想要的访问被代理方法的参数或者参数值等:可以用JoinPoint类这个类提供可以访问的方法
-
稍微讲一下原理(视频里的搬运):当指定方法beforeMethod()执行的时候,他会检测before注解里的内容标记的方法,会自动为这个方法的类生成代理对象,在调用这个方法执行之前,将beforeMethod()这个方法加入到在代理对象之前.
-
注意:before的参数可以是:
*
3.然后在bean添加(这里我遇到了一个问题,就是无法找到元素 ‘aop:aspectj-autoproxy’ 的声明):
解决问题的方法就是:我的xml文件中配置错误,他是自己注入的aop的命名空间,但是问题出在哪里我也不知道,然后百度呗,这样就好了
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
">
解决的问题的出处在这里:https://blog.youkuaiyun.com/u010004317/article/details/47700447?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
其他通知:
- 返回通知:
result可以返回方法的返回值
- 异常通知
ex可以指定特定的异常
3.环绕通知 :通知的执行顺序: