1.AspectJ(spring集成)
execution 用于匹配方法执行的连接点
全限定方法名
访问修饰符 返回值 包名.包名.包名.类名.方法名(参数列表)
全匹配方式:
public void com.jinkai.service.impl.AccountServiceImpl.saveAccount()
访问修饰符可以省略
void com.jinkai.service.impl.AccountServiceImpl.saveAccount()
返回值可以使用*,表示任意返回值
* com.jinkai.service.impl.AccountServiceImpl.saveAccount()
包名可以使用".."表示当前包及其子包
* com.jinkai.service..AccountServiceImpl.saveAccount()
类名和方法名,都可以使用*,表示任意类,任意方法
* com.jinkai.service.impl.*.*()
参数列表,可以使用具体类型
基本类型直接写类型名称 : int
引用类型必须写全限定类名:java.lang.String
参数列表可以使用*,表示任意参数类型,但是必须有参数
* com.jinkai.service.impl.AccountServiceImpl.saveAccount(*)
参数列表可以使用..,表示有无参数均可。有参数可以是任意类型
* com.jinkai.service.impl.AccountServiceImpl.saveAccount(..)
全通配方式:
* *..*.*(..)
开发中常用写法:
* com.jinkai.service..*.*(..)
2.aop:config标签
作用: 用于表示开始aop的配置
出现位置:写在beans标签的内部
属性:proxy-target-class:用于指定代理方式。默认值是false。当取值为true时,采用cglib的代理方式。
expose-proxy:用于指定是否暴露代理对象,通过AopContext可以进行访问代理对象。
3.aop:aspect标签
作用:用于配置切面。
出现位置:aop:config标签内部。
属性:
id:用于指定切面的唯一标识。
ref:用于指定引用bean的id。
order:用于指定多个切面中,相同通知类型的执行顺序。取值是个整数,数值越小优先级越高
4.aop:pointcut标签
作用:用于配置通用切入点表达式
出现位置:
aop:config标签内部,当出现在此处时,要求必须在所有aop:aspect标签之前。它可以供所有切面使用
aop:aspect标签内部,当出现在此处时,它没有顺序要求,但只能供当前切面使用。
5.配置SpringAOP使用Cglib代理模式
第一种
第二种
6.五种通知类型(细节以后再弄)
<!--配置service-->
<bean id="accountService" class="com.jinkai.service.impl.AccountServiceImpl"></bean>
<!--把通知bean交给spring来管理-->
<bean id="logUtil" class="com.jinkai.utils.LogUtil"></bean>
<!--开始aop的配置-->
<aop:config>
<!--配置通用的切入点表达式-->
<aop:pointcut id="pt1" expression="execution(* com.jinkai.service.impl.*.*(..))"></aop:pointcut>
<!--配置切面-->
<aop:aspect id="logAdvice" ref="logUtil">
<!--配置前置通知-->
<aop:before method="beforePrintLog" pointcut-ref="pt1"/>
<!--配置后置通知-->
<aop:after-returning method="afterReturningPrintLog" pointcut-ref="pt1" returning="rtValue" />
<!--配置异常通知-->
<aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="pt1" throwing="e" />
<!--配置最终通知-->
<aop:after method="afterPrintLog" pointcut-ref="pt1"/>
</aop:aspect>
</aop:config>