Spring AOP

本文内容纲要:Spring AOP

AOP中的概念

Aspect(切面):指横切性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面是横切性关注点的抽象(包括切入点的描述和通知的描述)。

Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,

因为spring只支持方法型的连接点,实际上joinpoint还可以是field或者构造器。

Pointcut(切入点):所谓切入点是指我们要对那些joinpoint进行拦截的定义。

Advice(通知):所谓通知是指拦截到jointpoint之后所要做的事情就是通知。通知分为前置通知、后置通知、异常通知、最终通知、环绕通知。

Target(目标对象):代理的目标对象

Weave(织入): 指将aspects应用到target对象并导致proxy对象创建的过程称为织入

Introducton(引入):在不修改类代码的前提下,Introduction可以在运行期为类动态地添加一些方法或Field

Spring提供了两种切面使用方式,实际工作中我们可以选用其中一种:

1 基于xml配置方式进行AOP开发

2 基于注解方式进行AOP开发

(一)基于注解的方式

下面是基于注解的方式

Java代码

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  7. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
  8. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
  9. aop:aspectj-autoproxy/

Java代码

  1. import org.aspectj.lang.ProceedingJoinPoint;
  2. import org.aspectj.lang.annotation.After;
  3. import org.aspectj.lang.annotation.AfterReturning;
  4. import org.aspectj.lang.annotation.AfterThrowing;
  5. import org.aspectj.lang.annotation.Around;
  6. import org.aspectj.lang.annotation.Aspect;
  7. import org.aspectj.lang.annotation.Before;
  8. import org.aspectj.lang.annotation.Pointcut;
  9. import org.springframework.stereotype.Component;
  10. @Aspect @Component
  11. public class MyInterceptor {
  12. /**
  13. *@Pointcut :表示规定切入点
  14. *execution() 语法规范
  15. * 第一个“*”表示任意返回结果类型
  16. * “cn.itcast.service.impl.PersonServiceBean”:表示对此类进行拦截,
  17. * 如果是cn.itcast.service..*.*:表示对包cn.itcast.service以及子包里所
  18. 有的类的所有方法进行拦截,
  19. * (..)表示参数
  20. */
  21. @Pointcut("execution(* com.mingbai.springaop.PersonServiceBean.*(..))")
  22. private void anyMethod(){}//声明一个切入点
  23. /* @Before("anyMethod()")
  24. public void doAccessCheck(){
  25. System.out.println("前置通知");
  26. }*/
  27. //此时的前置通知,只能拦截到参数个数和类型匹配的方法
  28. //args(name)中的name必须和方法doAccessCheck的参数一至
  29. @Before("anyMethod() && args(name)")
  30. public void doAccessCheck(String name){
  31. System.out.println(name+"前置通知");
  32. }
  33. /* @AfterReturning("anyMethod()")
  34. public void doAfterReturn(){
  35. System.out.println("后置通知");
  36. }*/
  37. //得到方法的返回值
  38. @AfterReturning(pointcut="anyMethod()",returning="result")
  39. public void doAfterReturn(String result){
  40. System.out.println("后置通知 "+result);
  41. }
  42. @After("anyMethod()")
  43. public void doAfter(){
  44. System.out.println("最终通知");
  45. }
  46. /* @AfterThrowing("anyMethod()")
  47. public void doAfterThrow(){
  48. System.out.println("异常通知");
  49. }*/
  50. @AfterThrowing(pointcut="anyMethod()",throwing="e")
  51. public void doAfterThrow(Exception e){
  52. System.out.println("异常通知------"+e.getMessage());
  53. }
  54. @Around("anyMethod()")
  55. public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
  56. System.out.println("环绕通知 开始");
  57. Object obj = pjp.proceed();
  58. System.out.println("环绕通知 结束");
  59. return obj;
  60. }
  61. }

(二)基于xml配置文件的

切面只是一个普通的javabean

Java代码

  1. import org.aspectj.lang.ProceedingJoinPoint;

  2. public class MyInterceptor1 {

  3. public void doAccessCheck(){

  4. System.out.println("前置通知-------");

  5. }

  6. public void doAfterReturn(){

  7. System.out.println("后置通知");

  8. }

  9. public void doAfter(){

  10. System.out.println("最终通知");

  11. }

  12. public void doAfterThrow(){

  13. System.out.println("异常通知");

  14. }

  15. public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{

  16. System.out.println("环绕通知 开始");

  17. Object obj = pjp.proceed();

  18. System.out.println("环绕通知 结束");

  19. return obj;

  20. }

  21. } 配置文件 :

    Java代码

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns:context="http://www.springframework.org/schema/context"
    4. xmlns:aop="http://www.springframework.org/schema/aop"
    5. xmlns:tx="http://www.springframework.org/schema/tx"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans
    7. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
    9. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
    10. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
    11. [color=brown]
    12. aop:config
    13. <aop:aspect id="asp" ref="myInterceptor">
    14. <aop:pointcut id="mycut" expression="execution(!void com.mingbai.springaop.*.*(..))"/>
    15. <aop:before pointcut-ref="mycut" method="doAccessCheck"/>
    16. <aop:after-returning pointcut-ref="mycut" method="doAfterReturn"/>
    17. <aop:after pointcut-ref="mycut" method="doAfter"/>
    18. <aop:after-throwing pointcut-ref="mycut" method="doAfterThrow"/>
    19. <aop:around pointcut-ref="mycut" method="doBasicProfiling"/>
    20. </aop:aspect>
    21. </aop:config>
回到顶部