使用Aspectj框架进行AOP切面开发。
首先需要导入两个Jar包:
1. aspectjrt.jar
2. aspectjweaver-XXX.jar
Aspectj支持的五种注解:
- @Before: 前置通知, 在方法执行之前执行
- @After: 后置通知, 在方法执行之后执行
- @AfterReturning: 返回通知, 在方法返回结果之后执行
- @AfterThrowing: 异常通知, 在方法抛出异常之后
- @Around: 环绕通知, 围绕着方法执行
下面将使用两种方式进行开发。
形式一 : 使用注解形式结合Spring,
切面:AudienceAdvice类
@Aspect
public class AudienceAdvice {
/**
* 1> execution() : 指明一个表达式
* 2> * *..UserService.*(..): 表达式说明
* (1) * : 修饰符 --> 例如:public 或public void
* (2) *. : 任意包名或子包名
* (3) .UserService : 该切面只对UserService接口生效
* (4) .* : 所有的方法
* (5) (..) :方法可以有任意参数
*
* 作用:任意包下的UserServiceImpl的任意方法,触发此AOP切面
* 3> 表达式可以只写一次,当其他注解继续引用此表达式时,
* 直接引用写了表达式的方法名即可
* 例如: init() 方法 和 after() 方法的注解形式
* */
@Pointcut("execution(* *..UserService.*(..))")
public void init(){};
/**
* 之后
*/
@After("init()")
public void after(){
System.out.println("after");
}
/**
* 之前
*/
@Before("init()")
public void before(){
System.out.println("before");
}
/**
* 环绕
*/
@Around("init()")
public void around(ProceedingJoinPoint jp){
System.out.println("before");
try {
//执行方法
jp.proceed();
} catch (Throwable e) {
e.prin