注意
此时切入点类,通知方法工厂类已经完全准备完毕
引入依赖
切入点表达式的依赖
bean.xml文件的配置
1.将连接点类和通知工厂类都写入ioc容器中,都交给spring管理
2.开始配置aop
1》.aop:config:该标签表示开始配置aop
2》.aop:aspect:该标签表示配置切面
id:该切面的唯一标识
ref:通知类的bean id
3》.aop:before 配置通知类的类型为在切入点之前
method:通知方法
pointcut:制定切入点方法的表达式
切入表达式
关键字:execution(表达式)
表达式格式
访问修饰符 返回值 方法权限定名称(参数列表)
切入点表达式
1.访问修饰符可省略
void com.gaipian.service.impl.AccountService.saveAccount()
2.返回值可以使用通用配符*,表示任何返回值都可以使用
* com.gaipian.service.impl.AccountService.saveAccount()
3.包名可以使用通配符,将每一级的包名都换成*才可以
* *.*.*.*.AccountService.saveAccount()
第二种写发..表示当前包及其子包都适配
* *..AccountServiceImpl.saveAccount()
4.类名和方法名都可以用* 实现同配
* *..*.*()
5.参数列表
基本类型:直接写类型名称即可 比如int
引用类型需要写权限定类名称
*:表示此参数可以为任何类型(必须要有一个参数)
..:表示参数可有可无,并且参数也为任何类型
* *..*.*(..):最终当前目录下任何包方法都将被作为切入点
6.开发中的写法(制定到sevice业务层下即可)
* com.gaipian.service.*.*(..)
通知四大类型注解
1.前置通知:before
在切入点之前执行
2.后置通知:before-returning
在切入点之后执行
3.异常通知:after-throwing
产生异常执行
4.最终通知:after
最后执行,无论怎样都会执行
注意:异常通知和后置通知最后都只能执行一个
配置切入点表达式
可以使用aop:pointcut配置切面表达式
aop:pointcut
id:该表达式唯一id
expression:且面表达式
写法:expression=“execution(表达式)”
通知标签引入方式:
pointcut-ref=“切面表达式唯一id”
注意:当该表达式定义在aop:aspect内部的时候,只有当前切面可用,但是当标签定义在aspect外部时,所有的切面都可以引用
但是必须要定义在所有切面之前,因为约束规则是这样。
环绕通知
1.配置在aop:aspect标签内部
<aop:around method="通知类中的环绕方法“ pointcut-ref=”切入点表达式“></aop:around>
2.产生的问题:
配置环绕通知后,切入点方法没有执行,环绕通知方法却执行了。
3.产生问题的原因:
通过对比下面两张图片,一个是使用xml配置的环绕方法,一个是使用手动动态代理写出的环绕方法,我们发现我们配置的环绕方法没有绿色箭头
中所谓的引用原方法。
4.解决方式
spring框架为我们提供了一个接口ProceedingJoinPoint,该接口有一个方法proceed(),该方法的作用就是调用切入点方法。
该接口可以作为环绕通知的方法参数,程序运行时,spring框架会为我们提供该接口的实现类供我们使用。
5.扩展
spring框架为我们提供的一种可以在代码中手动控制增强方法何时执行的方式。因此我们可以在使用环绕中使用其他的四大类型。