注解开发AOP制作步骤
- 在XML格式基础上
- 导入坐标(伴随spring-context坐标导入已经依赖导入完成)
- 开启AOP注解支持
- 配置切面@Aspect
- 定义专用的切入点方法,并配置切入点@Pointcut
- 为通知方法配置通知类型及对应切入点@Before
在applicationContext.xml里添加标签,开启aop注解支持
在AOPAdvice里添加注解
运行程序可见正常运行
修改AOPAdvice内容
运行可见结果
如果在AOPAdvice里添加@Component
则可删除applicationContext.xml里的选中行
然后在UserServiceImpl里添加@Service
在xml里添加扫描器
删除bean标签
这样运行后结果依然正确
注解开发AOP注意事项
- 切入点最终体现为一个方法,无参无返回值,无实际方法体内容,但不是是抽象方法
- 引用切入点时必须使用方法调用名称,方法后面的()不能省略
- 切面类中定义的切入点只能在当前类中使用,如果想引用其他类中定义的切入点使用“类名.方法名()”引用
- 可以在通知类型注解后添加参数,实现XML配置中的属性,例如after-returning后的returning属性
新建AOPPointcut.java
将AOPAdvice里的内容改成如图
可见正常运行
AOP注解详细
- 名称:@Aspect
- 类型:注解
- 位置:类定义上方
- 作用:设置当前类为切面类
- 格式:
@Aspect
public class AopAdvice{
}
- 说明:一个beans标签中可以配置多个aop:config标签
AOP注解详细
- 名称:@Pointcut
- 类型:注解
- 位置:方法定义上方
- 作用:使用当前方法名作为切入点引用名称
- 格式:
@Pointcut("execution(* *(..))")
public void pt(){
}
- 说明:被修饰的方法忽略其业务功能,格式设定为无参无返回值的方法,方法体内空实现(非抽象)
AOP注解详细
- 名称:@Before
- 类型:注解
- 位置:方法定义上方
- 作用:标注当前方法为前置通知
- 格式:
@Before("pt()")
public void before(){
}
- 特殊参数:
- 无
AOP注解详细
- 名称:@After
- 类型:注解
- 位置:方法定义上方
- 作用:标注当前方法为后置通知
- 格式:
@After("pt()")
public void after(){
}
- 特殊参数:
- 无
AOP注解详细
- 名称:@AfterReturning
- 类型:注解
- 位置:方法定义上方
- 作用:标注当前方法为返回后通知
- 格式:
@AfterRetruning(value="pt()",returning="ret")
public void afterRetruning(Object ret){
}
- 特殊参数:
- returning:设定使用通知方法参数接收返回值的变量名
AOP注解详细
- 名称:@AfterThrowing
- 类型:注解
- 位置:方法定义上方
- 作用:标注当前方法为异常后通知
- 格式:
@AfterThrowing(value="pt()",throwing="t")
public void afterthrowing(Throwable t){
}
- 特殊参数:
- throwing:设定使用通知方法参数接收原始方法中抛出的异常对象名
AOP注解详细
- 名称:@Around
- 类型:注解
- 位置:方法定义上方
- 作用:标注当前方法为环绕通知
- 格式:
@Around("pt()")
public void around(ProceedingJoinPoint pjp) throws Throwable{
Object ret = pjp.proceed();
return ret;
}
- 特殊参数:
- 无
@Aspect
@Component
@After
@AfterThrowing
@AfterReturning
@Before
@Pointcut
AOP注解开发通知执行顺序控制(了解)
- AOP使用XML配置情况下,通知的执行顺序由配置顺序决定,在注释情况下由于不存在配置顺序的概念,参照通知所配置的方法名字符串对应的编码值顺序,可以简单理解为字母排序
- 同一个通知类,相同通知类型以方法名排序为准
- 不同通知类中,以类名排序为准
- 使用@Order注解通过变更bean的加载顺序改变通知的加载顺序
- 企业开发经验
- 通知方法名由3部分组成,分别是前缀、顺序编码、功能描述
- 前缀为固定字符串,例如baidu、thenema等,无实际意义
- 顺序编码为6位以内的整数,通常3位即可,不足位补0
- 功能描述为该方法对应的实际通知功能,例如exception、strLenCheck
- 控制通知执行顺序使用顺序编码控制,使用时做一定空间预留
- 003使用,006使用,预留001,002,004,005,007,008
- 使用时从中段开始使用,方便后期做前置追加或后置追加
- 最终顺序以运行顺序为准,以测试结果为准,不以设定规则为准
AOP注解通知执行顺序
AOP注解驱动
- 名称:@EnableAspectJAtuoProxy
- 类型:注解
- 位置:Spring注解配置类定义上方
- 作用:设置当前类开启AOP注解驱动支持,加载AOP注解
- 格式:
@Configuration
@ComponentScan("com.thenema")
@EnableAspectJAutoProxy
public class SpringConfig{
}