Spring AOP配置之注解方式
使用注解配置AOP的实现步骤
- 在pom.xml文件中导入所需的依赖
- 在配置文件中开启AOP注解支持
- 配置切面类@Aspect
- 配置切入点@pointcut
- 配置通知方法,并为通知方法配置通知类型@Before…
使用注解
-
@Aspect
-
作用位置:作用于类上。
-
作用:设定当前类为切面类。
-
格式
@Aspect public class AopAdvice { }
-
-
@Pointcut
-
作用位置:作用于方法上
-
作用:使用当前方法的方法名,作为切入点的引用名称。
-
格式
@Pointcut("execution(* *(..))") public void pt() { }
-
说明
被修饰的方法忽略其业务功能,格式设定为无参无返回值的方法,方法体内空实现(非抽象)
-
-
@Before
-
作用位置:作用于方法上
-
作用:标记当前方法作为前置通知
-
格式
在注解中,要引用切入点名称,也就是使用@Pointcut配置的方法名。
@Before("pt()") public void before(){ }
-
-
@AfterReturning
-
作用位置:作用于方法上
-
作用:标记当前方法作为后置通知
-
格式
在注解中,要引用切入点名称,也就是使用@Pointcut配置的方法名。
@AfterReturning(value="pt()",returning = "ret") public void afterReturning(Object ret) { }
-
特殊参数
returning:设定使用通知方法参数接收返回值的变量名。
-
-
@AfterThrowing
-
作用位置:作用于方法上
-
作用:标记当前方法作为异常通知
-
格式
在注解中,要引用切入点名称,也就是使用@Pointcut配置的方法名。
@AfterThrowing(value="pt()",throwing = "t") public void afterThrowing(Throwable t){ }
-
特殊参数
throwing :设定使用通知方法参数接收原始方法中抛出的异常对象名
-
-
@After
-
作用位置:作用于方法上
-
作用:标记当前方法作为最终通知
-
格式
在注解中,要引用切入点名称,也就是使用@Pointcut配置的方法名。
@After("pt()") public void after(){ }
-
-
@Around
-
作用位置:作用于方法上
-
作用:标记当前方法作为环绕通知
-
格式
在注解中,要引用切入点名称,也就是使用@Pointcut配置的方法名。
@Around("pt()") public Object around(ProceedingJoinPoint pjp) throws Throwable { //执行原始方法 Object ret = pjp.proceed(); return ret; }
-
配置AOP实例
-
普通类
@Component public class Demo { public void test1() { System.out.println("测试方法1!"); } public void test2() { System.out.println("测试方法2!"); } }
-
切面类
/** * @Aspect 注明此类是一个切面类 */ @Aspect @Component public class Aop { /** * 配置切入点 */ @Pointcut("execution(* com.itheima..*.*(..))") public void pt() { } /** * 配置前置通知 */ @Before("pt()") public void before() { System.out.println("前置通知......"); } }
-
xml配置
要将普通类和切面类都配入spring容器,所以要开启组件扫描和aop注解支持
<!--配置组件扫描器--> <context:component-scan base-package="com.itheima"/> <!--开启AOP注解驱动支持--> <aop:aspectj-autoproxy />
-
或者使用注解方式(去掉xml配置文件)
//表明此类是spring的配置类 @Configuration //主键扫描 @ComponentScan("com.itheima") //启用aop注解驱动 @EnableAspectJAutoProxy public class SpringConfig { }
-
测试
@RunWith(SpringJUnit4ClassRunner.class) //加载上下文配置 @ContextConfiguration(classes = SpringConfig.class) public class Test2 { @Autowired private Demo demo; @Test public void AopTest() { demo.test1(); } }
- AOP使用XML配置情况下,通知的执行顺序由配置顺序决定,在注解情况下由于不存在配置顺序的概念
的概念,参照通知所配置的方法名字符串对应的编码值顺序,可以简单理解为字母排序- 同一个通知类中,相同通知类型以方法名排序为准
- 不同通知类中,以类名排序为准
- 使用@Order注解通过变更bean的加载顺序改变通知的加载顺序
- 企业开发经验
- 通知方法名由3部分组成,分别是前缀、顺序编码、功能描述
- 前缀为固定字符串,例如baidu、itheima等,无实际意义
- 功能描述为该方法对应的实际通知功能,例如exception、strLenCheck
- 控制通知执行顺序使用顺序编码控制,使用时做一定空间预留
- 003使用,006使用,预留001、002、004、005、007、008
- 使用时从中段开始使用,方便后期做前置追加或后置追加
- 最终顺序以运行顺序为准,以测试结果为准,不以设定规则为准