Spring 框架提供了 AOP 的丰富支持,允许开发人员通过分离应用程序的业务逻辑与横切关注点从而进行内聚性的开发。举例来说,日志记录,性能统计,安全控制,事务处理,异常处理,这些称之为横切关注点的功能,对于应用程序来说是必须的。AOP 允许将这些横切关注点从业务逻辑代码中划分出来,从而改变这些横切关注点的代码不影响业务逻辑的代码。
AOP 的核心概念
我们先来看一下 AOP 涉及的几个核心概念。
1. Aspect
Aspect 是一个类,这个类实现上述横切关注点的功能,例如日志记录,事务处理,等。
2. Join Point
Join point 是程序中某个执行点,例如方法执行,属性访问等。对于 Spring AOP 来说,join point 通常是指方法执行。
3. Advice
Advice 是指在某个特定 join point 执行的动作,当某个 join point 匹配 pointcut 时,advice 指定的方法会被执行。
4. Pointcut
Pointcut 是一个表达式,当 join point 匹配 pointcut 的表达式时,advice 指定的方法就会被执行。
AOP Advice 类型
以执行的时间点划分,可以将 advice 划分为以下几种类型。
1. Before Advice
Before advice 是指 advice 在一个方法执行之前执行,可以使用@Before注解来将一个 advice 标记为 before advice。
2. After Advice
After advice 是指 advice 在一个方法执行之后执行(不管这个方法是正常执行还是抛出异常),可以使用@After注解来将一个 advice 标记为 after advice。
3. After Returning Advice
After returning advice 是指 advice 在一个方法在正常执行完毕后执行,可以使用@AfterReturing注解来标记一个方法为 after returning advice。
4. After Throwing Advice
After throwing advice 是指 advice 在一个方法抛出异常后执行,可以在 advice 中处理回滚等操作。可以使用@AfterThrowing注解来将一个方法标记为after throwing advice。
publicclassLogging { /** * This is the method which I would like to execute * before a selected method execution. */ publicvoidbeforeAdvice(){ System.out.println("Going to setup student profile."); } /** * This is the method which I would like to execute * after a selected method execution. */ publicvoidafterAdvice(){ System.out.println("Student profile has been setup."); } /** * This is the method which I would like to execute * when any method returns. */ publicvoidafterReturningAdvice(Object retVal){ System.out.println("Returning:" + retVal.toString() ); } /** * This is the method which I would like to execute * if there is an exception raised. */ publicvoidAfterThrowingAdvice(IllegalArgumentException ex){ System.out.println("There has been an exception: " + ex.toString()); } }