2016/1/18 11:44:08
1.AspectJ
- @AspectJ的风格类似纯Java注解的普通Java类
- Spring可以使用AspectJ来做切入点解析
- AOP的运行时仍旧是纯的Spring AOP,对AspectJ的编译器或者织入无依赖性
- @AspectJ切面使用@Aspect注解配置,拥有@Aspect的任何bean将被Spring自动识别注册并应用
- 用@Aspect注解的类可以有方法和字段,它们也可能包括切入点(pointcut),通知(advice),和引入(Introduction)声明
- Aspect注解是不能通过类路径自动检测发现的,所以需要配合使用@Component注释或者在xml配置bean
- 一个类中的@Aspect注解标识它为一个切面,并且将自己从自动代理中排除
2.切入点的定义
- 一个切入点可以通过一个普通的方法定义来提供,并且切入点表达式使用@Pointcut注解,方法返回类型必须为void
- 环绕通知使用@Around注解来声明,通知方法的第一个参数必须是ProceedingJoinPoint类型
在通知内部调用ProceedingJoinPoint的proceed()方法会导致执行真正的方法,传入一个Object[]对象,数组中的值将被做为参数传递给方法
@Aspect public class AspectClass { // 配置前置通知 @Before("execution(* com.lovo.inter..*.t*(..))") public void beforeMethod() { System.out.println("执行beforeMethod方法"); } // 配置后置通知 @After("execution(* com.lovo.inter..*.t*(..))") public void afterMethod() { System.out.println("执行after方法"); } // 配置环绕通知 @Around("execution(* com.lovo.inter..*.g*(..))") public Object press(ProceedingJoinPoint point) { System.out.println("环绕执行前"); Object returnObj = null; try { returnObj = point.proceed(); } catch (Throwable e) { e.printStackTrace(); } System.out.println("环绕执行后"); return returnObj; } }